如何解决 Android 8 自定义静态广播接受不到的问题

皮康龙发布

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

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);
            }
        });
    }
}
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}
<?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>
        <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 内修改如下:

            @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);
            }
分类: 未分类

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注