学习(Broadcast Receiver) 个人笔记三

来源:互联网 发布:php的csrf防护 编辑:程序博客网 时间:2024/06/06 18:00

广播机制简介

为什么说android中的广播机制更加灵活呢?,这是因为android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的的广播内容,这些广播可能是来自系统的,也可能是来自于其他应用程序的。Android提供了一套完整的API,允许应用程序自由地发送和接收广播。发送广播的方法其实就是Intent。而接收广播的则需要引入一个新的概念---广播接收器(Broadcast Receiver)。

1.     广播主要分为两种类型:标准广播和有序广播

1.1标准广播:是一种完全异步执行的广播,在广播发出之后,所以的广播接收器几乎会在同一时刻接收到这一条广播,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。它的的工作流程如下:


1.2有序广播:则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个光宝接收器接收到这一条广播信息。当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的。优先级搞的广播接收器就可以先接收到广播信息。并且前面的关闭接收器还可以截断正在传递的广播。这样后面的广播接收器就无法收到广播消息了。有序广播的工作流程图如下:

 

2.     广播接收器:

广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够接收到该广播,并在内部处理相应的逻辑,注册广播的方式有两种,一种是在代码中注册和AndroidManifest.xml中注册,其中代码中注册也被称之为动态注册,在xml中注册的称之为静态注册。

2.1动态注册广播接收器:

如何创建一个广播接收器?其实只需要新建一个类,让它继承自BroadCast-Receiver,并重写父类的onReceive()方法执行即可。这样当有广播到来时,onReceive()方法就会得到执行。

动态注册的代码

//新建一个内部类(广播接收器)
class NetWorkChangeReceiverextends BroadcastReceiver{

    @Override
    public void onReceive(Contextcontext, Intent intent) {
        //Toast.makeText(context,"network changes", Toast.LENGTH_SHORT).show();

          }

}

最后动态注册的广播需要解注册

//销毁时解广播
@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(netWorkChangeReceiver);//解注册广播接收器
}

注:动态注册的广播接收器可以自由的控制注册于注销,在灵活性方面很大优势,但是它有存在一个缺点,即必须要在程序启动后才能接收到广播,因为注册的逻辑是写在onCreate()方法中,静态注册广播接收器刚好弥补这个缺陷。

 

2.2动态注册广播接收器:

在项目的包名上点右键:

弹出以下的界面

这里有两个属性,Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enable属性表示是否启用这个广播接收器

另外,静态注册广播接收器一定要在AndroidManifest.xml文件中注册才可以使用,(android Studio快捷键方式建的广播接收器会自动创建)

 

注意:不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法进行了较长时间而没有结束时,程序会报错,因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态通,或者启动一个服务等。

 

         广播是一种可以跨进程的通信方式,这一点从前面接收系统广播的时候就可以看出来了。因此在我们应用程序内部发出的广播,其他的应用程序应该也是可以收到的,为了验证这一点

标准广播的发送:Intent intent = new Intent("com.prize.broadcasttest.MY_BROADCAST");//这里传的参数与在AndroidManifest.xml文件中注册的是一样的sendBroadcast(intent);

无先后顺序

 

有顺广播发送:

Intent intent = new Intent("com.prize.broadcasttest.MY_BROADCAST");//这里传的参数与在AndroidManifest.xml文件中注册的是一样的//sendBroadcast(intent);sendOrderedBroadcast(intent,null);

两个参数,第一个参数仍然是intent,第二个参数是一个与权限相关的字符串,这里传入null就行了

有序广播有先后之分:权限在AndroidManifest.xml中配置,如下

<receiver    android:name=".MyBroadcastReceiver"    android:enabled="true"    android:exported="true">    <intent-filter android:priority="100">        <action android:name="com.prize.broadcasttest.MY_BROADCAST"/>    </intent-filter></receiver>
可以看到通过android:priority属性给广播接收器=设置了优先级,优先级比较高的广播接收器就可以先接收到广播。

 

有序广播可以截断广播:

调用此方法:abortBroadcast();

如果在onReceive()方法中调用了abortBroadcast()方法。就表示将这条广播截断,后面的广播接收器将无法接收到这条广播。

 

以上讲的都是系统广播

本地广播主要是用了一个LocalBroadcastManager来对广播进行管理,并提供了发送和注册广播接收器的方法。

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.local_broadcast);    manager = LocalBroadcastManager.getInstance(this);    button = (Button) findViewById(R.id.button);    button.setOnClickListener(new View.OnClickListener() {
@Override    public void onClick(View v) {        Intent intent = new Intent("com.prize.broadcasttest.LOCAL_BROADCAST");        manager.sendBroadcast(intent);//发送本地广播    }});
intentFilter = new IntentFilter();    intentFilter.addAction("com.prize.broadcasttest.LOCAL_BROADCAST");    localReceiver = new LocalReceiver();    manager.registerReceiver(localReceiver, intentFilter);//传两个参数}
@Overrideprotected void onDestroy() {    super.onDestroy();    manager.unregisterReceiver(localReceiver);}//创建一个本地广播类class LocalReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "receivee in local broadcast", Toast.LENGTH_SHORT).show();    }}

注:本地广播只能在本程序中才能接收到广播,其他应用程序是无法接收到本地广播的消息

另外本地广播是无法通过静态注册的方式来接收的,其实这也完全可以理解,因为静态注册主要就是为了让程序未启动的情况下也能接收到广播,而发送本地广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。

 

总结本地广播:

1.     可以明确地知道正在发送的广播不会离开我们的程序,因此不必担心机密数据泄露。

2.     其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全流动的隐患

3.     发送本地广播比系统全局广播将会更将高效。

 

 

数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在设备中的数据是处于持久化状态的,持久化技术则提供了一种机制可以让数据在瞬时状态和持久化之间进行转换。

Android系统中主要提供了3中方式用于简单地实现数据持久化功能,即文件存储、SharedPreference存储和数据块存储。当然除了这3钟方式以外,还可以将数据保存在手机的SD卡中,不过使用文件、SharePreference或者数据库保存数据会相对更简单一些,而且比起保存在SD卡中会更加地安全。