离职三四个月了,陆陆续续处理完家里的事情,打算重新回到码农大军中才发现这片江湖腥风血雨太重了——从毕业开始做整机开发一直沉浸在bugfix,codebase update,还有客户爷爷或者产品爸爸的基于源码的需求开发,对于正常APP开发真的是。。。一言难尽。
默默摸出了之前在锤子某位大哥工位上薅过几眼就下单买下的书,充个电吧OAO
Activity的生命周期
标准流程,关于onStart(),onStop(),onResume(),onPause()之间的区别,前两者的根据是Activity是否可见,后两者则是Activity是否位于前台。同时当新启动一个Activity时,先执行当前Activity的onPause(),再执行新Activity的onCreate()方法。
异常状况下的生命周期
注意几点:
1.onSaveInstanceState()在onStop()之前执行,但onPause()前后都有可能;onRestoreInstanceState()在onStart()之后执行;
2.onSaveInstanceState()只会在Activity即将被销毁并且有机会重新显示的情况才会调用;
3.系统内存不足杀死Activity遵从以下优先级:前台Activity>可见但非前台Activity>后台Activity。优先级低的Activity先被杀死。(如果一个进程中没有四大组件,那么这个进程很快就会被系统杀死)。
Activity启动模式
Flags模式设置的优先级高于LaunchMode。Flags方式无法制定singleInstance模式,LaunchMode无法设置FLAG_ACTIVITY_CLEAR_TOP标识。
1.stantard:标准模式,每次启动都会创建一个新的Activity实例压入栈内;
2.singleTop:栈顶复用模式,如果新的Activity位于栈顶,不重新创建,调用onNewIntent();否则重新创建;
3.singleTask:栈内复用模式,首先检查其所需的任务栈是否存在,如果不存在则先创建一个任务栈,然后将Activity放入栈中;若任务栈存在:如果Activity在栈内存在,则不重复创建,只回调onNewIntent(),并将位于其之上的Activity移出;
4.singleInstance:单实例模式,加强版singleTask,除singleTask的特性外,具有此种模式的Activity只能单独位于任务栈中。
IntentFilter匹配规则
action
action是一个字符串,匹配规则是Intent中的action必须能够和过滤规则中的任何一个action匹配(字符串值完全一致,区分大小写),并且要求Intent中action必须存在。
Intent intent = new Intent(action);
category
category是一个字符串,intent中如果包含category,则所有的category都必须和过滤规则中的其中一个category相同。如果没有设置category,仍然可以匹配成功,因为系统使用startActivity或者startActivityForResult时会默认为Intent加上“android.intent.categoty.DEFAULT”.同时,为了activity能够接收到饮食调用,必须在intent-filter中指定“android.intent.categoty.DEFAULT”。
intent.addCategory(category);
data
1.data的结构:data由mimeType和URI组成
mimeType:媒体类型,可以表示图片、文本、视频等不同媒体格式;
URI:<scheme>://<host>:<port>/<path>|<pathPrefix>|<pathPattern>]
(scheme:URI的模式,若未指明则URI无效; host:URI主机名,若未指明则URI无效; port:URI端口号; path:完整路径信息; pathPattern:完整路径信息,但可以包含通配符“*”,“*”表示0个或多个任意字符; pathPrefix:路径前缀信息)
URI的默认值为content和file。
2.data匹配规则:
要求intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
...
</intent-filter>
intent.setDataAndType(Uri.prase("http://abc"),"video/mpeg");
PS:不可以调用setData再调用setType,因为这两个方法会清除对方的值。
判断是否有Activity能够匹配隐式Intent
1.PackageManager的resolveActivity方法
2.Intent的resolveActivity方法
3.PackageManager的queryIntentActivities党法