Android-四大组件

广播:
1、例子:当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等等。
2、广播机制是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。
3、 BroadcastReceiver的生命周期

  1. Register 注册
  2. SendBroadcast 发送信息
  3. onReceive 接收信息
  4. 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发送。该中广播主要有一下特性:
  1. 按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-10001000之间,值越大优先级越高,
  2. 可以终止广播的继续传播,接受者可以修改intent的内容。
  3. 同级别接收顺序是随机的,级别低的后收到
  4. 能截断广播的继续传播,高级别的广播接收器接收广播后能决定时候截断。能处理广播
  5. 同级别动态注册高于静态注册

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
  1. ActivityA.onPause
  2. ActivityB.onCreate
  3. ActivityB.onStart
  4. ActivityB.onResume
  5. ActivityA.onSaveInstanceState
  6. ActivityA.onStop
  • 点击Home键
  1. ActivityB.onPause
  2. ActivityB.onSaveInstanceState
  3. ActivityB.onStop
  • 在程序的配置文件 (APPManifest.xml ,的相关Activity里加上android:configChanges=”keyboard|keyboardHidden|orientation” 后,activity的以上配置发生变化不会让activity重建

你可能感兴趣的:(Android-四大组件)