安卓入门--四大组件--BroadcastRecivier
来源:互联网 发布:农村淘宝怎么卖农产品 编辑:程序博客网 时间:2024/04/30 00:54
安卓广播机制:
Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。
广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered
broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。
Context.sendBroadcast()
发送的是普通广播,所有订阅者都有机会获得并进行处理。
Context.sendOrderedBroadcast()
发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播。
(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,通过代码:Bundle
bundle =getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。
系统收到短信,发出的广播属于有序广播。如果想阻止用户收到短信,可以通过设置优先级,让你们自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。
BroadcastReceiver的使用:
BroadcastReceiver是什么:
广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
接收系统广播:
动态注册接收器:
新建类继承BroadcastReceiver,重写父类onReceive()即可。
代码很简单:最后记得取消注册
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetChangeReceiver netChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter=new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); netChangeReceiver=new NetChangeReceiver(); //动态注册代码 registerReceiver(netChangeReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //取消注册 unregisterReceiver(netChangeReceiver); } class NetChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"network changes",Toast.LENGTH_LONG).show(); } }}
然后加上权限,监听广播权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
静态注册实现开机启动:
新建类继承BroadcastReceiver,同样重写onReceive()
然后在AndroidManifest.xml文件里注册。
写一个监听系统开机的广播。
类继承:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"开机",Toast.LENGTH_SHORT).show(); }}
配置文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.broadcastreceivertest"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--监听权限--> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--注册代码--> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application></manifest>
说明: onReceive()
是不许开启线程的,所以不能做耗时间的任务。
发送自定义广播:
标准广播:
Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST);sendBroadcast(intent);
有序广播:
Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST);sendOrdereBroadcast(intent);
接收有序广播可以设定优先级: android:priority="100"
<receiver android:name=".MyBroadcastReceiver"> <intent-filter android:priority="100"> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
- 安卓入门--四大组件--BroadcastRecivier
- 安卓入门---四大组件---Activity
- 安卓入门---四大组件--ContentProvider
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓四大组件
- 安卓入门(第二篇 )——四大组件
- 安卓入门--四大组件--Service基本用法
- 安卓入门--四大组件--Service高级用法
- 安卓四大组件简述
- 安卓的四大组件
- Android安卓四大组件
- Mysql复制一条记录插入到当前表中
- 深度学习之caffe Loss
- 常规内部类、局部内部类、匿名内部类和静态嵌套类小结
- 动态页面静态化的静态化
- HtmlUnit学习总结
- 安卓入门--四大组件--BroadcastRecivier
- POJ 1696 极角排序
- iOS 自定义返回按钮,保留系统滑动返回
- kubernet初探
- 随笔
- [02]-小专题
- 教你如何添加MyEclipse自动生成类头部的author等注释
- Linux上查看进程中的的线程
- POJ3337