最近学校安排安卓开发大作业,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); }
|