Làm thế nào để thoát khỏi ứng dụng và hiển thị màn hình chính?


196

Tôi có một ứng dụng trong đó trên trang chủ tôi có các nút để điều hướng thông qua ứng dụng.

Trên trang đó tôi có một nút "THOÁT" mà khi nhấp vào sẽ đưa người dùng đến màn hình chính trên điện thoại có biểu tượng ứng dụng.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


327

Thiết kế của Android không ủng hộ việc thoát khỏi một ứng dụng theo lựa chọn, mà là quản lý nó bởi HĐH. Bạn có thể hiển thị ứng dụng Home bằng Ý định tương ứng của nó:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

25
Bạn thậm chí có thể sử dụng .. "moveTaskToBack (true);"
hemanth kumar

17
nó sẽ xử lý tất cả các nguồn lực? Bởi vì khi tôi thoát ứng dụng theo cách này và sau một thời gian tôi lại nhấp vào biểu tượng ứng dụng. Nó bắt đầu từ nơi tôi rời nó. Điều đó có nghĩa là ứng dụng vẫn đang chạy trong nền.
Adil Malik

12
Hoạt động.finish ();
hB0

11
Điều này giữ cho ứng dụng của bạn ở chế độ nền, vì vậy nó không thoát khỏi ứng dụng.
Herman Schoenfeld

3
Câu trả lời này sẽ chỉ làm cho màn hình chính xuất hiện và sẽ không thoát / đóng ứng dụng hoàn toàn như OP muốn.
Basher51

74

Có thể bạn có thể thử một cái gì đó như thế này

Giả sử trong ứng dụng của chúng tôi, chúng tôi có một số hoạt động (giả sử mười) và chúng tôi cần thoát trực tiếp khỏi hoạt động này. Những gì chúng ta có thể làm là, tạo một ý định và đi đến hoạt động gốc và đặt cờ theo ý định như

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Ngoài ra, thêm một số bổ sung như boolean cho ý định

intent.putExtra("EXIT", true);

Sau đó, trong hoạt động gốc, kiểm tra giá trị của booleanvà theo kết thúc cuộc gọi đó (), trong onCreate()hoạt động gốc

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}

1
Chỉ cần không làm gì trong onCreate để gọi kết thúc.
imcaptor

2
Trong trường hợp của tôi, tôi đã phải ghi đè onNewIntentlà tốt. Bởi vì intnet.getExtras () tiếp tục là null.
zznq

Và phương pháp này sẽ khởi động lại của bạn RootActivitythay vì tiếp tục lại từ ngăn xếp. Kiểm tra tại đây để vượt qua stackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

Có lẽ là những gì bạn đang tìm kiếm. Nó sẽ đóng toàn bộ ứng dụng và đưa bạn đến Màn hình chính.


1
Đó có nên là một lối thoát chữ thường?
Carol

1
nên là System.exit (0). Nhưng dù sao nó cũng không hữu ích lắm.
superarts.org

7
Không nên sử dụng System.exit (0) theo lời khuyên của nhóm Android cốt lõi.
Dinesh Venkata

2
Tôi nghĩ rằng đây là cách tiếp cận tốt nhất cho các trường hợp đặc biệt. Nói cho một ứng dụng cần internet và kết nối phá vỡ một vài hoạt động vào ứng dụng. Một hộp thoại cảnh báo có thể được hiển thị (không có nút). Nút Quay lại cần thoát toàn bộ ứng dụng vì việc nhập lại yêu cầu đăng nhập / khởi tạo lại. System.exit là thứ duy nhất hoạt động hợp lý mà tôi đã tìm thấy. Không chắc chắn về bình luận @ user1699548.
Herman Schoenfeld

1
Điều này sẽ giết tất cả các dịch vụ liên quan đến ứng dụng đó?
bsara

25

Công việc này tốt cho tôi.
Đóng tất cả các hoạt động trước đó như sau:

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

Sau đó, trong phương thức MainActivity onCreate () thêm phần này để hoàn thành MainActivity

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

Điều này không làm việc cho tôi. Nó khiến ứng dụng của tôi không có gì hiển thị, nhưng vẫn chạy một số cách. Tôi có thể thấy các chủ đề treo xung quanh và chờ đợi trong trình gỡ lỗi sẽ không bao giờ thực sự làm bất cứ điều gì.
Stephen M -on đình công-

23

đầu tiên kết thúc ứng dụng của bạn bằng phương thức finish();

và sau đó thêm các dòng dưới đây vào onDestroy để loại bỏ lực lượng đóng

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

3
không bao giờ sử dụng điều này, vì nó không có cơ hội giải phóng tài nguyên
Jacky

1
-1 vì onDestroy được thực thi bất cứ khi nào bạn rời khỏi hoạt động, không chỉ khi nhấn phím quay lại.
Hamzeh Soboh

5
@Jacky: và làm thế nào để giết quá trình không giải phóng bất kỳ tài nguyên hệ thống nào?
Herman Schoenfeld

1
Tại sao là super.onDestroy()sau killProcess()? dòng này thậm chí sẽ đạt được?
shoosh

Điều này cũng không giết tất cả các dịch vụ của bạn?
Irshu

20

