最近重看《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,不影响)
提醒一点,直接使用Dialog组件的MainActivity生命周期是不会变化的,这样应用更加高效且性能更好。这篇文章只是用来重现题目所说的目标,不是用于实践。