1. 程式人生 > >Activity A啟動Activity B,在B中按Home回到主螢幕,按menu時呈現後臺app任務列表,如何讓剛退出的app的介面顯示為A,而不是退出時的B

Activity A啟動Activity B,在B中按Home回到主螢幕,按menu時呈現後臺app任務列表,如何讓剛退出的app的介面顯示為A,而不是退出時的B

先把實現方法說在最前:

要實現這個功能,最快捷方法就是在配置檔案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,也是程式入口

public 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 B
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()會一直退不出程式
	}
}
後來想到了activity棧,是不是每次home鍵退出再進時就會又壓一個activity棧呢?這樣就解釋了n次home鍵後要n次back鍵才退出程式

看了後明白問題出在哪裡,就像那篇文章所說的,預設是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>