笔记地址:https://app.yinxiang.com/fx/b30ed8bc-0896-4c1b-b1cf-da4d08c75a02
前言:
Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接受用户的输入信息从而进行交互;
1. 生命周期
Google官方解释: https://developer.android.google.cn/guide/components/activities/activity-lifecycle?hl=zh_cn
2. 启动模式{
launchMode{
1. standard (标准模式) [默认]
>1. 多实例实现
2. singleTop
>1. 栈顶复用 {@link onNewIntent}
3. singleTask
>1. 栈内复用
>2. 默认具有clearTop的效果
4. singleInstance
>1. 单实例子模式;
>2. 不论是指指定taskAffinity,都会为它创建一个新的任务栈;
},
Flags{
1. FLAG_ACTIVITY_NEW_TASK
2. FLAG_ACTIVITY_SINGLE_TOP
3. FLAG_ACTIVITY_CLEAR_TOP
4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
}
}
3. IntentFilter匹配规则 (隐式调用)
1Activity->nIntentFilter{
naction {
1. Intent中的action必须存在 & 过滤规则中的其中一个action相同;
2. 区分大小写;
3. 唯一性: Intent #setAction;
},
ncategory {
1. Intent中没有category || Intent中的categorys必须是过滤规则中的;
2. 系统调用startActivity / startActivityForResult时,会默认为intent添加categoryDefault( android.intent.category.DEFAULT) 这个所以过滤规则中必须制定这个categoryDefault
3. 可以申明多个: Intent #addCategory;
},
ndata{
1. 匹配规则类似action;
2. 需要搭配action一起使用;
3. Intent #setDataAndType, setData, setType;
}->{
1mimeType{
1. 媒体类型
2.举例: image/jpeg etc
},
1*URI{
1. 结构: <scheme>://<host>:<port> /[<path>|<pathPrefix>|<pathPattern>] ;
2. 类似: http://www.xxx.com:80/serach/info;
3. 常见使用键下面补充部分
}
}
}
案例分析:
[1] ActivityA使用Intent.FLAG_ACTIVITY_NEW_TASK启动ActivityB (设置taskAffility=":other"),并在B中使用Intent.FLAG_ACTIVITY_NEW_TASK启动ActivityB,会发现第二步启动基本没有任何效果,没有走onNewIntent或者onCreate回调;
4. 源码解析
Activity启动流程 9.0 (整体流程分析): https://blog.csdn.net/weixin_43766753/article/details/107746968
Activity启动流程 10.0: http://www.zyiz.net/tech/detail-124642.html
5. 补充(待定)
- Android为什么要有启动模式呢?
1.方便Activity管理;- 提高资源利用;
- 启动模式默认{
launchMode="standard"
taskAffinity="$app_packageName"
}; - 使用ApplicationContext启动Activity(无论launchMode为任何值),需要添加Intent.FLAG_ACTIVITY_NEW_TASK标记位,这个启动类似SingleTask模式启动;
- taskAffinity属性不能单独使用,需要配合Intent.FLAG_ACTIVITY_NEW_TASK或者allowTaskReparenting或者singleTask模式etc;
- setDataAndType启动->{
Intent().apply{
启动浏览器浏览某个网页{
action=Intent.ACTION_VIEW
setData(Uri.parse("http://www.baidu.com")
},
启动拨号{
action=Intent.ACTION_CALL
setData(Uri.parse("tel:132****1222"))
},
打开文件{
...
}
}
}
6.启动Activity判断 PackageManager#resolveActivity - Activity属性{
label :
1. app名: 入口Activity的lable>application的lable;
2. 其它Activitiy的label属性可以用于通过隐式启动的时候,选择启动应用的显示
}
参考:
<<Android开发艺术探索>>
一只修仙的猿
网友评论