安卓广播简单使用

-广播是跨进程的通信方式,任何应用都可以收到不同程序发出的广播。
接收广播需要进行广播注册,才能接收到对应广播。

  • 必须程序启动后才能接受广播
  • 动态注册的广播接收器都要取消注册
  • //实例化IntentFilter和MyReceiver对象
      IntentFilter intentFilter = new IntentFilter();
      MyReceiver myReceiver = new MyReceiver();  
    //为IntentFilter添加action,广播接收器才能监听到发出以下值的广播
     intentFilter.addAction("android.intent.action.ACTION_POWER_CONNECTED");  
    //注册,传入广播接收器对象和IntentFilter对象
    registerReceiver(myReceiver,intentFilter);
    //在onDestroy里解除注册
    @Override
    protected void onDestroy(){
        super.onDestroy();
        unregisterReceiver(myReceiver);
    
  • <application>下添加新标签<receiver>
  • Android Studio快捷创建广播接收器,右键包名->New->Other->Broadcast Receiver
  • <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=".MyReceiver"  //广播接收器名
                android:enabled="true"      //表示是否启用此广播接收器
                android:exported="true">  //表示是否允许接收本程序以外的广播
                <intent-filter>
                    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    //添加相应广播值的action
                </intent-filter>
            </receiver>
        </application>
    

    创建广播接收器,定义一个类继承自BroadcastReceiver,并重写父类onReceive()方法,当接收到广播时,就会执行onReceive()方法

  • 广播接收器中不允许开启线程,因为广播接收器生命周期非常短,容易对开启的线程失去控制
  • 不要在onReceive()方法中添加过多逻辑或耗时操作
  • public class MyReceiver extends BroadcastReceiver{
            @Override
            public void onReceive(Context context, Intent intent) {
                        //实现逻辑
    

    发送自定义广播

    1.发送标准广播

    Intent intent=new Intent("com.example.MY_BROADCAST");
    sendBroadcast(intent);
    

    构建一个Intent对象,将要发送的广播值传入,然后调用sendBroadcast()方法,就可以将此广播发送出去
    2.发送有序广播

    Intent intent  = new Intent("com.example.MY_BROADCAST");
    //传入Intent对象,第二个参数与权限有关的字符串,可传入null
    sendOrderedBroadcast(intent,null);
    
  • 发送有序广播,广播接收器有接收顺序,优先级高的先接收到,并可以阻断其继续传播,在onReceive()方法中调用abortBroadcast()方法,截断这条广播
  • 在AndroidManifest.xml中设置广播接收器的优先级priority
  • <receiver
           .......
          <intent - filter android:priority="100">
              <action ........................../>
          </intent - filter>
    </receiver>
    

    使用本地广播

    本地广播只在应用内部传递,使用本地广播主要使用LocalBroadcastManager对广播进行管理,并提供发送广播和注册广播接收器的方法

    //调用getInstance()得到LocalBroadcastManager对象
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
    //广播接收器对象和IntentFilter对象
    MyReceiver myreceiver = new MyReceiver();
    IntentFilter intentFilter = new IntentFilter();
    //添加action
    intentFilter.addAction("com.example.MY_BROADCAST");
    //注册本地广播监听器
    localBroadCastManager.registerReceiver(myReceiver,intentFilter);
    //解除注册
    localBroadcastManager.unregisterReceiver(myReceiver);