美文网首页
第一章 Activity生命周期全面解析

第一章 Activity生命周期全面解析

作者: 橙子6193 | 来源:发表于2022-02-26 14:21 被阅读0次

1.1.1、Activity生命周期图

image.png

1.1.2、Activity生命周期各个状态

onCreate:表示Activity正在被创建,可以在这个方法中做一些初始化操作,如加载布局,初始化所需数据等
onRestart:表示Activity正在重新启动,当Activity从不可见状态变为可见状态时调用
onStart:Activity可见但还不在前台时调用(此时还不可与用户进行交互
onResume:Activity在前台时调用(此时可以与用户进行交互
onPause:与onResume对应,Activity准备停止时调用,此时可做一些存储数据或停止动画的操作,但不可做太过耗时的操作
onStop:与onStart对应,Activity即将停止,可做一些稍微重量级的操作,不过也不能过于耗时
onDestroy:与onCreate对应,Activity即将销毁,可做一些回收操作和资源释放

1.1.3、Activity异常销毁

当Activity异常销毁时,会在onStop前回调onSaveInstanceState方法,做一些数据的保存工作,当Activity被恢复时,可在onRestoreInstanceState方法中恢复(也可在onCreate中恢复,当且仅当Bundle不为空时),在onStart后执行,一般view中也会重写这两个方法,对view中数据进行恢复

1.2.1、Activity的启动模式

standard(标准模式):会在启动它的Activity栈中新建一个该Activity
singleTop(栈顶模式):如果启动的Activity本身位于栈顶,则复用这个Activity,会调用它的onNewIntent方法,不会再调用onCreate、onStart方法;如果Activity不在栈顶,则会创建一个新Activity并入栈
singleTask(栈内复用模式):当启动一个Activity A,会先查看是否存在A想要的Activity栈,如果不存在该栈则创建一个新栈,然后新建一个Activity A并入栈,如果存在Activity A所需要的栈,则在该栈中寻找Activity A,如果有一个Activity A存在,则把A移至栈顶(与singleTop一样,调用其onNewIntent方法),并弹出A上面的Activity,如果不存在,在栈顶新建一个Activity A
singleInstance(单实例模式):它除了具有singleTask所有特性外,还有一个特点是创建此模式的Activity,会单独建立一个Activity栈用于存放该Activity
taskAffinity通常与singleTask或allowTaskReparting配合使用,其它情况下没有意义,taskAffinity用于指定需要在哪个Activity栈启动Activity,默认情况下,启动的Activity所需的Activity栈名字为所在应用的包名。当B应用Activity的allowTaskReparting为true时,由A应用启动B应用的Activity,B应用会创建一个Activity栈,存放该Activity,相当于把新启动的Activity从A应用的Activity栈转移到了B应用的Activity栈中
使用adb shell dumpsys activity命令,查看running activities可查看运行着的activity及所在栈情况

1.2.2、Activity的Flags

FLAG_ACTIVITY_NEW_TASK:和singleTask等效
FLAG_ACTIVITY_SINGLE_TOP:和singleTop等效
FLAG_ACTIVITY_CLEAR_TOP:在同一个任务栈中,所有位于它上面的Activity都要出栈。如果要启动一个standard模式的Activity,会弹出该Activity及它之上的所有Activity,并新建一个该Activity入栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有此标记的Activity不会存在于历史Activity列表中,用于我们不希望用户通过历史列表返回我们的Activity的情况下,与android:excludeFromRecents="true"等效

1.3、IntentFilter的匹配规则

隐式启动Activity

            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <action android:name="android.intent.action.SENDTO" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.LE_DESK_DOCK" />
                
                <data android:mimeType="image/*"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
                <action android:name="android.intent.action.SEND" />

                <category android:name="android.intent.category.APP_BROWSER" />
                <category android:name="android.intent.category.ALTERNATIVE" />
                <data android:mimeType="text/plain"/>
            </intent-filter>
        </activity>

一个Activity可指定多组intent-filter,其它Activity要想通过隐式启动该Activity,必须匹配其中的一组intent-filter,而匹配一组intent-filter的条件是必须同时匹配该组的action、category、data类别
action匹配规则:action是一个字符串,区分大小写,如果过滤规则中存在action,需要intent的action存在且必须和intent-filter中一个action相同(如果intent有多个action,只要有一个与intent-filter中任意一个action匹配即可)
category的匹配规则:category是一个字符串,匹配条件是intent中不设category(此时intent-filter中必须 指定android.intent.category.DEFAULT)或intent设置的多个category都能和intent-filter中的category相匹配
data的匹配规则:与action匹配规则类似,如果过滤规则中存在data,则intent中必须存在一个data能匹配过滤规则的data。data有两部分组成,分别是mimeType和URI,mimeType即媒体类型,可以表示文本、视频、图片等,URI通常由schema、host、path组成,scheme可以为content、http、file等,当过滤规则中没有指定URI时,URI默认值是content或file,需要在intent中指定出来如,如:
intent.setDataAndType(Uri.parse("file://abc"),"image/*")
最后,当我们使用隐式方式启动一个Activity时,可以先判断一下是否有Activity匹配,这样不至于如果没有Activity匹配时会报错,出现bug,判断方法有两种:

public abstract ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags);
 public ComponentName resolveActivity(@NonNull PackageManager pm)
//这个会返回所有能匹配的Activity信息
public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
            @ResolveInfoFlags int flags);

ResolveInfoFlags 参数应指定为PackageManager.MATCH_DEFAULT_ONLY,使用这个标志位的意义在于只要返回不为空,startActivity就一定可以成功,因为这个标志位只匹配那些带有android.intent.category.DEFAULT的category的Activity

相关文章

网友评论

      本文标题:第一章 Activity生命周期全面解析

      本文链接:https://www.haomeiwen.com/subject/mwpqrrtx.html