静态注册无法监听隐式广播
小白进化篇
(果然省电是 Android O 的第一任务。)
Toast(…)消息弹不出来
切入正题,android O,也就是android 8.0到底做了些什么,为什么注册静态无法监听隐式广播?
不急,听我慢慢道来,可能会有意外收获哦
先整理一下如何实现一个广播接收器的功能 夹带说明为何接收不到广播以及3个 解决方法。
静态注册广播:
首先在MainActivity.java中发送广播,主要代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent=new Intent(); //建立一个intent intent.setAction("com.android.bin"); //action用法,这里随便写的,最好包名开头 sendBroadcast(intent); }
也可直接 Intent intent=new Intent(“com.android.bin”);
然后建立一个广播接收器
new---->>other—>Broadcast Receiver
重写onReceive方法,比如:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"接收到了这条信息",Toast.LENGTH_LONG).show(); }
所谓的静态注册,我们需要在AndroidManifest.xml声明
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> //这个可以百度去,它的默认值还是有点意思的 <intent-filter> <action android:name="com.android.bin"/> //和上面setAction一样即可 </intent-filter> </receiver>
添加一个知识点,不想看就跳过(借用)
静态注册到此为止结束,好吧,作为Android O(8.0) 以上开发者,广播无效 (忍不住吐槽,这个对小白真是个坑,为了提高电池续航时间,google辛苦了,还有那个Notification 的用法,8.0以上引入了channel,不注意也会坑小白)
官网早已说明,小白还是要看的 https://developer.android.com/distribute/best-practices/develop/target-sdk.html
既然限制了静态注册接收隐式广播,那么解决方法至少三两个(也看到了有强迫症的大佬提供了静态注册的解决方法,没有亲测,也感觉没有意义!这里不做说明)
1、gradle 中的targetSdkVersion 设置小于26(看上一篇blog提到了兼容性)
2、使用动态广播registerReceiver注册形式,这个不受限制(推荐)
3、使用JobScheduler。https://developer.android.com/reference/android/app/job/JobScheduler.html
对于显式广播,则依然可以通过清单注册(静态注册)的方式监听
动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的
那么如何注册一个动态广播呢?
放一个按钮吧,放不放随你,为了演示清楚
布局文件:
<?xml version="1.0" encoding="utf-8"?< 3ff7 /span>> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="动态注册发送广播" android:id="@+id/button" </RelativeLayout>
动态注册代码,为了好看懂,没搞些花里胡哨的,只需在MainActivty.java里面写就可以了
package com.android.myapplication7; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final String ACTION = "com.android,bin"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION); filter.setPriority(Integer.MAX_VALUE); //设置优先级,这里最大,不设也行 registerReceiver(MyReceiver, filter); Intent intent = new Intent(); intent.setAction(ACTION); sendBroadcast(intent); } }); } private BroadcastReceiver MyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到了来自斌哥的消息", Toast.LENGTH_SHORT).show(); } }; }
点击按钮后会出现提示信息:
- android静态注册的广播在某些手机上无法正常接收
- Android学习小记----监听电量的变化(不能静态注册的广播)
- 静态注册广播监听网络变化
- Android静态注册无法接受系统广播问题
- Android学习小记----监听电量的变化(不能静态注册的广播)
- Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动
- Android静态注册无法接受系统广播问题
- android 广播接受者静态注册 监听去电 失败
- Android学习小记----监听电量的变化(不能静态注册的广播), 保持Service不被杀死的好方法
- Android中的静态系统广播与动态系统广播及其相应的注册与接收
- Android 7.0 隐式广播-监听网络变化
- android-----关于通过AIDL注册监听之后无法解除监听的探索
- 静态注册的广播每次接收广播都会重新生成一个接收广播的对象
- Andorid广播作为内部类要如何静态注册
- android 飞行模式 注册广播后 三种状态监听
- Android通信广播的注册与监听以及自定义广播
- Android 广播 动、静态注册广播(作为内部类使用)
- Android 7.0 隐式广播-监听网络变化
- Android之广播二(静态注册实现开机启动)
- Andorid广播作为内部类要如何静态注册