2010-07-12 31 views

Trả lời

300

Thiết kế của Android không ưu tiên thoát khỏi một ứng dụng theo lựa chọn, mà là quản lý nó theo hệ điều hành. Bạn có thể hiển thị ứng dụng Trang chủ theo Mục đích 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); 
+0

: Cảm ơn bạn rất nhiều .. – Surej

+23

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

+0

Thanx cho đề xuất là rất hữu ích – user1387035

16

Bạn không nên thoát khỏi Ứng dụng Android của mình. Xem chi tiết question để 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 trang chủ hoặc trong hoạt động đầu tiên thông qua nút quay lại.

+1

tôi đã nhận khái niệm sau khi đọc trang đó. cảm ơn – poojan9118

+3

@janusz: nhấn nút trang chủ không bao giờ thoát ứng dụng android, thay vào đó nó chạy trong nền ... – Jayesh

18

Nếu bạn muốn kết thúc hoạt động, bạn có thể chỉ cần gọi finish(). Tuy nhiên, thực hành không tốt để có 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 ...? – beetree

+0

@beetree Có. Giống như bất kỳ thực hành xấu, có những trường hợp mà nó 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 một cái gì đó khác sẽ là vô nghĩa. Điểm của nó là _bad practice_, trái ngược với _illegal syntax_, là nó có sẵn cho vài trường hợp đó, nhưng bạn nên thử darndest của bạn để tìm cách tốt hơn để làm điều đó. Trong trường hợp của bạn, không có một. –

3

Khi u kết thúc cuộc gọi trênDestroy() 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();

71

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 (chẳng hạn mười) và chúng tôi cần phải thoát ra trực tiếp từ hoạt động này. Những gì chúng ta có thể làm là, tạo ra một ý định và đi đến hoạt động gốc và thiết lập cờ trong mục đích như

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

cũng có, thêm một số phụ như boolean đến mục đích

intent.putExtra("EXIT", true); 

Sau đó, trong hoạt động gốc , kiểm tra giá trị của boolean và theo đó kết thúc cuộc gọi(), trong onCreate() của 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 cũng phải ghi đè lên 'onNewIntent'. Bởi vì intnet.getExtras() giữ được null. – zznq

+0

Và phương pháp này sẽ khởi động lại 'RootActivity' thay vì nối lại nó từ ngăn xếp. Kiểm tra tại đây để khắc phục http://stackoverflow.com/a/26258455/609782 – Darpan

26
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

Đây có phải là lối ra chữ thường không? – Carol

+0

Không ... sao chép và dán là – Ndupza

+1

phải là System.exit (0). Nhưng nó không phải là rất hữu ích anyway. –

22

đích đầu tiên ứng dụng của bạn sử dụng phương pháp finish();

và sau đó thêm bên dưới dòng trong onDestroy cho Loại bỏ quân gần

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

+1 hoạt động như một sự quyến rũ. – JCasso

+3

không bao giờ sử dụng điều này, bởi vì nó không có cơ hội để tài nguyên miễn phí – Jacky

+1

-1 vì onDestroy được thực hiện 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. –

0

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

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

tôi đã cố gắng thoát khỏi ứng dụng bằng cách sử dụng đoạn mã sau, điều này làm việc cho 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; 
     } 
    } 
} 
22

này hoạt động tốt đối với tôi.
Đóng tất cả các hoạt động trước đây 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 MainActivity onCreate() phương pháp thêm này để kết thúc MainActivity

setContentView(R.layout.main_layout); 

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

Điều này là rất tốt làm việc tốt –

+1

Điều này! Làm việc cho tôi, cảm ơn – Webserveis

+0

Cảm ơn rất nhiều người! – Weaboo

0

tôi đã làm nó với chế độ quan sát.

giao diện Observer

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

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); 
    } 
} 
} 

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

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

MyApplication mà ứng dụng của bạn nên 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' 
} 
} 
5

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

Giả sử bạn có MainActivityChildActivity.

Bên ChildActivity thêm 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; 

onCreate Bên MainActivity của thêm 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 
} 
16

Một số hoạt động thực sự bạn không muốn mở một lần nữa khi nút quay lại ép như Splash Screen Hoạt động, Chào mừng Hoạt động màn hình, Xác nhận Windows. 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ể làm bằng => mở file manifest.xml này và thêm một thuộc tính

android: noHistory = "true"

để các hoạt động này.

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

HOẶC

Đôi khi bạn muốn đóng toàn bộ ứng dụng trong một số nút quay lại báo chí. Thực hành tốt nhất ở đây là mở cửa sổ nhà thay vì thoát khỏi ứng dụng. Cho rằng bạn cần phải ghi đè lên phương thức BackPressed(). 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

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

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

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

public void onBackPressed() 
{ 
    moveTaskToBack(true); 
    android.os.Process.killProcess(android.os.Process.myPid()); 
    System.exit(1); 
} 
1

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

SomeActivity.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 khỏi ngăn xếp và khởi động QuitAppActivity, công việc duy nhất của chúng là thoát khỏi ứng dụng.

0

nếu bạn muốn thoát khỏi ứng dụng đặ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); 
} 
Các vấn đề liên quan