最近学校安排安卓开发大作业,40 天内要完成学习、开发、写报告的流程,于是从公共书架抽了一本《第一行代码 Android 第 2 版》就开始学了。但是此书编写于 2016 年,部分内容已经过时,比如根据书中内容无法正常接收自定义静态广播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends AppCompatActivity {
@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("cn.edu.njupt.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
}
}
1
2
3
4
5
6
7
public class MyBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Broadcast">
</Button>
</LinearLayout>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.edu.njupt.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver> <receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="cn.edu.njupt.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>

蛋疼的事情发生了:根据书中内容,点击 MainActivity 中的按钮并没有 Toast 出现。原因是:Android 8 对隐式广播进行了限制。我们指定需要接收广播的应用的包名和广播接收器类名即可。MainActivity 内修改如下:

1
2
3
4
5
6
@Override
public void onClick(View v) {
Intent intent = new Intent("cn.edu.njupt.broadcasttest.MY_BROADCAST");
intent.setComponent(new ComponentName("cn.edu.njupt.broadcasttest", "cn.edu.njupt.broadcasttest.MyBroadcastReceiver"));
sendBroadcast(intent);
}