《第一行代码(第2版)》5.3.1和5.3.2在模拟器上和真机上运行有些问题,这里我讲一下我的解决办法
我们知道注册广播的方式一般有两种:
1.在代码中注册(也被称为动态注册)。
2.AndroidManifest.xml中注册(也被称为静态注册)。
在同一个进程上发送自定义广播并接收:
首先建一个BroadcastTest空项目
第一步:使用Android Studio提供的快捷方式来创建一个广播接收器来准备接收此广播,点击app—>New—>Other—>Broadcast Receiver,这里将广播接收器命名为MyBroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
当MyBroadcastReceiver收到自定义广播时会弹出“received in MyBroadcastReceiver”的提示
第二步:在AndroidManifest.xml中对这个广播接收器进行修改
这里让MyBroadcastReceiver接收一条值为com.example.broadcasttest.MY_BROADCAST的广播,因此待会儿发送广播时我们需要发出这样的一条广播。
第三步:修改activity_main.xml中的代码
这里定义了一个按钮用于作为发送广播的触发点
第四步:修改MainActivity中的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName("com.example.broadcasttest",
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
}
});
注意:(书上没有)这里在用sendBroadcast(intent)把广播发送出去之前调用了 setComponent方法指定广播接收器,效果图如下(此处我是模拟器测试需要调用该方法,但是真机测试没有该方法也能接收到)
setComponent(new ComponentName(指定接收的包,指定接收器)
跨App(进程)发送自定义广播:(下面的内容部分书上没有)
第一步:需要在上一个项目的AndroidManifest.xml添加
第二步:需要修改上一个项目的MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置你这个广播的action,只有和这个action一样的接受者才能接收广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
/*intent.setComponent(new ComponentName("com.example.broadcasttest",
"com.example.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);*/
sendBroadcast(intent,"com.example.broadcasttest.MY_BROADCAST");
}
});
第三步:新建一个项目BroadcastTest2,按照上面第一步新建一个广播接收器AnotherBroadcastReceiver
public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_LONG).show();
}
}
第四步:修改第二个项目的Manifest.xml
最后在模拟器上(真机上测试我只有第一个广播接收器接收到广播)运行第二个项目,跳转到第一个项目,点击按钮,效果如图
注:上面的两个图是从网上截图下来的