1. mark0 通过反射生成Activity
  2. mark1 通过反射生成Application
  3. mark2 调用ActivityThread的createBaseContextForActivity生成ContextImpl
  4. mark3 并通过Activity.attach赋值给Activity的mBase。这里就完美回答了上面关于ContextImpl源码处的那个不严谨的结论
  5. mark4 把ActivityClientRecord记录到ArrayMap中

而activityToken其实是与界面相关的。如果用Application或者Service创建Dialog是会报错的。原因就是没有activityToken。

startService和startActivity都是调用ContextImpl->AMS打开
————————————————
版权声明:本文为CSDN博主「future234」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/future2...

Activity

LauncherMode

andorid:launchMode Flag
singleTop FLAG_ACTIVITY_SINGLE_TOP 栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。避免栈顶的activity被重复的创建。
singleTask FLAG_ACTIVITY_CLEAR_TOP activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空这个activity任务栈上面所有的activity。
standard 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。
singleInstance 单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。
FLAG_ACTIVITY_NEW_TASK 使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。
FLAG_ACTIVITY_NO_HISTORY Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。

5.0的兼容性问题。
5.0之前夸进程调用的时候,启动的新的Activity会停留在原有的栈里
startActivityForResult的兼容问题

taskAffinity 属性

taskAffinity,可以翻译为任务相关性。这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名,当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在和 taskAffinity 名字相同的任务栈中,如果没有,则新建 taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

activity-alias功能
知道了activity-alias的概念,那么它的功能是什么呢?activity-alias作为一个已存在Activity的别名,则应该可以通过该别名标签声明快速打开目标Activity。因此activity-alias可用来设置某个Activity的快捷入口,可以放在桌面上或者通过该别名被其他组件快速调起。该标签元素支持一些属性及intent-filter、meta-data等配置,因此可以触发一些跟目标Activity不同的功能逻辑,虽然打开的是同一个Activity。举个简单的例子,如之前需要先打开主界面,然后才能点击进入某个Activity,如果使用activity-alias为该Activity配置一个快捷入口,甚至可以为其在桌面生成一个图标,然后点击桌面图标可直接进入该Activity,该功能可满足某些需要快速到达功能界面的需求。

activity-alias语法及声明
其基本语法如下

            android:exported=["true" | "false"]            android:icon="drawable resource"            android:label="string resource"            android:name="string"            android:permission="string"            android:targetActivity="string" >. . .


部分属性说明如下

1.android:enable 该属性用来决定目标Activity可否通过别名被系统实例化,默认为true。需要注意的是application也有enable属性,只用当它们同时为true时,activity-alias的enable才生效。
2.android:exported 该属性为true的话,则目标Activity可被其他应用调起,如为false则只能被应用自身调起。其默认值根据activity-alias是否包含intent-filter元素决定,如果有的话,则默认为true;没有的话则为false。其实也很好理解,如果有intent-filter,则目标Activity可以匹配隐式Intent,因此可被外部应用唤起;如果没有3.intent-filter,则目标Activity要被调起的话必须知道其精确类名,因为只有应用本身才知道精确类名,所以此时默认为false。
4.android:icon 该属性就比较好玩了,允许自定义icon,可以不同于应用本身在桌面的icon。如果需要在桌面上创建快捷入口,也许产品会要求换个不同的icon。
5.android:label 该属性类似于android:icon,图标都换了,换个名称也合情合理吧,此属性就是为此而生的。
6.android:name 该属性可以为任意字符串,但最好符合类名命名规范。activity元素的name属性实质上都会指向一个具体的Activity类,而activity-alias的name属性仅作为一个唯一标识而已。
7.android:permission 该属性指明了通过别名声明调起目标Activity所必需的权限。
8.android:targetActivity 该属性指定了目标Activity,即通过activity-alias调起的Activity是哪个,此属性其实类似于activity标签中的name属性,需要规范的Activity包名类名。
看了以上几个主要属性,大家应该意识到activity-alias的属性是activity属性的子集,如果是activity-alias和activity共有的属性,则以activity-alias为准,目标Activity中的设置并不会在activity-alias中生效;如果是仅activity才有的属性,则为目标Activity配置的属性会在activity-alias中生效。

