简单地说;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" />