Nếu bạn muốn kết thúc một hoạt động, bạn chỉ cần gọi finish(). Tuy nhiên, thực tế là có một nút thoát trên màn hình.


2
Tôi đang sử dụng nó cho "Bạn cần cập nhật ứng dụng này lên phiên bản mới nhất" và tôi không muốn họ tiếp tục sử dụng nó. Vẫn còn thực hành xấu ...?
củ cải đường

@beetree Vâng. Giống như bất kỳ thực hành xấu nào, có những trường hợp đó là lựa chọn duy nhất của bạn và bạn sử dụng nó bởi vì cố gắng làm điều gì đó khác sẽ là vô nghĩa. Điểm quan trọng của nó là thông lệ xấu , trái với cú pháp bất hợp pháp , là nó có sẵn cho một vài trường hợp, nhưng bạn nên thử dùng cách tốt nhất để tìm ra cách tốt hơn để làm điều đó. Trong trường hợp của bạn, không có một.
Vụ kiện của Quỹ Monica

17

Một số Hoạt động thực sự bạn không muốn mở lại khi nhấn nút Quay lại Hoạt động màn hình Splash, Hoạt động màn hình chào mừng, Windows xác nhận. Trên thực tế, bạn không cần điều này trong ngăn xếp hoạt động. bạn có thể thực hiện việc này bằng cách sử dụng => mở tệp manifest.xml và thêm một thuộc tính

android: noHistory = "đúng"

đến những hoạt động này.

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

HOẶC LÀ

Đôi khi bạn muốn đóng toàn bộ ứng dụng trong một số nút quay lại nhất định. Ở đây thực hành tốt nhất là mở cửa sổ nhà thay vì thoát ứng dụng. Cho rằng bạn cần ghi đè phương thức onBackPression (). thông thường phương pháp này mở ra hoạt động hàng đầu trong ngăn xếp.

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

HOẶC LÀ

Trong nút quay lại, bạn muốn thoát khỏi hoạt động đó và bạn cũng không muốn thêm hoạt động này vào ngăn xếp hoạt động. gọi phương thức finish () bên trong phương thức onBackPression (). nó sẽ không đóng toàn bộ ứng dụng. nó sẽ đi cho các hoạt động trước đó trong ngăn xếp.

@Override
public void onBackPressed() {
  finish();
}

16

Không nên thoát Ứng dụng Android của bạn. Xem câu hỏi này để biết thêm chi tiết.

Người dùng luôn có thể thoát ứng dụng của bạn thông qua nút home hoặc trong hoạt động đầu tiên thông qua nút quay lại.


3
@janusz: nhấn nút home không bao giờ thoát khỏi ứng dụng Android, thay vào đó, nó chạy ở chế độ nền ...
Jayesh

5

(Tôi đã thử các câu trả lời trước nhưng chúng thiếu một số điểm. Ví dụ: nếu bạn không thực hiện return;sau khi kết thúc hoạt động, mã hoạt động còn lại sẽ chạy. Ngoài ra, bạn cần chỉnh sửa onCreate bằng return. Nếu bạn không chạy super.onCreate () bạn sẽ gặp lỗi thời gian chạy)

Nói rằng bạn có MainActivityChildActivity.

Bên trong ChildActivity thêm điều này:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

Bên trong MainActivity của onCreate thêm điều này:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}


3

Khi bạn gọi kết thúc, onDestroy () của hoạt động đó sẽ được gọi và nó sẽ quay trở lại hoạt động trước đó trong ngăn xếp hoạt động ... Vì vậy .. để thoát không gọi kết thúc ();


3

Đây là những gì tôi đã làm:

Một sốActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

Về cơ bản những gì bạn đã làm là xóa tất cả các hoạt động từ ngăn xếp và khởi chạy QuitAppActivity, điều đó sẽ hoàn thành nhiệm vụ.


Cách tiếp cận tốt. Không cần truyền giá trị qua Ý định.
dùng3144836

0

Thêm các dòng sau sau finish();trong onDestroy():

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

0

Tôi đã thử thoát ứng dụng bằng cách sử dụng đoạn mã sau, nó hoạt động với tôi. Hy vọng điều này sẽ giúp bạn. tôi đã làm bản demo nhỏ với 2 hoạt động

hoạt động đầu tiên

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

bất kỳ hoạt động nào khác của bạn

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

Tôi đã làm điều đó với chế độ quan sát viên.

Giao diện quan sát

public interface Observer {
public void update(Subject subject);
}

Chủ đề cơ sở

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

Chủ đề con thực hiện phương thức thoát

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

Ứng dụng mà ứng dụng của bạn sẽ mở rộng nó

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

Hoạt động cơ sở

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

hãy kiểm tra nó

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

Nếu bạn muốn thoát ứng dụng, hãy đặt mã này dưới chức năng của bạn

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100% hoạt động tốt. đây là mã để thoát ứng dụng của bạn trên Click (Phương thức)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

Bạn chỉ có thể thêm moveTaskToBack(true)vào nút thoát của onClickedListenermình để thu nhỏ ứng dụng.

Hy vọng nó giúp.


0

Có thể mã của tôi có thể hepls (Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

Nếu bạn muốn thoát khỏi ứng dụng của bạn. Sau đó sử dụng mã này bên trong sự kiện nhấn nút của bạn. giống:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.