BroadcastReceiver广播的使用
2016-07-14 10:51
429 查看
使用目的:通过广播接收者,可以进行组件之间进行通信、应用程序之间的通讯;
广播是用来传输数据的;
广播可以实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播(这些都是系统广播);
系统也可能发送广播,安卓是基于事件触发的,任何状态的改变都会发出广播,比如收到短信、收到电话等;
接收系统广播,接收自定义广播;
广播以内部类的形式实现,写到Activity里面。
广播分为有序广播和无序广播;
广播的使用步骤: 注册广播、取消广播、发送广播、接收广播;
一、注册广播:
订阅广播,有两种方法形式:xml配置、代码配置。注册一个广播接收者。
Xml文件配置订阅,不需要取消广播的订阅。注册广播需要设置action,只有和注册广播的动作一致的接收者才能收到广播。
通过代码注册广播接收者:记住最重要的一行代码;通过代码注册一定要取消广播的订阅。
二、取消广播:
unregisterReceiver(mReceiver);不取消广播的订阅,可能导致内存泄露。
三、发送广播:
sendBroadCast(new Intent());发送普通广播;所有的接收者可以同时受到广播;无法终断。
sendOrderBroadCast(new Intent());发送有序广播;有接收广播的优先顺序,而接收广播的优先顺序是由接收者自己指定的。接收广播的优先级的范围是-1000到1000.有序广播可以终断;但是有序广播可以明确的指定接收者,这样广播就不可以终断;
这两个方法是上下文身上的方法;
通过广播传递参数,广播里面传递的是Intent,可以携带数据;
发送广播时,要给Intent带上action,标识Intent的唯一性;intent.setAction()只有动作一致才能收到广播。
在发送广播时,如果为Intent设置了data,那么对应的广播接收者一定要设置data才能接收到广播。intentFilter.addDataScheme("cast")
四、接收广播:
写一个类继承自BroadCastReceiver,在子类的onReceive()方法中处理相应的业务逻辑。在广播接收者收到广播时,调用onReceive()方法。
有序广播案例: 设置广播的优先级、中断广播的实现、abortBroadcast()、android:priority="-1000"
清单文件中代码:
只能通过action判断,并且代码中没有明确的广播发送者。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
广播是用来传输数据的;
广播可以实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播(这些都是系统广播);
系统也可能发送广播,安卓是基于事件触发的,任何状态的改变都会发出广播,比如收到短信、收到电话等;
接收系统广播,接收自定义广播;
广播以内部类的形式实现,写到Activity里面。
广播分为有序广播和无序广播;
广播的使用步骤: 注册广播、取消广播、发送广播、接收广播;
一、注册广播:
订阅广播,有两种方法形式:xml配置、代码配置。注册一个广播接收者。
Xml文件配置订阅,不需要取消广播的订阅。注册广播需要设置action,只有和注册广播的动作一致的接收者才能收到广播。
<receiver android:name="com.lantu.tuhuadmin.testreceiver.MyReceiver"> <intent-filter> <action android:name="chenrushui" /> </intent-filter> </receiver>
通过代码注册广播接收者:记住最重要的一行代码;通过代码注册一定要取消广播的订阅。
<pre name="code" class="java"> mReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("chenrushui"); //为intent设置动作 intentFilter.addDataScheme("cast");//这里不需要: 添加数据约束。 registerReceiver(mReceiver, intentFilter);
二、取消广播:
unregisterReceiver(mReceiver);不取消广播的订阅,可能导致内存泄露。
@Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); }
三、发送广播:
sendBroadCast(new Intent());发送普通广播;所有的接收者可以同时受到广播;无法终断。
sendOrderBroadCast(new Intent());发送有序广播;有接收广播的优先顺序,而接收广播的优先顺序是由接收者自己指定的。接收广播的优先级的范围是-1000到1000.有序广播可以终断;但是有序广播可以明确的指定接收者,这样广播就不可以终断;
sendOrderedBroadcast(intent, null, new MyReceiver2(), new Handler(), 0, null, null);
这两个方法是上下文身上的方法;
通过广播传递参数,广播里面传递的是Intent,可以携带数据;
发送广播时,要给Intent带上action,标识Intent的唯一性;intent.setAction()只有动作一致才能收到广播。
在发送广播时,如果为Intent设置了data,那么对应的广播接收者一定要设置data才能接收到广播。intentFilter.addDataScheme("cast")
findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.putExtra("name", "陈如水"); intent.setAction("chenrushui"); intent.setData(Uri.parse("cast:11111")); sendBroadcast(intent); } });
四、接收广播:
写一个类继承自BroadCastReceiver,在子类的onReceive()方法中处理相应的业务逻辑。在广播接收者收到广播时,调用onReceive()方法。
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("chenrushui")) { String dataString = intent.getDataString().split(":")[1]; Toast.makeText(context, "我已经接收到了广播 " + dataString, Toast.LENGTH_SHORT).show(); } } }
有序广播案例: 设置广播的优先级、中断广播的实现、abortBroadcast()、android:priority="-1000"
清单文件中代码:
<receiver android:name=".MyReceiver1"> <intent-filter android:priority="1000"> <action android:name="com.lantu.tuhu" /> <data android:scheme="tel" /> </intent-filter> </receiver> <receiver android:name=".MyReceiver2"> <intent-filter android:priority="-1000"> <action android:name="com.lantu.tuhu" /> <data android:scheme="tel" /> </intent-filter> </receiver>MyReceiver1中的代码:
public class MyReceiver1 extends BroadcastReceiver { private static final String TAG = "MyReceiver"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.lantu.tuhu")) { Log.i(TAG, "MyReceiver1" + "收到广播"); } //直接调用这个方法中断广播,优先级低的广播接收者就都收不到广播了。 abortBroadcast(); } }MyReceiver2中的代码:
public class MyReceiver2 extends BroadcastReceiver { private static final String TAG = "MyReceiver"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.lantu.tuhu")) { Log.i(TAG, "MyReceiver2收到广播"); } } }接收的是否是系统广播,怎么判断?
只能通过action判断,并且代码中没有明确的广播发送者。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
相关文章推荐
- 更优雅的事件触发兼容
- Android中BroadcastReceiver(异步接收广播Intent)的使用
- javascript 动态改变onclick事件触发函数代码
- Android使用BroadcastReceiver实现手机开机之后显示画面的功能
- Android提高之BroadcastReceiver实例详解
- 详解Android中BroadCastReceiver组件
- Android编程四大组件之BroadcastReceiver(广播接收者)用法实例
- Android开发之BroadcastReceiver用法实例分析
- javascript下对于事件、事件流、事件触发的顺序随便说说
- 广播 BroadCastReceiver
- BroadcastReceiver应用详解
- Android中利用广播接受者简单几步实现拨号显示归属地
- 拦截短信
- Android中BroadcastReceiver理解
- 关于安卓手机开机自启动APP无法成功的问题
- android 监听SDCard安装和卸载的代码
- BroadcastReceiver实现android来去电录音功能(外录)
- 小米手机不支持对去电的拦截解决方案(BroadcastReceiver)
- BroadcastReceiver之开机自启动程序