android静态注册监听系统广播,如何只让本工程能够使用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android静态注册监听系统广播,如何只让本工程能够使用?相关的知识,希望对你有一定的参考价值。

现在我静态注册了一个广播事件,监听wifi连接状态,这是系统发出的广播,然后根据wifi状态的改变给出提示信息,但是当我退出程序之后,直接切换手机的wifi,该广播还是会响应,我查询了一下说可以使用android:exported="false"来进行限制,但是我加上这个之后还是不行,这个究竟要如何处理呢?

在自己的功能中加一个标记为,退出的时候设为false,然后在监听广播处理的地方判断这个标记位,如果是false就不处理接收到的广播。

这样不就好了?其实干嘛不直接用动态注册呢?追问

这样应该是可以的,我写的广播时间是要多次使用的,考虑到用动态注册在不同类当中就要重写一次很不方便,用静态注册就只需要根据传入的参数进行判断就好了

追答

可以将这个flag设置为监听类的静态变量,并在监听类中加入静态设置函数:

private static boolean flag = false;

public staitc void setFlag(boolean flag)
this.flag = flag;



应用程序启动时设置这个flag为true,退出时设置为flag

然后就可以在监听类的action中处理

public void onRecieve()
if(!flag) return ; //如果应用程序已经退出,那么不处理

参考技术A 程序退出时完全退出应该就收不到了吧。追问

使用System。exit(0)退出之后还是能接收到的

特殊广播如何实现后台监听

前言

Android8.0版本开始,对静态注册广播事件做了限制。但开发中,有时候却需要实现在后台长期运行一些广播事件的监听,处理一些业务。如:时间的监听。

既然Google对配置文件中静态注册做了限制,那我们该如何在后台长期维护一个监听事件呢?下面咱们就来一起学习下吧。

正文

  • 由于特殊广播静态注册无效,必须动态注册,而在Activity中动态注册后,当Activity退出后,就无法接收指定的特殊广播事件了。
  • 但Services(服务)是可以长期运行在后台的,那么在Service中动态注册指定的特殊广播事件监听,是否可以有效的保证广播监听长期运行?答案是肯定的。(废话不多说了,直接上代码)

需求:应用A实现对屏幕开、关的监听,且要求即便应用A退出后,依然可以监听到屏幕的开、关事件(以Log打印为例)

  • SpecialListenerReceiver(创建一个广播接收者)
//定义一个特殊的广播接收者:监听特殊广播。如:屏幕的开与关
public class SpecialListenerReceiver extends BroadcastReceiver 
    @Override
    public void onReceive(Context context, Intent intent) 
        //获取广播事件类型
        String action = intent.getAction();
        if ((Intent.ACTION_SCREEN_ON).equals(action)) 
            Log.e("特殊的广播", "开...");
         else if ((Intent.ACTION_SCREEN_OFF).equals(action)) 
            Log.e("特殊的广播", "关...");
        
    
  • SpecialListenerService(创建一个服务,服务内注册特殊广播事件)
//为监听:特殊广播 而创建的服务
public class SpecialListenerService extends Service 

    private SpecialListenerReceiver listenerReceiver;

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    
    @Override
    public void onCreate() 
        super.onCreate();
        //创建一个意图过滤器对象,并添加广播事件
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        listenerReceiver = new SpecialListenerReceiver();
        //注册广播事件
        this.registerReceiver(listenerReceiver, filter);
    

    @Override
    public void onDestroy() 
        super.onDestroy();
        if(listenerReceiver!=null)
            this.unregisterReceiver(listenerReceiver);
        
    
  • 特别注意:在 AndroidManifest.xml 文件中配置服务
    广播接收者无序清单文件中再次注册了(服务中已经动态注册)
<service android:name=".SpecialListenerService" />
  • 在 Activity 中开启服务
public class MainActivity extends BaseActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, SpecialListenerService.class);
        this.startService(intent);//开启服务
        Log.e("特殊的广播", "MainActivity的【onCreate】方法执行");
    
    @Override
    protected void onDestroy() 
        super.onDestroy();
        Log.e("特殊的广播", "MainActivity的【onDestroy】方法执行");
    

Log 打印展示
技术图片

  • 当 MainActivity 的onCreate方法执行后,服务开启,关闭屏幕和点量屏幕,服务内注册的广播可以监听(此时应用还未退出)
  • 当 MainActivity 的onDestroy方法执行后,表示当前应用已退出(不再是前台进程),再次操作屏幕的关闭和点亮,依然可以接收到广播事件。实现了后台长时间接收特殊广播事件的操作!

Surface: getSlotFromBufferLocked: unknown buffer: 0xb40bd840是我使用模拟器的原因,忽略即可。

以上是关于android静态注册监听系统广播,如何只让本工程能够使用?的主要内容,如果未能解决你的问题,请参考以下文章

广播机制之动态注册和静态注册

Android开发 广播监听系统的各种状态

Android 监听屏幕唤醒和关闭的广播

监听App安装卸载的系统广播

遇到难题求高手帮忙解决--Android P开始监听不到关机广播

Android入门第48天-静态BroadCast之接受开机广播