activity-alias可以设置自己的intent-filter或meta-date,最常用的就是设置如下intent-filter从而在桌面Launcher上创建一个快捷入口:

另外需要注意的一点是,在AndroidManifest配置文件中,activity-alias标签元素必须声明在目标Acitvity对应的activity标签元素之后,

两个Activity切换时
A->OnPause
B->OnCreate->OnStart->OnResume
A->onStop->OnSaveInstance

onStart()和onResume()的区别

onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互
onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。

IntentFilter

component(组件)
目的组件的名称,这个只有显式 Intent 有,隐式 Intent 没有。例如:com.madreain.DemoActivity。该属性可以通过 setComonentName()、setClass()、setClassName()或者 Intent 的构造函数来设置。
action(动作)
用来表现意图的行动,这个可以用户自定义也可以使用系统中自带的 Action 值。例如:com.madreain.intent.MY_ACTION"该属性可以通过 setAction()方法或者 Intent 的构造函数来设置。
category(类别)
用来表现动作的类别,它是一个 ArraySet 类型的容器,所以可以向里面添加任意数量的补充信息,同时,Intent 没有设置这个属性不会影响解析组件信息。可以通过 addCategory()方法来设置该属性
data(数据)
表示与动作要操纵的数据,它是待操作数据的引用 URI 或者数据 MIME 类型的 URI,它的值通常与 Intent 的 Action 有关联。实际应用打开指定网页
type(数据类型)
对于 data 范例的描写,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。data和type属性一般只需要一个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,如果想要两个属性同时设置,要使用Intent.setDataAndType()方法
Action匹配规则
一个过滤器可以不声明Action属性也可以声明多个Action属性。隐式Intent中的Action属性,与组件中的某一个过滤器的Action能够匹配(如果一个过滤器声明了多个Action属性,只需要匹配其中一个就行),这样就算匹配成功。如果过滤器没有声明Action属性,那么只有没有设置Action属性的隐式Intent才能匹配成功。

Category匹配规则
一个过滤器可以不声明Category属性也可以声明多个Category属性。隐式Intent中声明的Category必须全部能够与某一个过滤器中的Category匹配才算匹配成功。比如说一个Category属性设为CATEGORY_BROWSABLE的隐式Intent也可以通过上面的过滤器,也就是说,过滤器的Category属性内容必须是大于或者等于隐式Intent的Category属性时候,隐式Intent才能匹配成功。如果一个隐式Intent没有设置Category属性,那么它可以通过任何一个过滤器的Category匹配。

Data匹配规则
一个过滤器可以不声明Data属性也可以声明多个Data属性。每个Data属性都可以指定数据的URI结构和数据MIME类型。URI包括scheme、host、port 和path四个部分,host和port合起来也成authority(host:port)部分。

更多相关文章

  1. appium自动化测试总结(转载liangww)
  2. 详解Android中通过Intent类实现组件间调用的方法
  3. gradle之 (application 目录下 gradle 和 Root 目录下 gradle)
  4. PopupWindow 展开后点击返回键无效?
  5. android发送
  6. Android数据过滤器:Filter
  7. xmlpull解析XML
  8. Fragment 应用小结
  9. Android(安卓)的EditText实现不可编辑

随机推荐

  1. android资源
  2. Android 定时任务的多种实现方式
  3. 【android】布局之盒模型、对齐方式、填
  4. 如何在Android移植使用最新的ffmpeg
  5. 将androd项目作为moudle引入配置信息
  6. Android(安卓)进阶 教你打造 Android(安
  7. android这个问题是咋回事儿呀??
  8. Android创建和使用数据库详… 分类: Andro
  9. Android基于XMPP Smack Openfire开发IM(5)
  10. Android开发我音乐App