关于android: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指定优先级,值越大优先级越高

  • 发送播送

    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"/>

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理