一、广播上Android的四大组件之一,广播是通过intent发送的。可以分为三类:标准广播、有序广播、粘性广播:
标准广播(Normal roadcast):完全异步执行的广播,广播发出之后所有应用同时接收到广播,效率高无法被截断
有序广播(Ordered broadcast):同步广播,同一时刻只有一个广播接收器收到,并且等广播接收器中的逻辑执行完毕,后才可以继续传递;是可以截断的,阻止广播传递;存在广播的优先级
二、广播接收器可以有两种注册方式:Andriodmainfest.xml静态注册;代码动态注册
1)、静态注册
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcastTest.MY_BROADCAST"/>
</intent-filter>
</receiver>
2)、动态注册
package com.example.mrdouya.mybroadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//intentFilter中添加广播接受器需要接受的广播
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//初始化自定义的广播接受器NetworkChangeReceiver
networkChangeReceiver = new NetworkChangeReceiver();
//注册广播接受器
registerReceiver(networkChangeReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册广播接受器NetworkChangeReceiver
unregisterReceiver(networkChangeReceiver);
}
//自定义广播接受器NetworkChangeReceiver
private class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"net work changes",Toast.LENGTH_LONG).show();
}
}
}
三、如何发送广播?
1.发送标准广播
a.8.0之前可以隐式发送广播
Intent intent = new Intent("com.example.broadcastTest.MY_BROADCAST");
sendBroadcast(intent);
b.8.0需要显示发送广播
Intent intent = new Intent();
intent.setAction("com.example.broadcastTest.MY_BROADCAST");
intent.setComponent(new ComponentName(MainActivity.this,MyBroadcastReceiver.class));
sendBroadcas
sendBroadcast(intent);
这种显示发送广播,居然可以不配置Action(因为指定了广播接收器吗?)。发送有序广播之后,跨进程接收时,广播接收器必然需要动态注册(除了少数系统广播外,是无法接收的,因为需要显示调用)。
2.发送有序广播
Intent intent = new Intent();
intent.setAction("com.example.mrdouya.mybroadcaettest2.MY_ANATHOR_BROADCAST");
//intent.setComponent(new ComponentName(MainActivity.this,MyBroadcastReceiver.class));
sendOrderedBroadcast(intent,null);
3.截断广播
abortBroadcast();
4.在AndroidManif中设置广播接收器的优先级
<intent-filter android:priority="25">
5.发送本地广播
本地广播只允许广播在广播所在程序内部进行传递,使安全性得到了保证,与有序广播相比只多了一个LocalBroadcastManager,其它使用方式一致
//声明
private LocalBroadcastManager localBroadcastManager;
//获取实例、注册、取消注册、发送广播
localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
localReceiver = new LocalReceiver();
myLocalIntentFilter = new IntentFilter();
myLocalIntentFilter.addAction("com.example.broadcastTest.MY_LOCAL_BROADCAST");
localBroadcastManager.registerReceiver(localReceiver,myLocalIntentFilter);
localBroadcastManager.unregisterReceiver(localReceiver);
Intent intent = new Intent("com.example.broadcastTest.MY_LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
四、adb命令发送广播、键值
1.发送广播
adb shell am broadcast -a 广播
2.发送键值
adb shell input keyevent 键值(手机的按键对应的键值,可在farmework中的keyevent.java中查询)
3.发送带各种类型的参数
adb shell am broadcast -a com.Android.test --es test_string "this is test string" --ei test_int 100 --ez test_boolean true