顺序广播
发送:sendOrderedBroadcast(Intent, String)
该方法一次向一个接收器发送广播。当每个接收器依次执行时,它可以将结果传播到下一个接收器,或者它可以完全中止广播,这样就不会将结果传递给其他接收器。可以使用匹配意图过滤器的android:priority属性控制接收程序的运行顺序;具有相同优先级的接收程序将以任意顺序运行。
//参数2,设置广播权限(permission)
sendOrderedBroadcast(intent,Manifest.permission.SEND_SMS);
正常广播
发送:sendBroadcast(Intent)
该方法以未定义的顺序向所有接收器发送广播。这称为正常广播。这更有效,但意味着接收器无法读取其他接收器的结果、传播从广播接收到的数据或中止广播。
public class MainActivity extends AppCompatActivity {
Receiver1 receiver1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* dynamic register
*/
receiver1 = new Receiver1();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("dynamic");
//注册广播
registerReceiver(receiver1,intentFilter);
findViewById(R.id.btn_dynamic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("dynamic");
//发送广播
sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
/取消注册
unregisterReceiver(receiver1);
}
}
本地广播
发送:LocalBroadcastManager.sendBroadcast
该方法将广播发送到与发送方位于同一应用程序中的接收器。如果不需要跨应用程序发送广播,请使用本地广播。该实现效率更高(不需要进程间通信),而且您不必担心与其他应用程序能够接收或发送广播相关的任何安全问题。
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
localBroadcastManager.sendBroadcast(intent);
接收本地广播也要用 LocalBroadcastManager
/**
* dynamic register
*/
receiver1 = new Receiver1();
IntentFilter intentFilter = new IntentFilter();
//这里的action和广播发送处的action是对应的
intentFilter.addAction("dynamic");
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
localBroadcastManager.registerReceiver(receiver1,intentFilter);
/**
* 在恰当的地方取消注册
*/
localBroadcastManager.unregisterReceiver(receiver1);
发送带权限的广播
以正常广播为例
public class MainActivity extends AppCompatActivity {
Receiver1 receiver1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* dynamic register
*/
receiver1 = new Receiver1();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("dynamic");
//注册广播时,带上相应的权限
registerReceiver(receiver1,intentFilter,Manifest.permission.SEND_SMS,null);
findViewById(R.id.btn_dynamic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//广播信息的载体是intent对象
Intent intent = new Intent();
//intent的action标识广播的活动/事件
intent.setAction("dynamic");
//发送带权限的广播
sendBroadcast(intent, Manifest.permission.SEND_SMS);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver1);
}
}
或者静态注册broadcast receiver,在<manifest> - <application>中添加
<receiver android:name=".Receiver1"
android:permission="android.permission.SEND_SMS">
<intent-filter>
<action android:name="dynamic"/>
</intent-filter>
</receiver>
一定要在<manifest>中请求相应权限
<uses-permission android:name="android.permission.SEND_SMS"/>
然后用户授权,才有效