1.动态注册
以郭神的第一行代码里的示范为例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37package com.Harris.broadcastreceiver_demo; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity { private NetworkChangeReceiver networkChangeReceiver; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); //这个程序用于监听系统发出的广播 //需要在onCreate方法里面生成一个IntentFilter对象 //给这个对象一个监听的目标,addAction IntentFilter intentFilter = new IntentFilter(); IntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //这是一个继承自BroadcastReceiver的内部类 //成员内部类的修饰符可以是public、protected、private、abstract、final和static //这个自定义的Receiver就是用来指定在接收到了IntentFilter里面指定的广播后要去做什么的 //BroadcastReceiver是一个抽象类,onReceive是唯一的抽象方法 class NetworkChangeReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Toast.makeText(context, "NetWork status Changed", Toast.LENGTH_SHORT).show(); } } } //最后还需要提醒一句,需要在onDestory方法里unRegisterReceiver这个Receiver,否则退出时会报错。
使用时注意将这个Receiver和intentFilter一起传入registerReceiver的参数里,其实也就是Receiver和IntentFilter搭配使用。
最后,这个Activity由于会监控系统网络状态,所以需要在AndroidManifest文件里添加权限,这个知道就行。
2.静态注册
个人理解就是把IntentFilter写在AndroidManifest文件的<receiver/>标签里面
这样用来干活的Receiver就可以脱离主Activity了,当然上面的动态注册也可以不写成内部类,只是注册的逻辑写在了onCreate方法里
Androidanifest文件里面的格式如下:
1
2
3
4
5<receiver android:name=".NetWorkStatusMonitor" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
作为四大组件之一,receiver和activity在Manifest文件里的地位应该是平起平坐的,低于application
这里需要在src的package里面建一个NetWorkStatusMonitor的类,extends BroadcastReceiver,在onCreate方法里面写好相应的处理办法。这个class去做什么事情与Activity无关。
区别于动态注册,IntentFilter已经写好了,不用在执行过程中(可能要在onCreate方法里)添加。
3.关于发送Broadcast的问题。
1和2讲的都是关于如何接受广播,现在讲讲广播的发送。
先讲关于标准广播
谈发送之前先建立一个接收器,不然发出去没人要。。。。
先建一个Receiver类继承自BroadcastReceiver,在onReceive方法里爱干嘛干嘛。
然后静态注册这条广播,确定它要接受的intent-Filter。
接下来就超级简单了,在onCreate或者onClick方法里面写上下面的逻辑,sendBroadcast就发出去了
1
2Intent intent = new Intent("com.Harris.broadcastreceiver_demo.MY_BROADCAST"); sendBroadcast(intent);
1
2
3Intent intent = new Intent(); intent.setAction("com.Harris.broadcastreceiver_demo.MY_BROADCAST"); sendBroadcast(intent);
你在eclipse里面再新建一个项目,完全可以接收到这条广播,也就是说这玩意可以跨程序传播。
接下来是有序广播:
貌似很简单:
sendBroadcast(intent)改为sendOrderedBroadcast(intent,null)即可。
然后设置receiver的priority:
动态注册:intentFilter.setPriority(100);
静态注册:<intent-filter android:priority="100">
可以把这个intent看作是对Receiver的修饰:
在Receiver里面abortBroadcast就可以终止这条广播了。
4.使用本地广播
这里要用到LocalBroadcastManager。
具体语法:LocalBrocastManager = LocalBroadcastManager.getInstance(this);//获取实例
Intent intent = new Intent("com.Harris.XXXXXX.XXXXX");
LocalBroadcastManager.sendBroadcast(intent);//这样就发送出去广播了。
LocalReceiver localReceiver = new LocalReceiver();
IntentFilter intentFilter = new IntenFilter();
IntentFilter.addAction("com.Harris.XXX.XXX");
LocalBroadcastmanager.registerReceiver(laocalReceiver,intentFilter);//这样就完成了接收器的注册。
LocalReceiver extends BroadcastReceiver,onReceive方法里面随便写了。
需要强调,LocalBroadcastManager发送的广播只会在该应用程序内部传播,你新建一个项目是绝逼接收不到这个广播的。
还有,本地广播只能动态注册,不能静态注册。
以下是郭神的解释:“另外还有一点需要说明,本地广播是无法通过静态注册的方式来接收的。其实这也完全
可以理解,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地
广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册的功能。”
其实,在发送标准广播的时候新建一个项目B,安装到模拟器上面,MainActivity里面什么都不做,在这个项目里面新建一个extends BroadcastReceiver的 Receiver
在onReceive()方法里面写好Toast,这时候启动发送广播的项目A,发送出去广播后,项目A会Toast一次,项目B也会Toast一次,呵呵,尼玛项目B的onCreate方法根本还没启动好吧,所以说,在Manifest文件里注册了之后,就可以在程序未启动的情况下接收广播,大概明白了。
最后提取这篇文章最重要的语法:
发送
sendBroadcast(intent);
接收:
静态注册:在Manifest文件里写<intent-filter android:action= "com.Harris.xxx">
动态注册:registerBroadcast(myReceiver,intentFilter);
myReceiver extends BroadcastReceiver{
onReceive{
//这里请为所欲为
}
}
所有的代码来自郭神,谢郭神。
最后安利一个思维导图软件,
Mindjet MindManager,超级好看。
最后
以上就是文艺板凳最近收集整理的关于android四大组件总结之BroadcastReceiver个人总结的全部内容,更多相关android四大组件总结之BroadcastReceiver个人总结内容请搜索靠谱客的其他文章。
发表评论 取消回复