最近在模仿GitHub一个开源项目Musicoco时候发现了manifest中有一个属性”android:parentActivityName” ,经历了百度之后还是发现不是很理解,决定自己探索一番。
还没有很熟悉Activity生命周期的小伙伴耐心看这篇:1.1、Activity的生命周期 - CSDN博客
参考文章:
1.在设置了android:parentActivityName后,点击子Activity返回键,父Activity总会调用OnDestroy()的解决方式 - zhchoutai - 博客园
android:parentActivityName设置了之后,最明显就是当前Activity的bar上面左上角多了一个返回按钮,也就是引用文章说的 “就是为了左上角给子Activity加一个返回button就是为了左上角给子Activity加一个返回button”
但其工作究竟是怎么样子的呢?这里我决定探究一下这些Activity的生命周期
1.清单文件manifest中设置
<activity
android:name=".MainActivity"
android:label="第一个界面">
</activity>
<activity
android:name=".SecondActivity"
android:label="第二个界面"
android:parentActivityName=".MainActivity">
</activity>
<activity
android:name=".ThirdActivity"
android:label="第三个界面">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
这里可以看出 ThirdActivity 作为主程序的入口,SecondActivity 中配置android:parentActivityName 属性,启动模式 launchMode 均为系统默认的 “standard”
2.三个Activity界面都是引用同一个 layout,如下
到时 Java 代码动态改变文字,如下:
btn_click1.setText("前往第2个界面");
btn_click2.setText("前往第3个界面");
3.由于三个界面都需要打印生命周期,代码服用很高,这里我决定抽到 BaseActivity ,以该 Activity 作为他们的父类
public class BaseActivity extends AppCompatActivity {
private final String TAG = this.getClass().getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("activity", TAG + " onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i("activity", TAG + " onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("activity", TAG + " onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("activity", TAG + " onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i("activity", TAG + " onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("activity", TAG + " onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("activity", TAG + " onDestroy");
}
protected void activityStart(Class clz) {
startActivity(new Intent(getApplicationContext(), clz));
}
}
ThirdActivity -> SecondActivity (这里 ThirdActivity 不销毁)-> SecondActivity 返回键
首先启动 ThirdActivity
I/activity: ThirdActivity onCreate
I/activity: ThirdActivity onStart
I/activity: ThirdActivity onResume再启动 SecondActivity (这里 ThirdActivity 不销毁),经历的生命周期变化
I/activity: ThirdActivity onPause
I/activity: SecondActivity onCreate
I/activity: SecondActivity onStart
I/activity: SecondActivity onResume
I/activity: ThirdActivity onStopSecondActivity 返回键
I/activity: SecondActivity onPause
I/activity: ThirdActivity onRestart
I/activity: ThirdActivity onStart
I/activity: ThirdActivity onResume
I/activity: SecondActivity onStop
I/activity: SecondActivity onDestroy
总结可以看出:所经历的不过是两个 Activity 之间切换生命周期变化而已, android:parentActivityName 这个属性没有体现它作用
ThirdActivity -> SecondActivity (这里 ThirdActivity 销毁)-> 返回键
这个走的生命周期跟上面类似,就不探究了,如果你还不明白生命周期的话,看这里:1.1、Activity的生命周期 - CSDN博客
ThirdActivity -> MainActivity (MainActivity的启动模式为standard) -> SecondActivity -> 返回键 -> 返回键
SecondActivity 返回键 ,栈已经有 ThirdActivity,MainActivity,SecondActivity (从下向上)
I/activity: SecondActivity onPause
I/activity: MainActivity onDestroy
I/activity: MainActivity onCreate
I/activity: MainActivity onStart
I/activity: MainActivity onResume
I/activity: SecondActivity onStop
I/activity: SecondActivity onDestroy再一次返回键,还没有按这次返回键之前栈已经有 ThirdActivity,MainActivity
I/activity: MainActivity onPause
I/activity: ThirdActivity onRestart
I/activity: ThirdActivity onStart
I/activity: ThirdActivity onResume
I/activity: MainActivity onStop
I/activity: MainActivity onDestroy
总结:第一次按返回键,MainActivity 经历了先销毁再创建的过程 ,开始我以为 栈内会会有了 MainActivity ,但当我再 MainActivity 按下返回键时候,它居然直接到了 ThirdActivity ,真的很神奇!!!
ThirdActivity -> MainActivity (MainActivity的启动模式为singleTop) -> SecondActivity -> 返回键 -> 返回键
第一次按返回键 ,MainActivity 不会走先销毁再创建的过程 ,这一点很关键
ThirdActivity -> MainActivity (MainActivity的启动模式为singleTop) -> SecondActivity -> ThirdActivity -> SecondActivity ->返回键 -> 返回键
第一次按返回键 ,还没按返回键时候,栈有的Activity有 ThirdActivity(a), MainActivity (b),SecondActivity (c), ThirdActivity (d),SecondActivity (e)
I/activity: SecondActivity onPause
I/activity: ThirdActivity onDestroy
I/activity: SecondActivity onDestroy
I/activity: MainActivity onRestart
I/activity: MainActivity onStart
I/activity: MainActivity onResume
I/activity: SecondActivity onStop
I/activity: SecondActivity onDestroy再按一下回到 ThirdActivity ,再按一下退出应用
相信到这里小伙伴很有疑惑了,按照常理需要连续按五次返回键才可以退出应用,怎么你现在按三下即可了呢?
第一次按返回键 ,ThirdActivity (d)以及 SecondActivity (c) 自动走 onDestroy 销毁了 ,看到 MainActivity 走onRestart -> onResume 方法之前的那两个 onDestroy 就是指这两个啦。之后SecondActivity (c)销毁了 ,所以此时栈还剩下 ThirdActivity MainActivity(从下往上), 再按一下就回到 ThirdActivity ,最后还按一次就退出了。印证了我们只需要按三次即可
总结
- android:parentActivityName 的作用,就是为了左上角给子Activity加一个返回button
- 如果父 Activity 不在当前栈内(没有在当前栈有实例),这个属性不起效
- 如果父 Activity 在当前栈(在当前有实例),设置了该属性,父 Activity 会经历先销毁后创建的过程
- 如果设置父 Activity启动模式为 singleTask 或者 singleTop (两者效果一样的),那么父 Activity 就具有与 singTask 一样清理栈的 作用(清除在父 Activity 之上的那些Activity ),使得 父 Activity 得以重新独占设置与用于交互(可以走 onRsume 方法)