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;
0 0
原创粉丝点击