Activity A啟動Activity B,在B中按Home回到主螢幕,按menu時呈現後臺app任務列表,如何讓剛退出的app的介面顯示為A,而不是退出時的B
阿新 • • 發佈:2019-01-31
先把實現方法說在最前:
要實現這個功能,最快捷方法就是在配置檔案AndroidManifest.xml中,在Activity A新增一句
android:launchMode="singleTask"
最初我是往Activity的生命週期方面想的,因為在B中按Home回到主螢幕,就會呼叫Activity B的生命週期中的onPause()和onStop()方法,這時B還沒destroy,如果在進app的話會依次呼叫B的onRestart(),onStart(),onResume()方法
因此我一開始是重寫B的onRestart()方法,當呼叫它時就會跳到Activity A,這樣就達到效果。
一開始是成功的,按Home退出後再進能回到A,但是仔細測試後發現在A按Back鍵不能一次性退出程式。後來試過一些方法,重寫過BACK返回鍵都不能完整退出,會出現在A按BACK後,還是回到A
再後來,發現每次在B按HOME後再進app,就要多按BACK退出一次。例如啟動程式後,A啟動B,B按HOME,再進app,再啟動B,再按HOME,再進app……以上步驟重複N次後,最後再A想要退出的話,要按N次BACK鍵才能退出應用,程式碼如下
這是Activity A,也是程式入口
下面是Activity Bpublic class MainActivity extends Activity { private Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.Button01); b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } }
後來想到了activity棧,是不是每次home鍵退出再進時就會又壓一個activity棧呢?這樣就解釋了n次home鍵後要n次back鍵才退出程式public class SecondActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.secondactivity);// } public void onRestart() { System.out.println("second activity: onRestart()"); Intent intent = new Intent(SecondActivity.this, MainActivity.class); startActivity(intent); super.onRestart(); finish();//如果不加finish()會一直退不出程式 } }
看了後明白問題出在哪裡,就像那篇文章所說的,預設是standard,不停退出再進,就會不停產生新的Activity A例項,也就是不停將新的Activity A壓入棧內
解決方法就是使用singleTask,把Activity A之上的通通出棧,這樣棧頂就是Activity A了,也就達到效果,也不需要重寫onRestart方法
AndroidManifest程式碼:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.androidtest.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.androidtest.SecondActivity"></activity>
</application>
</manifest>