IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 接收不到静态广播(自定义广播) -> 正文阅读

[移动开发]Android 接收不到静态广播(自定义广播)

最近,我在学习 Android 广播接收器时发现了个问题,就是我按照书上的方式去自定义一个静态广播,然后却怎么也接收不到自己定义的广播。我当时自定义静态广播的代码如下,

定义广播:

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("android.test.broadcasttest.BROADCAST_TEST");
                intent.putExtra("message","你妈喊你回家吃饭了");
                sendBroadcast(intent);
            }
        });
    }
}

定义接收器:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, intent.getStringExtra("message"), Toast.LENGTH_SHORT).show();
    }
}

静态注册接收器:

<receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.test.broadcasttest.BROADCAST_TEST"/>
            </intent-filter>
</receiver>

就是按照上述代码运行程序的,结果却没有接收到广播,一度让我产生自我怀疑,然后我就把代码上上下下检查了一遍,但发现代码并没有错。于是有问题找度娘,我又去网上折腾了一遍,终于找到了解决办法。网上普遍的做法是这样的:在发送广播前,需要使用 setComponent() 方法指定将要作用的应用包名和类名,

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("android.test.broadcasttest.BROADCAST_TEST");
                intent.setComponent(new ComponentName("android.test.broadcasttest",
                        "android.test.broadcasttest.MyBroadcastReceiver"));
                intent.putExtra("message","你妈喊你回家吃饭了");
                sendBroadcast(intent);
            }
        });

到这里,虽然解决问题了,但我还是没能明白这么做的原因。于是,有疑问找官方,我又去翻了一下谷歌的官方文档,找到的解释是这样的:

Broadcasts overview ?|? Android Developers

Android 8.0

Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers.

If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a?context-registered receiver?when the user is actively using your app.

翻译:

从Android 8.0(API级别26)开始,该系统对声明清单的接收者施加了额外的限制。

如果你的应用目标是Android 8.0或更高版本,你不能使用清单为大多数隐式广播(不是专门针对你的应用的广播)声明接收器。当用户正在使用你的应用程序时,你仍然可以使用上下文注册的接收器。

大致意思是官方在这方面做了限制,定义的静态广播必须指定范围(应用),类似于生活中广播的频道。

既然如此,其实指定广播的应用包名就行了,这样更加灵活和方便:

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("android.test.broadcasttest.BROADCAST_TEST");
                intent.putExtra("message","你妈喊你回家吃饭了");
                intent.setPackage(getPackageName());
                sendBroadcast(intent);
            }
        });
    }

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:12:56  更:2022-03-06 13:14:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:03:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码