关于android:parentActivityName 探索

最近在模仿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 onStop

  • SecondActivity 返回键

    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 方法)

源码下载:测试android属性parentActivityName源码-CSDN下载

猜你喜欢

转载自blog.csdn.net/simplebam/article/details/79381754