1.引言
android基本功不扎实,二刷艺术探究,记录下学习过程中在我看来很重的知识点笔记
2.正题
2.1 Activity 异常重启生命周期
程序异常崩溃,重启的生命周期:onCreate, onStart ,OnResum ,OnPause,OnSaveInstanceState ,Onstop ,onDestroy ,OnCreate,OnStart,onRestroeInstanceState,OnResume
OnSaveInstanceState 方法的调用是在onPause 或者onStop 之前调用。
崩溃重启的时候,OnSaveInstanceState 会在onStart 和onResum 之间调用。
改变系统Configuration,会导致Activity的重启,会回调onConfigurationChanged方法,通过在xml中配置 android:configChanges="" 可以避免Activity的重启
2.2 Activity 启动过程
- activity.startActivity
- activity.startActivityForResult
- Instrumentation.execStartActivity
- AMS.startActivity
- ApplicationThreadProxy.scheduleLaunchActivity
- ActivityThread.handleLaunchActivity
ApplicationThread 是ActivityThread 的内部类,是framwork层 与app应用层的桥梁。App 与AMS通信 会携带一个ApplicationProxy 传入到AMS,AMS初始化完毕之后,又会通过ApplicationProxy回调scheduleLaunchActivty,进而执行ActivityThread的handleLaunchActivity 方法。ApplicationProxy 再继续调用scheduleStartActivity,进一步调用ActivityThread.handleStartActivity
2.3 Activity启动模式 和标志位
Context
家族:

问题:为什么只能用activity 启动界面,而不能用application去启动界面?
答案:界面A 启动界面B,B存在于A所在的栈中。而Application 启动因为没有栈所以报错,为了能启动,可以添加一个Flag
singTop
:当栈顶存在当前的Activity,此界面不会重新创建。会回调onNewIntent().假如当前栈顶不存在此Activity,将会走正常的创建过程,但是不会走onNewIntent()
singTask
:当启动一个singleTask 标记的Activity的时候,先检查此Activity 是否存在于栈中,假如存在会回调onNewIntent() 。假如不存在将会创建一个栈,将此Activity 压入栈中。
应用A,启动应用B 中用singTask 修饰的Activity。启动完毕之后。B中 singTask修饰的Activity 单独的放进一个栈。那么当再次启动应用B时,打开的第一个界面就是此Activity。
应用A,启动应用B 中用stanard 修饰的Activity。这个Activity中将被放进应用A 的栈中。再次启动应用B。B应用如正常启动打开第一个界面是MainActivity 而不是我们启动的那个
android:excludeFromRecents="true"
可以让此界面,不在多任务列表中显示。所谓的多任务列表就是这个状态:

设置了这个属性之后,就无法在多任务背景下,看到这个界面
TaskAffinity
叫做归属,可以把它理解成把Activity分组的意思,它会把TaskAffinity value值相同的Activity 划分到同一个任务栈
2.4 action, category data 理解
action
:标志当前Activity,在隐式启动Activity过程中,通过设置Action 就可以启动某个Activity。某种意义上说action 是Activity的唯一标志。例如下面代码
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:"+phoneNumber);
intent.setData(data);
startActivity(intent);
Intent.ACTION_CALL 是打电话界面的Action,设置了这个action之后,intent就会跳转到打电话界面
category
:英文意思是种类,描述启动Activity的环境。有以下几个环境

data
:假如一个Activity的 intentFilter中定义了data,那么隐式启动的时候就必须要给Intent设置data。例如上面的调用通话界面。data数据有俩部分组成mimeType
和Uri
。 mimeType 包括image/jpeg/video/audio
。
Uri由:scheme://host:port/path 组成
例如:content://sms/outbox 发送箱中的短信URI
网友评论