BroadcastReceiver广播接收器简介及基本用法

来源:互联网 发布:php接口开发实例代码 编辑:程序博客网 时间:2024/05/16 07:06
**本质上就是一个全局的监听器,用于监听系统全局的广播消息**。由于BroadcastReceiver是一种全局的监听器,因此它可以方便地实现系统中不同组件之间的通信。BroadcastReceiver和事件处理机制相似,事件处理机制是程序级别的,广播接收器系统级别的监听器,拥有自己的进程,只要系统中存在着与之匹配的Intent被广播出来, BroadcastReceiver总会被激发。BroadcastReceieve生命只有十秒左右,如果在onCreate()方法里做超过10秒的操作,就会报错,若需要耗时操作可以通过Itent启动一个Service。有静态注册和动态注册两种方式,静态注册是在AndroidManifest.xml文件中配置,是常住型如下:
 <receiver android:name="zhidisoft.broadcastreceiver.BroadcastReceiverTset"> //继承BroadcastReceiver,重写onReceiver()方法    <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED"></action>//使用过滤器,接收指定地址广播    </intent-filter></receiver>

动态注册,特点是非常驻型,在代码中能够指定广播地址并注册,相当于给广播增加选台按钮。

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private ScreenBroadcastReceiver screenBroadcastReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        intentFilter=new IntentFilter();//为BroadcastReceiver指定action,使之用于接收同action的广播        intentFilter.addAction(Intent.ACTION_SCREEN_ON);//指定屏幕打开时        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//指定屏幕关闭时        screenBroadcastReceiver=new ScreenBroadcastReceiver();        registerReceiver(screenBroadcastReceiver,intentFilter);//注册    }    class ScreenBroadcastReceiver extends BroadcastReceiver{        private String action=null;        @Override        public void onReceive(Context context, Intent intent) {            action=intent.getAction();//获取广播            if (Intent.ACTION_SCREEN_OFF.equals(action)){                Intent intent1=new Intent(context,Myservice.class);                intent1.putExtra("data",action);                context.startService(intent1);//启动Service并传值            }else if (Intent.ACTION_SCREEN_ON.equals(action)){                Intent intent1=new Intent(context,Myservice.class);                intent1.putExtra("data",action);                context.startService(intent1);                Toast.makeText( MainActivity.this, "动态注册", Toast.LENGTH_SHORT).show();            }        }    }    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(screenBroadcastReceiver);//动态注册的广播一定记得取消注册,防止内存泄漏;    }}

最后就是发送广播了,用的是sendBroadcast,将一个指定地址和参数信息的Intent对象以广播的形式发送出去。
Intent intent = new Intent(“com.zhidi.MY_BROADCAST”);
intent.putExtra(“msg”, “嗨,我是智递科技广播,频段com.zhidi.MY_BROADCAST”);
sendBroadcast(intent);
注:发送广播sendBroadcast类似于给建立一个电台。
发送广播无序广播和有序广播,有序广播根据优先级使用sendOrderedBroadcast()方法;

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="zhidisoft.sendbroadcast">    <permission android:name="zhidisoft.sendbroadcast.receiverPermission"        android:protectionLevel="normal"></permission>//声明权限    <uses-permission android:name="zhidisoft.sendbroadcast.receiverPermission"></uses-permission>//获取权限    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name=".MyBroadcastReceieve" >            <intent-filter android:priority="10">//priority定义优先级                <action android:name="zhidisoft.sendbroadcast.BROADcast" ></action>//指定要接收的广播            </intent-filter>        </receiver>        <receiver android:name=".MySecondBroadcastReceieve">            <intent-filter android:priority="-100">                <action android:name="zhidisoft.sendbroadcast.BROADcast" ></action>            </intent-filter>        </receiver>        <receiver android:name=".MyThirdBroadcastReceieve">            <intent-filter android:priority="199">                <action android:name="zhidisoft.sendbroadcast.BROADcast" ></action>            </intent-filter>        </receiver>    </application></manifest>

注册完成后在MainActivity中发送广播
public class MainActivity extends Activity {
Button button;
String MY_BROAD=”zhidisoft.sendbroadcast.BROADcast”;
String receiverPermission=”zhidisoft.sendbroadcast.receiverPermission”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.aaaaa);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MY_BROAD);
sendOrderedBroadcast(intent,receiverPermission);//使用sendOrderedBroadcast发送有序广播
}
});
}

0 0