乐趣区

关于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"/>
退出移动版