Android基础学习之BroadcastRceiver(通信机制)广播
来源:互联网 发布:mac内存清理 编辑:程序博客网 时间:2024/06/15 06:35
BroadcastRceiver是android四大组件的其中一个,可以用于活动和服务,应用和应用,应用和系统之间的通信。
下面是对广播进行简单的学习
广播的分类有:1.系统广播 由系统发出
2.应用广播 由应用程序发出,也称自定义广播
广播同时也分:异步广播,发送使用sendBroadcast(intent);
方法和有序广播,发送使用sendOrderedBroadcast(intent, null);
方法。
广播的注册有:
1.动态注册 用代码做, 适合用在应用广播(自定义的),可节省一些资源.
2.静态注册 在清单文件标签中注册, 适合用在系统广播,但会消耗更多资源
1.应用(自定义)异步广播
首先我们新建一个子类,继承自广播类,重写生命周期onReceive()方法,用于接收广播。
此处只是测试,所以只是用Tost提示一个信息而已。
package com.ql.broadcastrceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, intent.getStringExtra("bc"), Toast.LENGTH_SHORT).show(); }//"bc"->Intent通信的标签}
因为是自定义的广播,所以需要有触发才能发送,在此使用一个按钮的点击事件进行触发。在Activity的按钮事件中
case R.id.btn_send1: //发送自定义广播(应用广播) Intent intent=new Intent(); intent.setAction("com.ql.broadcastrceiverdemo.action1");//设置动作字符串(常量) 用来匹配intent的动作决定启动接收器,必须与清单文件中的一致 intent.putExtra("bc", "this is my broadcast1...."); sendBroadcast(intent);//发送一个异步广播break;
注册广播
setAction为在清单文件中进行注册的action,表明发给谁,谁来收,如下:
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver1" ><!--为MyReceiver1注册广播 --> <intent-filter> <action android:name="com.ql.broadcastrceiverdemo.action1" /> </intent-filter></receiver>
2.系统广播
不需要自己发送广播,由系统发出的广播触发
同样需要新建子类,并重写生命周期onReceive方法,用于接收广播。在这我们进行监听程序安装和卸载的两个系统广播。
package com.ql.broadcastrceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * 调用系统广播(由系统发出) * @author qinlang * */public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //如果是安装程序 if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)){ String pkgName=intent.getData().getSchemeSpecificPart();//获得应用的包名 Log.e("ql debug", pkgName+"应用安装成功!!!"); } //如果是卸载程序 if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){ String pkgName=intent.getData().getSchemeSpecificPart();//获得应用的包名 Log.e("ql debug", pkgName+"应用卸载成功!!!"); } }}
然后在清单文件中注册我们的广播
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver2" > <intent-filter> <!-- --> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> </intent-filter></receiver>
3.动态注册广播
前面两种方法都是静态注册的广播,这个方法是用代码讲如何动态的注册广播。
首先还是新建一个广播子类,用于接收广播。
package com.ql.broadcastrceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver3 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, intent.getStringExtra("bc"), Toast.LENGTH_SHORT).show(); }}
然后活动java代码部分
public class TestActivity extends Activity { private MyReceiver3 receiver; private IntentFilter filter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); receiver = new MyReceiver3(); //构造接收器对象 filter = new IntentFilter(); //构造过滤器对象 filter.addAction("com.ql.broadcastrceiverdemo.action3"); //给过滤器设置动作字符串 用来匹配intent的动作决定启动接收器 Button button = (Button) findViewById(R.id.sendBr); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setAction("com.ql.broadcastrceiverdemo.action3"); intent.putExtra("bc", "this is my broadcast3...."); sendBroadcast(intent);//发送一个异步广播 } }); } @Override protected void onResume() { super.onResume(); registerReceiver(receiver, filter); // 注册广播接收器,在程序可以交互时注册 } @Override protected void onPause() { super.onPause(); unregisterReceiver(receiver); // 注销广播接收器 }}
4.发送有序广播
有序,就是几个广播接收者有先后顺序,广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值可为任意数值,一般是-1000~1000之间(数值越大越高)。在清单文件的标签中设置android:priority="10"
属性。如果没有指定优先级则按在清单文件中的注册先后顺序接收。
下面我们建了个广播子类
public class MyReceiver4 extends BroadcastReceiver { private static final String TAG = "QL Debug"; @Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "Myreceiver4:" + intent.getStringExtra("bc")); Bundle bundle = new Bundle();//用bundle打包数据发送 bundle.putString("receiver4", "this is my receiver4 data."); this.setResultExtras(bundle);// this.abortBroadcast();//取消有序广播传递(可取消对后续广播接收者的继续发送) }}
public class MyReceiver5 extends BroadcastReceiver { private static final String TAG = "QL Debug"; @Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "Myreceiver5:" + this.getResultExtras(true).getString("receiver4")); }}
然后不要忘了在清单文件AndroidManifest.xml中注册。
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver4" > <intent-filter android:priority="1"> <action android:name="com.ql.broadcastrceiverdemo.action" /> </intent-filter> </receiver> <receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver5" > <intent-filter android:priority="9"> <action android:name="com.ql.broadcastrceiverdemo.action" /> </intent-filter></receiver>
最后在活动Activity中我们用按钮触发
case R.id.btn_send2: Intent intent1=new Intent(); intent1.setAction("com.ql.broadcastrceiverdemo.action"); intent1.putExtra("bc", "I come from order broadcast!"); sendOrderedBroadcast(intent1, null);//发有序广播 break;
- Android基础学习之BroadcastRceiver(通信机制)广播
- Android学习之广播机制(1)
- Android学习之广播机制(2)
- android基础学习之广播
- Android学习之Android广播机制
- Android广播机制基础
- Android学习笔记之广播机制(1)
- 【Android 学习笔记】 之 广播机制
- Android学习之广播机制BroadcastReceiver
- 学习 | Android开发之详解广播机制
- Android学习--广播机制
- Android广播机制学习
- Android 学习 广播机制
- Android学习:广播机制
- Android之广播机制
- Android Activity BroadCastRceiver 详解
- Android学习(10)-广播机制
- Android学习笔记之Android组件之BroadcastReceiver(Android广播机制)
- 813
- 我和敏捷开发的故事--敏捷角色-SM
- 触摸事件
- JSONObject 好坑啊
- 360笔试题回忆版
- Android基础学习之BroadcastRceiver(通信机制)广播
- Android和JavaScript互相调用分析
- 在积累中成长-记2015周年总结
- hdoj4617Weapon【空间直线间的距离】
- ubuntu下终端(gnome-terminal)快捷键基本使用
- java中内部类的使用
- 代理与回调的异同
- 迭代器模式
- WCF 之 AJax前台调用WCF服务