BroadcastRecevier广播的基本使用
来源:互联网 发布:js文本框获得焦点 编辑:程序博客网 时间:2024/06/05 15:17
BroadcastRecevier的有序、普通、动态和静态启动以及数据传递
1、什么是BroadcastRecevier?
BroadcastRecevier是一个系统级别的监听器,比如:插上耳机、电池电量发生变化、切换飞行模式等等都会由系统发送广播,我们的App可以接收过个广播,并做出相应的响应。
2、广播发送的两种类型:
A) 发送普通广播:sendBroadcast(Intent intent);
B) 发送有序广播:sendOrderedBroadcast(intent, receiverPermission)
3、BroadcastReceiver的生命周期很短,只有10秒左右,如果在广播中要完成一个耗时的任务,可以将该任务通过Service去完成。
4:每一个广播都通过一个Action字符串进行标识。
5:动态广播必须使用代码注册和反注册广播,如果要想在BroadcastRecevier中访问Activity,可以将该BroadcastRecevier定义成为Activity的一个内部类。动态广播无需在AndroidManifest.xml中配置。
6、说明:当系统中的某个App删除后,会发送android.intent.action.PACKAGE_REMOVED广播,广播接收器MyBroadcastReceiver会接收该广播,并自动调用onReceive方法。
实例:/** * BroadcastRecevier的简单使用: * 1:动态启动:可实例化广播类 * 2:静态启动:无法接受接口返回的数据 * 3:普通启动:配置文件的action要和代码里面的action一致 * @author Administrator * */public class MainActivity extends Activity implements SendData{ MyBroadcastRecevier myb;//广播类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout. activity_main); } /** * 动态启动,可通过接口传递数据 * * @param v */ public void but1(View v) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED );//系统广播 myb = new MyBroadcastRecevier (); registerReceiver( myb, intentFilter); //注册,动态启动广播 myb.setSd( this); //绑定set } /** * 静态启动,不能通过接口传递数据(因为我们无法实例化(系统自动实例化),所以无法用接口传递或返回数据) * @param v */ public void but2(View v) { Intent intent = new Intent(MyBroadcastRecevier. ACTION); //自定义广播 intent.putExtra( "name", "sunshine"); this.sendOrderedBroadcast(intent, null); //有序广播 } /** * 普通,静态启动广播 * <receiver android:name="com.example.mytest4.MyBroadcastRecevier" * android:exported="true"> * <intent-filter > * <action android:name="android.intent.action.EDIT" /> * </intent-filter> * </receiver> * @param v */ public void but3(View v) { Intent intent = new Intent(); intent.setAction(Intent. ACTION_EDIT); //要和AndroidManifest.xml里的保持一致 MainActivity. this.sendBroadcast(intent); //广播 } @Override protected void onStop() { super.onStop(); if( myb != null){ //反注册,否则会无限调用 unregisterReceiver( myb); } } /** * 通过接口将数据返回 */ @Override public void data(String s) { if(s!= null){ Log. e("tag: " , s); Toast. makeText(getApplicationContext(), s, 1000).show(); } }}----------public class MyBroadcastRecevier extends BroadcastReceiver { protected static final String ACTION = MyBroadcastRecevier.class.getName();//获得完整类名 private static final String TAG = MyBroadcastRecevier.class.getSimpleName();//获得类名 private SendData sd; public void setSd(SendData sd) { this. sd = sd; } /** * 广播自动调用该方法 */ @Override public void onReceive(Context arg0, Intent intent) { /** * 动态启动传值 */ /*Bundle bundle = intent.getExtras(); // 获取当前电量 int current = bundle.getInt("level"); // 获取总电量(电池的电池容量) int total = bundle.getInt("scale"); sd.data("当前电量:" + current + ",总电量:" + total);*/ /** * 静态启动传值 */ String s = intent.getStringExtra( "name"); Log. e(TAG, "广播启动成功: " + s); Toast. makeText(arg0, "=======", 1000); } /** * 传值接口 * * @author Administrator * */ public interface SendData { public void data(String s); }}----------配置BroadcastRecevier: <receiverandroid:name="com.example.mytest4.MyBroadcastRecevier" android:exported= "true"> <intent-filter > <action android:name= "com.example.mytest4.MyBroadcastRecevier" /> </intent-filter > </receiver >
小案例:插入耳机时界面现红色,拔出耳机现白色
public class MainActivity extends Activity { private LinearLayout layout; private BackgroundReceiver br; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); layout = (LinearLayout) findViewById(R.id.layout); br = new BackgroundReceiver(); } @Override protected void onStart() { super.onStart(); //注册广播 IntentFilter filter = new IntentFilter(); //在耳机口上插入耳机时发出的广播 filter.addAction(Intent.ACTION_HEADSET_PLUG); //注册 this.registerReceiver(br, filter); } @Override protected void onStop() { super.onStop(); //反注册 unregisterReceiver(br); } /** * 广播接收器,Activity的内部类 * @author 手撕包菜 * */ class BackgroundReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(intent.hasExtra("state")){ int state = intent.getIntExtra("state", 0); if(state == 0){ //如果耳机被拨出,背景变白 layout.setBackgroundColor(Color.WHITE); Toast.makeText(getApplicationContext(), "耳机被拨出", 1000).show(); }else{ //如果耳机被插入,背景弯红 layout.setBackgroundColor(Color.RED); Toast.makeText(getApplicationContext(), "耳机插入", 1000).show(); } } } }}源码下载地址:http://download.csdn.net/detail/sunshine_mood/9418381
效果图:
小案例效果图:
0 0
- BroadcastRecevier广播的基本使用
- BroadcastRecevier(广播)
- Android BroadcastRecevier广播消息
- 广播的基本使用
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
- 【Android】Android中广播的基本使用
- 无序广播基本使用
- 动态注册广播基本使用
- Android广播的基本介绍
- 广播的一些基本用法
- Broadcast广播的使用
- android 广播的使用
- 广播的使用步骤
- android 广播的使用
- android 广播的使用
- android 广播的使用
- android 广播的使用
- android 广播的使用
- 深入浅出Windows 10 通用应用开发学习笔记(C++) 3-1
- ImageNet和PASCAL VOC图像描述的xml文件的解析、修改和生成
- Android 6.0: 动态权限管理的解决方案
- casperjs 各控件实现方法
- 对称多处理结构
- BroadcastRecevier广播的基本使用
- oracle创建函数例子
- 关于LED电视机视频编码H.264,MPEG4,MPEG2能支持哪些格式的视频文件
- include包含文件查找的顺序
- 网络资源:常用的图表类库插件
- 征迈科技USB高速工业控制器——高速数据采集模块定制开发
- Ubuntu NetworkManager 使用:Ubuntu的wired Networks 变灰色,无法连接网络
- fresco自定义进度条ProgressBarImage
- JavaWeb开发相关书籍地址