如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。
七 、Activity的启动模式
Activity的启动模式是决定生成新的activity实例是否重用已存在的Activity实例,是否和其他Activity实例公用一个栈。在Android12前提供了四种启动模式:(这里的都是没有添加其它参数配置的情况,比如Intent.FLAG_ACTIVITY_NEW_TASK等。)
1、standard:默认启动模式,每次激活activity时,都创建activity实例,并放入任务栈。
2、singleTop: 如果某个Activity自己激活自己,即任务栈栈顶是该Activity,则不需要创建,其余情况都要创建Activity。当从别的Task任务栈切换回当前任务栈时,如果栈顶实例就是同样的Activity,则直接进行复用,并且通过onNewIntent方法进行通知。
3、singleTask:如果要激活的activity在任务栈中,则不需要创建,只需要把这个Activity放入栈顶,并把该Activity以上的Activity实例都出栈。
4、singleInstance:如果不存在包含目标Activity的栈,则创建一个新的Task,这个Task中是目标Activity所独有的,不允许有别的Activity存在,并且只会创建一次,后续如果在启动其它的Activity,这些新的Acitivty属于其原来的task栈。如果存在包含目标Activity的栈,则直接把包含目标Activity的Task栈挪到前台进行显示。
如下图所示,在AndroidManifest文件中Activity节点里增加属性android:launchMode=”xxx” 即可:
但是在Android 12 的时候新加入了singleInstancePerTask类型,所以就有五种了。
5、singleInstancePerTask:如果不存在包含目标Activity的栈,则创建一个新的Task,这个Task中是目标Activity所独有的,并且只会创建一次,后续如果在启动其它的Activity,这些新的Acitivty仍然当前的task栈。如果存在包含目标Activity的栈,则把包含目标Activity的Task栈挪到前台,并且把该栈中目标Activity上面的所有Activity进行出栈操作,从而实现目标Activity显示在前台的效果。(如官方文档所描述,如果启动singleInstancePerTask类型的Activity时,同时设置FLAG_ACTIVITY_MULTIPLE_TASK标记,可以启动多个包含目标Activity的Task栈,这里不过多描述)
如何区分是从栈顶复用还是栈中复用?
答:如果是栈中复用,则onNewIntent方法中,其flags参数中会包含Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT标记。
如果一个Task中的Activity全部出栈,会退到哪里?
答:假设Task1启动了Task2,那么Task2中的Activity如果全部出栈,就会把Task1推到前台,Task1中栈顶的Activity就会被显示。
八、其他
8.1、 Activity跳转方法
1、Activity跳转,无返回结果,直接startActivity(new Intent(当前Activity.this, 下一Activity.class))。
2、Activity跳转,返回数据/结果,使用startActivityForResult (Intent intent, int requestCode),requestCode的值是自定义的,用于识别跳转的目标Activity。
跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!
在setResult后,要调用finish()销毁当前的Activity,否则无法返回到原来的Activity。
接收返回的数据/结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。
8.2、Intent 可以传递的数据类型:
根据上图可以看出,intent 对象可以传递的具体数据类型以及使用的方法。
(1) putExtra( key , value ) 方法
- 可以传递 8 种基本数据类型以及这八种基本数据类型的数组,
- 可以传递 CharSequence以及它的数组,
- 可以传递 Serializable 实现类的对象,
- 可以传递Parcelable 实现类的对象和数组,
- 可以传递Bundle 对象。
- 可以传递Bundle 对象,
- 可以传递Intent 对象。
(3) Intent 也可以直接传递集合
- 传递 Integer类型 的集合可以直接使用:putIntegerArrayListExtra( key,value)
- 传递 String 类型 的集合可以直接使用: putStringArrayListExtra( key , value)
- 传递 CharSequence 类型 的集合可以直接使用: putCharSequenceArrayList( key , value)
- 传递 ** Parcelable 类型** 的集合可以直接使用 :putParcelableArrayList( key,value)
8.3、 多个Activity跳转时的生命周期
在MainActivity启动MainActivity2,然后在MainActivity2点击返回键。
MainActivity | MainActivity2 |
---|---|
onCreate onStart onResume 启动MainActivity2 onPause |
~ |
~ | onCreate onStart onResume |
onStop | ~ |
~ | MainActivity2点击返回键 onPause |
onRestart onStart onResume |
~ |
~ | onStop onDestroy |
原文地址:https://blog.csdn.net/li847250110/article/details/132081323
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_18923.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!