Android-四大组件
广播:
1、例子:当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等等。
2、广播机制是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。
3、 BroadcastReceiver的生命周期
- Register 注册
- SendBroadcast 发送信息
- onReceive 接收信息
- unRegister 注销
4、下面是广播的特性:
1、广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2、广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3、最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4、耗时的较长的工作最好放在服务中完成
5、Broadcast也有四种不同的分类:
- 普通广播(Normal Broadcast): 所有监听该广播的接收器都可以监听到该广播,同一个级别的接受顺序是随机的或则说是无序的,接收器不能对收到的广播做任何处理,也不能截断广播继续传播。该种类的广播用sendBroadcast发送。
- 系统广播(System Broadcast):常见系统广播: 监听网络变化、关闭或打开飞行模式、充电时或电量发生变化 、统启动完成后(仅广播一次)、按下照相时的拍照按键(硬件按键)时 、屏幕锁屏、设备当前设置被改变时(界面语言、设备方向等)、插入耳机时
- 有序广播(Ordered Broadcast粘性广播(Sticky Broadcast)
- App应用内广播(Local Broadcast)
6、有序广播:
- android中的有序广播,也是一种比较常用的广播,该种类的广播用sendOrderedBroadcast发送。该中广播主要有一下特性:
- 按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-
1000到1000之间,值越大优先级越高,- 可以终止广播的继续传播,接受者可以修改intent的内容。
- 同级别接收顺序是随机的,级别低的后收到
- 能截断广播的继续传播,高级别的广播接收器接收广播后能决定时候截断。能处理广播
- 同级别动态注册高于静态注册
7、App应用内广播(Local Broadcast):
- android中的广播是可以跨域的(跨App),因此可能存在一下问题:
1、其他App针对性发出与当前App intent-filter相匹配的广播,由此导致当前App不断接收广播并处理;
2、其他App注册与当前App一致的intent-filter用于接收广播,获取广播具体信息; 即会出现安全性 & 效率性的问题。
- 对于上述情况就出现了这种广播,App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。相比于全局广播(普通广播),App应用内广播优势体现在:安全性高、效率高。
8、BroadcastReceiver有静态注册和动态注册两种方式,当用动态注册方式时要记得销毁的时候取消注册。静态注册是在AndroidManifest.xml文件中,所以一般情况下是不会移除的,比较占用资源。动态注册于onStart移除于onStop,所以建议使用动态注册。
- 相比于系统广播而言,本地广播更加安全,更加高效,以下是本地广播的特点以及内部的实现机制 :
a.使用它发送的广播将只在自身app内传播,因此你不必担心泄漏隐私的数据。
b.其他app无法对你的app发送该广播,因此你的app根本不可能收到非自身app发送的该广播,因此你不必担心有安全漏洞可以利用。
c.比系统广播更加高效。
activity:
-
当前 Activity 启动一个新的 Activity 时,新 Activity 会被推送到栈顶部,成为焦点activity。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。
-
什么情况下Activity不走onDestory?
正常点击返回键: onDestroy方法一定会执行;
从后台强杀分两种情况:第一种:当前仅有一个activity,这时候,强杀,是会执行onDestroy方法的;
第二种:栈里面的第一个没有销毁的activity会执行ondestroy方法,其他的不会执行。比如说:从mainactivity跳转到activity-A(或者继续从activity-A再跳转到activity-B),这时候,从后台强杀,只会执行mainactivity的onDestroy方法,activity-A(以及activity-B)的onDestroy方法都不会执行;
- setContentView方法所指定的View,只有在onCreate方法返回后才会显示在界面上。因此,如果调用了两次setContentView方法,只有最后一次才是有效的。
- 3.1.27
- 在activity的不同生命周期中调用finish()方法后,activity的生命周期回调:
在onCreate中:onCreate->onDestroy
在onStart中:onCreate->onStart->onStop->onDestroy
在onResume中:onCreate->onStart->onResume->onPause->onStop->onDestroy 之所以是这样,源码中给出了解释,activity会判断状态,只有没有被finish才会执行下一个生命周期。
- ActivityA中启动ActivityB
- ActivityA.onPause
- ActivityB.onCreate
- ActivityB.onStart
- ActivityB.onResume
- ActivityA.onSaveInstanceState
- ActivityA.onStop
- 点击Home键
- ActivityB.onPause
- ActivityB.onSaveInstanceState
- ActivityB.onStop
- 在程序的配置文件 (APPManifest.xml ,的相关Activity里加上android:configChanges=”keyboard|keyboardHidden|orientation” 后,activity的以上配置发生变化不会让activity重建