最近重看《Android開發藝術探索》一書,其中第3頁Activity
生命周期onPause
到onResume
過程的確如作者所說“在一般的開發中用不上”,但是作為開發者還是有研究的必要。
onResume
的狀態是Activity
前臺可見正在活動,onPause
是置于前臺可見停止活動。從后者到前者的變化場景,可以通過一個透明的Dialog
彈出遮蔽MainActivity
重現。
不過,這是個“特殊”的Dialog
。一般Dialog
彈出時,背景可見MainActivity
依然是onResume
,表明這個Activity
的生命周期并沒有因為這個Dialog
的彈出而變化。
但是,我們使用Activity
實現一個Dialog
時,由于是MainActivity
啟動DialogActivity
,所以MainActivity
生命周期必然會變化。
MainActivity.java代碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 圖方便直接給findViewById加監聽
findViewById(R.id.btn_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, DialogActivity.class);
startActivity(i);
}
});
System.out.println("onCreate");
}
// 實現所有生命周期方法Log
@Override
protected void onStart() {
super.onStart();
System.out.println("onStart");
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("onRestart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}
}
MainActivity.java對應activity_main.xml
Button
只是用來啟動Dialog_Activity
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</RelativeLayout>
DialogActivity.java代碼
public class DialogActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_dialog);
// 這里圖個方便直接給findViewById加監聽
findViewById(R.id.returnButton).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DialogActivity.this.finish();
}
});
}
}
test_dialog.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/returnButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="點擊退出"/>
</LinearLayout>
AndroidManifest.xml
注意!!! DialogActivity
使用的主題是@android:style/Theme.Dialog
,不然上面的代碼就白瞎了
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.phantomvk.exampleapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".DialogActivity"
android:theme="@android:style/Theme.Dialog"/>
</application>
</manifest>
下面是結果
// MainActivity到可見可操作的三個周期變化
12-16 23:59:35.806 7477-7477/com.phantomvk.exampleapp I/System.out: onCreate
12-16 23:59:35.811 7477-7477/com.phantomvk.exampleapp I/System.out: onStart
12-16 23:59:35.811 7477-7477/com.phantomvk.exampleapp I/System.out: onResume
// 點擊Button后,MainActivity僅僅是暫停(onPause),沒有去停止(onStop)
12-16 23:59:50.731 7477-7477/com.phantomvk.exampleapp I/System.out: onPause
// 在DialogActivity里面退出,MainActivity狀態變為onResume
12-17 00:00:00.161 7477-7477/com.phantomvk.exampleapp I/System.out: onResume
// 退出應用: onPause -> onStop -> onDestroy
12-17 00:00:30.576 7477-7477/com.phantomvk.exampleapp I/System.out: onPause
12-17 00:00:31.151 7477-7477/com.phantomvk.exampleapp I/System.out: onStop
12-17 00:00:31.151 7477-7477/com.phantomvk.exampleapp I/System.out: onDestroy
上面的代碼已經成功重現MainActivity
里onPause
-> onResume
。
運行截圖如下(配圖比上面代碼多了TextView,不影響)
onPause_onResume.png
提醒一點,直接使用Dialog組件的MainActivity生命周期是不會變化的,這樣應用更加高效且性能更好。這篇文章只是用來重現題目所說的目標,不是用于實踐。