发送广播
public static void sendBroadcast(Context context) {
Intent intent = new Intent("com.xxx.xxx");
intent.putExtra("key", "value");
context.sendBroadcast(intent);
}
通过 context.sendBroadcast()
发送无序广播
通过 context.sendOrderedBroadcast()
发送有有序广播
无序广播
无序广播将在发送后同时传递给接收者,无法区分先后顺序,无法终止,但是传递效率较高
有序广播
有序广播的接收者,将按照定义的优先级顺序依次接收广播,并且可以将结果等信息向下传递,也可以中断广播使后面的接收者都接收不到广播。
接收广播
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
intent.getStringExtra("xxx");
}
}
注册广播分为两种:
代码动态注册:
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter itFilter = new IntentFilter();
itFilter.addAction("com.xxx.xxx");
itFilter.setPriority(1000); // 设置优先级
context.registerReceiver(myBroadcastReceiver, itFilter);
// 解除注册
context.unregisterReceiver(myBroadcastReceiver);
动态注册有个缺点就是需要app启动才可以接收广播,xml文件注册,不需要启动app也能接收广播
xml文件静态注册:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="com.xxx.xxx" />
</intent-filter>
</receiver>
priority 属性是广播的优先级,取值范围为 -1000~1000
有序广播
中断广播
abortBroadcast();
向后传值
Bundle bundle = new Bundle();
bundle.putString("key", "xxx");
setResultExtras(bundle);
接收参数
Bundle bundle = getResultExtras(true);
bundle.getString("key");
利用广播实现开机启动
manifest 标签下:
<!--.接收启动完成的广播权限-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
application 标签下:
<!--开机自启动广播-->
<receiver android:name=".broadcast.BootBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
/**
* 开机自启动广播
*/
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (TextUtils.equals(intent.getAction(), ACTION)) {
L.i("接收到开机广播:" + intent.getAction() + " ACTION:" + ACTION);
Intent newIntent = new Intent(context, HomeActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
}
}
}