一、Activity1.Activiy的生命周期1.1 正常情况下的生命周期(1)onCreate:我们可以在这里做一下数据的初始化,加载布局资源等工作。(2)onRestart:当前Activity从不可见重新变为可见时调用,一般是用户行为所导致的。(3)onStart:Activity已经可见,但是还没出现在前台,我们看不到,也还无法与用户交互。(4)onResume:Activity可见,并出现在前台,可与用户交互。(5)onPause:Activity正在停止。此时可以做一下数据存储,停止动画,关闭广播等工作。但是不能太耗时,因为会影响新Activity的显示,onPause必须执行完,新Activity的onResume才执行。(6)onStop:Activity即将停止,可以做些稍微重量级的回收工作,但是也不能太耗时。(7)onDestory:回收和资源释放。1.2异常情况下的生命周期资源内存不足导致低优先级的Activity被杀死;系统配置发生改变导致Activity被杀死并重新创建,如横竖屏切换。默认情况下,横竖屏切换会导致Activity被销毁并且重建,当然我们也可以阻止系统重新创建我们的Activity。不想系统配置发生改变而重新创建Activity的时候,我们可以指定configChanges这个属性。如横竖屏切换不想重新创建Activity时,配置android:configChanges=“orientation|screenSize”(sdk大于13的时候需要加screenSiz),这样Activity就不会被重建,也就不会调用onSaveInstanceState和OnRestoreInstanceState,取而代之的是调用onConfigurationChanged。Activity异常终止的情况下,系统会调用onSaveInstanceState来保存当前的Activity状态。这个方法和onPause没有既定的顺序,可能在它之前,也可能在它之后。当Activity被重建后,系统会调用onRestoreInstanceState,并且会把Activity销毁前onSaveInstanceState保存的Bundle对象作为参数传给OnRestoreInstanceState和onCreate方法。OnRestoreInstanceState和onCreate的区别是,OnRestoreInstanceState一旦被调用,其Bundle一定是有值的,所以不需要判断是否为空。但onCreate不一定,在初次创建的时候Bundle为null。官方建议在OnRestoreInstanceState里面恢复数据。针对onSaveInstanceState和OnRestoreInstanceState,系统只会在Activity异常终止的情况下才会去调用它,其他情况不会调用。在onSaveInstanceState和OnRestoreInstanceState方法中,系统会自动为我们做一些恢复工作,比如当前Activity的视图结构,文本框里面的输入,ListView的滚动位置等。和Activity一样每个View都有onSaveInstanceState和OnRestoreInstanceState方法。关于保存和恢复View层次结构,系统的工作流程是这样的:首先Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶层容器去保存数据。顶层容器很可能是一个DecorView。最后顶层容器再一一通知它的子元素来保存数据,这样整个保存数据的过程就完成了。可以发现,这是一个典型的委托思想,上层委托下层,父容器委托子元素去处理事情。2.Activity 4种状态,3个循环4种状态:1.运行状态(前台,可见有焦点);2.暂停状态(可见,失去焦点);3.停止状态(不可见);4.销毁状态。3个循环:1.完整的生命周期;2.可视的生命周期(onStart-onStop);3.前台生命周期(onResume-onPause)。3.Activiy的优先级,从高到低前台Activity:正在和用户交互的Activity;可见但非前台Activity:onPause;后台Activity:已经被暂停的Activity,onStop。4.Activity的启动模式 每次启动一个Activity,系统就会把创建的Activity实例放入任务栈中,当我们单击back键,会发现Activity会一一回退。任务栈是一种“先进后出”的栈结构,每按一次back键,Activity就会从栈中弹出,直到栈空了,系统就会回收该栈。4.1目前Activity有四种启动模式:standard,singleTop,singleTask,singleInstance。(1)standard:每次启动一个 Activity 都会创建一个新的实例放入启动它的 Activity 所在栈。比如 A 启动 B(standard模式),则 B 就会放入 A 所在的栈中。如果,通过 ApplicationContext 启动 standard 模式的 Activity 会报错,因为非 Activity 的 Context 没有任务栈,这时就需要通过为 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标记位创建一个新栈。(2)singleTop:当前栈,栈顶复用模式。如果新 Activity 位于该栈栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 会被回调,通过此方法的参数我们可以调取当前的请求信息。该 Activity 的 onCreate、onStart 不会被调用。(3)singleTask:栈内复用,这是一种单例模式。比如,一个 singleTask 的 Activity A 请求启动后,系统首先会寻找是否存在 A 想要的任务栈,如果不存在,就重新创建一个任务栈,然会创建 A 放入栈中。如果存在该栈,这时要看该栈中是否存在 A ,如果存在 A 则 clearTop 清空 A 上面的所有实例,让 A 位于栈顶(此时不会重新创建实例,会回调 onNewIntent)。如果不存在实例 A 则创建新实例放入栈顶。默认情况下,所有的Activity所需的任务栈的名字为应用包名,当然我们也可以通过TaskAffinity参数为Activity指定所需的任务栈,名字不能和报名相同。(4)singleInstance:单实例模式。此模式的 Activity 只能单独的位于一个任务栈中,由于栈内复用特性,后续的请求均不会创建新的 Activity 除非被销毁再创建。4.2设置Activity的启动模式(1)在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如:<activity android:name=".A1" android:launchMode=“standard” /> (2)通过Intent中设置标志位Intent intent = new Intent();intent.setClass(MainActivity.this,SecondActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);两者之间的区别:第二种优先级高于第一种,两种同时存在时以第二种为准;第一种没办法为Activity设置运行状态,如FLAG_ACTIVITY_CLEAR_TOP,而第二种没办法为 Activity 指定 singleInstance 模式5.Activity的启动方式显式启动通过给 Intent 设置类名启动Intent intent = new Intent();intent.setClass(MainActivity.this,SecondActivity.class);startActivity(intent);隐式启动在AndroidManifest.xml中定义某个Activity的intent-fliter。<activity android:name=“xxx” android:taskAffinity=“xxx”> <intent-filter> <action android:name=“com.example.activity.ACTION_START” /> <category android:name=“android.intent.category.DEFAULT” /> <category android:name=“com.example.activity.ACTION_START” /> <data android:mimieType=“xxx”/> </intent-filter><activity/>Activity 中调用,只有action和category和data完全匹配时,才会启动。Intent intent = new Intent(“com.example.activity.ACTION_START”);//android.intent.category.DEFAULT是一种默认的category,在startActivity时自动添加intent.addCategory(“com.example.activity.ACTION_START”); intent.setData(xxx);startActivity(intent);隐式启动相对耗时,适用于不同应用键的 Activity 跳转;显式启动效率高,适用于一个应用内的 Activity 跳转。二、BroadcastReceiver转载自Carson_Ho的:Android四大组件:BroadcastReceiver史上最全面解析