《Android开发艺术探索》学习笔记——Activity

离职三四个月了,陆陆续续处理完家里的事情,打算重新回到码农大军中才发现这片江湖腥风血雨太重了——从毕业开始做整机开发一直沉浸在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党法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值