2010-07-12 128 views
174

我有一個應用程序,在主頁上我有按鈕用於瀏覽應用程序。如何退出應用程序並顯示主屏幕?

在該頁面上,我有一個「EXIT」按鈕,單擊它時應該將用戶帶到應用程序圖標所在手機的主屏幕。

我該怎麼做?

回答

300

Android的設計並不傾向於選擇退出應用程序,而是由操作系統來管理它。您可以通過其相應的意圖打開主頁應用:

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

:非常感謝你.. – Surej 2011-12-16 10:07:39

+23

你甚至可以使用..「moveTaskToBack(true);」 – 2012-04-04 10:12:53

+0

建議Thanx非常有用 – user1387035 2012-08-27 13:10:50

16

不建議退出您的Android應用程序。有關更多詳細信息,請參閱此question

用戶可以始終通過主頁按鈕退出應用程序,或通過後退按鈕退出第一個活動。

+1

我閱讀該網頁後得到的概念之下。謝謝 – poojan9118 2010-07-13 12:25:05

+3

@janusz:按home鍵永遠不會退出android應用程序,相反它會在後臺... – Jayesh 2013-12-06 12:22:20

18

如果你想結束一個活動,你可以簡單地調用finish()。 然而,在屏幕上有一個退出按鈕是不好的做法。

+2

我用它來「你需要更新這個應用程序到最新版本」,我不希望他們繼續使用它。還是不好的做法...? – beetree 2015-01-02 00:38:57

+0

@beetree是的。就像任何不好的做法一樣,有些情況下這是您唯一的選擇,您可以使用它,因爲嘗試做其他事情將是無意義的。與_illegal syntax_相對的是,它是_bad practice_的一個要點是它可用於少數情況,但您應該嘗試一下,找到一個更好的方法來做到這一點。在你的情況下,沒有一個。 – 2017-12-28 08:01:24

3

當你打電話完成onDestroy()該活動將被調用,它將返回到活動堆棧中的前一個活動...所以..退出不要調用finish();

71

可能是你可以嘗試在我們的應用程序是這樣的

假設,我們有一系列的活動(比如十個),我們需要直接從這個活動中退出。我們可以做的是,創造一個意圖,去根活動,並在意向設置標誌作爲

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

也一樣,布爾添加一些額外的意圖

intent.putExtra("EXIT", true); 

然後在根系活力,檢查boolean的值,並根據該呼叫結束(),在根活動

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

只需在onCreate中不做任何操作即可完成。 – imcaptor 2013-06-18 08:23:40

+2

在我的情況下,我不得不重寫'onNewIntent'。因爲intnet.getExtras()保持爲空。 – zznq 2013-10-03 23:47:56

+0

此方法將重新啓動您的'RootActivity',而不是從堆棧中恢復它。檢查這裏來克服這個http://stackoverflow.com/a/26258455/609782 – Darpan 2014-10-08 13:54:47

26
System.exit(0); 

可能是你在找什麼。它將關閉整個應用程序並將您帶到主屏幕。

+1

如果這是一個小寫出口? – Carol 2012-06-08 04:21:54

+0

不...複製和粘貼爲 – Ndupza 2012-06-09 12:30:38

+1

應該是System.exit(0)。但它無論如何不是很有用。 – 2012-07-20 04:40:35

22

第一飾面的使用方法finish();

,然後你的應用程序添加下面的onDestroy線爲onDestroy()拔出力接近

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

的onDestroy方法,它的作用就像魅力一樣。 – JCasso 2012-12-14 14:51:07

+3

永遠不要使用它,因爲它沒有機會釋放資源 – Jacky 2013-08-13 04:41:02

+1

-1,因爲無論何時離開活動時都會執行onDestroy,而不僅僅是當按下後退鍵時。 – 2013-09-22 12:07:33

0

添加以下finish();後行:

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

我試着使用下面的代碼片段退出應用程序,這對我很有用。希望這可以幫助你。 我做了小的演示用2個活動

第一個活動

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

您的任何其他活動

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

這很適合我。
關閉所有以前的活動如下:

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

然後在MainActivity onCreate()方法添加此完成在MainActivity

setContentView(R.layout.main_layout); 

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

這很棒很好工作 – 2015-09-02 21:58:51

+1

這個!爲我工作,謝謝 – Webserveis 2016-03-19 12:21:53

+0

非常感謝! – Weaboo 2018-01-09 12:01:11

0

我與觀察者模式做到了。

Observer接口

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

基地主題

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

兒童受試者,實現出口方式

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

所有MyApplication您的應用程序應該將其擴展

public class MyApplication extends Application { 

private static ApplicationSubject applicationSubject; 

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

}

基本活動

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

} 

測試一下

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

(我試過以前的答案,但他們在某些方面缺乏。例如,如果您在完成活動後沒有執行return;,則會運行剩餘的活動代碼。你也需要用return來編輯onCreate。如果你不運行super.onCreate(),你會得到一個運行時錯誤)

假設你有MainActivityChildActivity

裏面ChildActivity補充一點:

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

內MainActivity的onCreate補充一點:

@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

一些活動,其實你不想開的時候再重新按下按鈕這樣的閃屏活動,歡迎屏幕活動,確認窗口。其實你不需要這個在活動堆棧中。你可以做到這一點使用=>打開manifest.xml文件,並添加屬性

機器人:noHistory = 「真」

這些活動。

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

OR

有時你想關閉某個後退按鈕按下整個應用程序。這裏最好的做法是打開主窗口,而不是退出應用程序。爲此,您需要重寫onBackPressed()方法。通常這種方法會打開堆棧中的頂級活動。

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

} 

OR

在後退按鈕按下你想退出該活動,你也還不想在活動堆棧中添加此。在onBackPressed()方法內調用finish()方法。它不會關閉整個應用程序。它將用於堆棧中的前一個活動。

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

如果你想退出你的應用程序。然後在按鈕按下事件中使用此代碼。 ,如:

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

這裏就是我所做的:

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

基本上,您所做的是清除堆棧中的所有活動並啓動QuitAppActivity,其唯一的工作是退出應用程序。

如果你想退出應用程序
0

把這個代碼的功能

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); 
} 
相關問題