Android基础学习之BroadcastRceiver广播

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值