Android基础知识梳理-四大组件之BroadcastReceiver

Android基础知识梳理-四大组件之BroadcastReceiver

定义

Broadcast(广播):一种广泛应用在应用程序之间传输信息的机制;

BroadcastReceiver(广播接收器):用于接收来自系统和其他应用的广播,并对其进行响应的组件。

注册

1.定义广播接收者

继承BroadcastReceiver,实现自定义的广播接收者,实现onReceive()方法用于接受广播

public class ExampleBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = ExampleBroadcastReceiver.class.getSimpleName();
    
    private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_BOOT.equals(intent.getAction())) {
            Log.i(TAG, "receive boot completed broadcast");
            Toast.makeText(context, "system boot completed.", Toast.LENGTH_LONG).show();
        }
    }
}
复制代码

onReceive()方法执行完成之后,ExampleBroadcastReceiver生命周期结束可能会被系统回收,所以onReceive()中不建议进行异步操作;另外,由于ANR限制,onReceive()方法必须在10秒内执行完成。

2.静态注册

在AndroidManifest.xml中注册

<manifest ...>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
	<application ...>
	    <receiver
            android:name=".broadcast.ExampleBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
	</application>
</manifest>   
复制代码
  • 静态方式注册广播,即使应用未启动,也能接收到广播,所以可以利用广播作为应用的自启动和保活机制。
  • android:name:表示自定义的广播接收者类
  • action:指定了接收的广播类型,这里表示接受系统开机启动广播
  • uses-permission:声明我们需要使用到接收开机状态的权限

3.动态注册

public class ExampleActivity extends AppCompatActivity {
    private ExampleBroadcastReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myReceiver = new ExampleBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.BOOT_COMPLETED");
        registerReceiver(myReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}
复制代码
  • 在Activity的onCreate()中通过registerReceiver注册广播,并指定监听的广播类型;最后在onDestory()中关掉广播监听
  • 动态方式注册广播,用户可以在需要使用时进行注册,不再使用后关闭掉广播监听,使用上更为灵活

分类

广播可以分为无序广播(默认)、有序广播本地广播粘性(Sticky)广播

无序广播

无序广播是一种异步执行方式,所有广播接收者几乎都能同时接收到该广播,没有先后顺序,直到没有接收者再接受广播则广播结束。

  • 发送广播

    public void sendCustomBroadcast(View view){      
      Intent intent = new Intent("com.example.broadcast");     
      sendBroadcast(intent);
    }
    复制代码

有序广播

有序广播是一种同步执行方式,广播发送之后,同一时刻只会有一个广播接收者在执行广播接收,广播执行者按照优先级顺序进行广播接收,而且在接收的过程中可以截断广播,后面的接收者就无法再接收到该广播。

  • 声明广播接收者优先级

    <manifest ...>
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    	<application ...>
    	    <receiver
                android:name=".broadcast.ExampleBroadcastReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="100">
                    <action android:name="com.example.broadcast"/>
                </intent-filter>
            </receiver>
    	</application>
    </manifest>  
    复制代码

    IntentFilter中通过android:priority指定优先级,值越大优先级越高

    扫描二维码关注公众号,回复: 13755250 查看本文章
  • 发送广播

    public void sendOrderBroadcast(View view){      
      Intent intent = new Intent("com.example.broadcast");     
      sendOrderBroadcast(intent);
    }
    复制代码
  • 截断广播

     @Override
    public void onReceive(Context context, Intent intent) {
        abortBroadcast();
    }
    复制代码

    在广播接收者的onReceive()方法中,可以通过调用abortBroadcast()方法截断广播,优先级较低的广播接收者就无法再接收到该广播

本地广播

本地广播是一种局部广播,只能在本应用内部传播,广播接收者也只能接收本应用内部的广播,由于这一特点,所以本地广播不支持静态注册方式。

  • 注册本地广播接收者

    public class ExampleActivity extends AppCompatActivity {
        private ExampleBroadcastReceiver myReceiver;
        
        private LocalBroadcastManager localBroadcastManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myReceiver = new ExampleBroadcastReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.action.BOOT_COMPLETED");
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            localBroadcastManager.registerReceiver(intent, filter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            localBroadcastManager.unregisterReceiver(myReceiver);
        }
    }
    复制代码

    通过LocalBroadcastManager.getInstance()或者本地广播管理的实例,使用该实例来注册广播接收者

  • 发送广播

    private void sendBroadcast() {
        Intent intent = new Intent("com.example.broadcast");     
    	localBroadcastManager.sendBroadcast(intent);
    }
    复制代码

粘性广播

前面了解了几种广播类型,我们可以知道,当所有广播接收者处理完广播接收之后则广播结束。也就是说,只有在发送前已完成注册的广播接收者才能接收到该广播。那么如果我们在某种情况下,广播接收者注册晚于广播发送时间,但是我们又想接收到该广播,该如何处理呢?这里就需要使用到粘性广播

  • 粘性广播在发送之后会保存刚发送过的广播,当有新注册的广播接收者注册后可以继续使用该广播,直到该广播被移除;

  • 粘性广播只会保存最后一次的广播,也就是说如果在某个广播接收者注册前,发送了多条同样的广播,那么广播接收者注册后只能接收到最后一条;

  • 粘性广播通过sendStickyBroadcast()发送广播,removeStickyBroadcast()移除广播,且需要添加权限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

猜你喜欢

转载自juejin.im/post/7080442423481991205