/*
有序广播 高优先级的 Receiver 可以决定低优先级的 Receiver 是否还能收到广播
无序广播 所有广播都是异步同时发送,此时 Receiver 的接收时序也是完全随机的。
正因为异步且无需保证时序,所以无需广播更高效,但是不能在各个 Receiver 之间传递数据。
静态注册 在 AndroidManifest.xml 中添加以下注册代码 注册的是接收器。静态注册的程序不管是否启动
,都可以收得到匹配的广播的,并对这个广播操作。
动态注册 通过Context.registerReceiver()方法进行注册
只有静态动态注册,没有静态动态接收,注意清单文件里的权限和可接收广播类型(系统或自定义)。
创建一个类继承自BroadcastReceiver,然后覆写onReceive(Context context, Intent intent)方法
,其中广播传递的参数就在 intent 当中,我们可以在 onReceive() 方法中取出。
同样在APP之间也可以进行广播,APP1和APP2一样,有mainactivity和BR,在APP1输入内容,发送广播,被APP2接收器接收并显示出来。
https://www.jianshu.com/p/e9b97a5e8149 系统广播
*/
public class MainActivity extends AppCompatActivity {
public static final String MY_ACTION = "com.imooc.demo.My_Broadcast";//自定义广播名
public static final String BROADCAST_CONTENT = "broadcast_content";//数据名
private ImoocBroadcastReceiver mBroadcastReceiver;
private EditText mInputEditText;
private Button mSendBroadcastButton;
private TextView mResultTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取包名做title
setTitle(getPackageName());
mInputEditText = findViewById(R.id.inputEditText);
mSendBroadcastButton = findViewById(R.id.sendBroadcastButton);
mResultTextView = findViewById(R.id.resultTextView);
//动态注册
// 新建广播接收器 没有参数 , 也可传入参数 根据接收器的构造方法。
mBroadcastReceiver = new ImoocBroadcastReceiver(mResultTextView);
// 注册广播接收器 实例化意图过滤器 为广播接收器添加Action
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.PACKAGE_REMOVED");//应用被卸载广播
intentFilter.addAction(MY_ACTION);//自定义广播
registerReceiver(mBroadcastReceiver, intentFilter);
//点击事件:发送广播,接收用户的输入,塞入 intent 并通过 Broadcast 发送出去
mSendBroadcastButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 新建广播
Intent intent = new Intent(MY_ACTION);//自定义广播
// 放入广播要携带的数据(String name,String value) 名字对应的值
intent.putExtra(BROADCAST_CONTENT, mInputEditText.getText().toString());
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注册广播接收器,不然会导致内存泄露
if (mBroadcastReceiver != null) {
unregisterReceiver(mBroadcastReceiver);
}
}
}
/*
广播接收器,接收广播并传入参数TextView把TextView内容显示出来。
*/
public class ImoocBroadcastReceiver extends BroadcastReceiver {
TextView mTextView;
public ImoocBroadcastReceiver() {
}
//mainactivity里调用这个广播接收器的构造方法,可传入参数
//限制广播功能
public ImoocBroadcastReceiver(TextView textView) {
mTextView = textView;
}
private static final String TAG = "ImoocBroadcastReceiver";
//重写该方法
@Override
public void onReceive(Context context, Intent intent) {
// 接收广播
if (intent != null) {
// 接收到的是什么广播
String action = intent.getAction();
Log.d(TAG, "onReceive:接收到的消息: " + action);
// 判断是什么广播(是不是我们自己发送的自定义广播)
if (TextUtils.equals(action, MainActivity.MY_ACTION)) {
// 获取广播携带的内容, 获取广播中名字对应的值
String content = intent.getStringExtra(MainActivity.BROADCAST_CONTENT);
if (mTextView != null) {
//应在main里面的新建接收器时把该参数写入防止此时为空。
mTextView.setText("接收到的action是:" + action + "\n接收到的内容是:\n" + content);
//action为 MY_ACTION = "com.imooc.demo.My_Broadcast"
//content为 广播中携带的广播源的输入的内容
}
}
}
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jinanchang.broadcastapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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=".ImoocBroadcastReceiver">
<!-- 接收哪些广播 -->
<intent-filter>
<!-- 开机广播 -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!-- 电量低广播 -->
<action android:name="android.intent.action.BATTERY_LOW" />
<!-- 应用被安装广播 -->
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<!-- 应用被卸载广播 -->
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<!-- 数据类型 -->
<data android:scheme="package" />
<!-- 自定义广播 -->
<action android:name="com.imooc.demo.afdsabfdaslj" />
</intent-filter>
</receiver>
</application>
</manifest>
还有APP间和activity间,见收藏。