广播接收器无法准确工作,除非手动注册



简单地说;BroadcastReceiver Works Manifest中定义时,但它可与简短的 delay 一起使用,并且不始终始终触发,除非注册手动

这是我创建的BroadcastReceiver,用于捕获日期更改时捕获事件(通过日(:

public class BootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, intent.getAction(), Toast.LENGTH_LONG).show();
        switch (intent.getAction()){
            case Intent.ACTION_TIME_TICK:
            case Intent.ACTION_TIME_CHANGED:
            case Intent.ACTION_TIMEZONE_CHANGED:
            case Intent.ACTION_DATE_CHANGED:
            case Intent.ACTION_BOOT_COMPLETED:
                Log.d("BroadcastReceiver", intent.getAction().toString());
        }
    }
}

此处注册在清单中,它起作用,但延迟短,也不总是触发:

<receiver android:name=".Receivers.BootBroadcastReceiver">
      <intent-filter>
           <action android:name="android.intent.action.TIME_TICK" />
           <action android:name="android.intent.action.TIME_SET" />
           <action android:name="android.intent.action.TIMEZONE_CHANGED" />
           <action android:name="android.intent.action.DATE_CHANGED"/>
           <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
</receiver>

但是,当注册手动通过我的背景服务效果很好:

public class ApplicationService extends Service{
    ...
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_DATE_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIME_TICK);
        registerReceiver(new BootBroadcastReceiver(), intentFilter);
        return START_STICKY;
    }
}

为了进一步调查此问题,我创建了两个相似的应用程序,该应用程序在 sustest> sustest 中注册的一个 BroadcastReceiver中,另一个接收器已注册手动通过Service

清单中一个所有事件在手动之后几秒钟触发。

尝试以下:

<receiver android:name=".Receivers.BootBroadcastReceiver">
  <intent-filter
        android:enabled="true"
        android:exported="true">
       <action android:name="android.intent.action.TIME_TICK" />
       <action android:name="android.intent.action.TIME_SET" />
       <action android:name="android.intent.action.TIMEZONE_CHANGED" />
       <action android:name="android.intent.action.DATE_CHANGED"/>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>

我想你可以有多个动作。

https://developer.android.com/guide/components/intents-filters.html

文档说"应用程序组件应为其可以做的每个独特作业声明单独的过滤器。"这将允许针对不同动作的细节细节

答案隐藏在意图文档中:

action_time_tick在API级别1

中添加

公共静态最终字符串action_time_tick

广播动作:当前时间已经改变。每分钟发送。你不能通过在清单中声明的组件来接收这一点,只有明确注册它上下文#registerReceiver(Broadcastreceiver,IntentFilter(。

要简单地说,您无法通过在清单中注册BroadcastReceiver接收TIME_TICK ,必须在您的应用程序组件(服务,活动等(中注册。(

在活动/片段中的任何地方定义一个bootbroadcastreceiver:

mBootBroadcastReceiver = new BootBroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.d(TAG," BootBroadcastReceiver"); //do something with intent
   }
 };
mIntentFilter=new IntentFilter("action_name");

现在在onResume((中注册bootbroadcastreceiver,然后在onpause((

中取消注册
       @Override
        protected void onResume() {
            super.onResume();
            registerReceiver(mBootBroadcastReceiver, mIntentFilter);
        }


        @Override
        protected void onPause() {
            if(mReceiver != null) {
                unregisterReceiver(mBootBroadcastReceiver);
                mBootBroadcastReceiver = null;
            }
            super.onPause();
        }

在您的清单中添加权限。

 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="ANDROID.PERMISSION.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.READ_SMS" />

最新更新