尝试找出屏幕关闭时触发我的BroadcastReceiver的原因。 屏幕解锁后,触发“到达”延迟。当屏幕打开时,接收器会及时触发。
Android 4.4.2(Danew Dslide 710)上出现问题,代码在许多其他设备上运行良好
PendingIntent传递给AlarmManager,如下所示:
Context context = getApplicationContext();
Intent intent = new Intent("com.myapp.TEST_ACTION");
intent.putExtra(XTRA_KEY_CONFIG_ID, id);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, reqCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManger am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
am.setExact(AlarmManager.RTC_WAKEUP, alarmTime, alarmIntent);
我在服务中运行上面的代码,但是使用AlarmManager的应用程序上下文。
清单如下所示:
...
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
...
<receiver android:name=".AlarmTriggerReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.myapp.TEST_ACTION" />
</intent-filter>
</receiver>
我的收件人代码:
public class AlarmTriggerReceiver extends BroadcastReceiver
{
@Override
public void onReceive(final Context argCTX, Intent intent)
{
// writing a log entry here, but see it delayed at the time
// the screen gets unlocked only
// onReceive gets called in time when device screen is on
}
}
由于在调用触发器之前调用Application-class中的代码,我删除了Application类(init google analytics)中的所有代码,以确保它不会因某种原因而挂起。
代码的行为好像我会使用Alarmmanagers“.set”(而不是“.setExact”),所以我认为这个问题可能与电源管理有关。
其他闹钟应用程序,如谷歌的descclock在该设备上运行良好。
非常感谢任何建议和想法!
修改1:
在将PendingIntent设置为AlarmManager后,应用程序活动仍然可见并且屏幕自行锁定(几秒钟后),将及时触发BroadcastReceiver。按 HOME 并使用 POWER 按钮手动锁定屏幕后,会出现上述问题。