2

AlarmManager在屏幕关闭时使用发送广播。这在大多数设备上都可以正常工作,但在某些设备(例如三星 Galaxy S4)上,接收到广播需要 30、40 甚至 120 秒,而不是指定的 20 秒。我无权访问发生这种情况的设备,因此无法检查 logcat。

这就是我设置的方式AlarmManager

AlarmManager mAlarmManager=(AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
long mInterval = 20 * 1000;
Intent i = new  Intent();
i.setAction(MY_ACTION);
mPendingIntent = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + mInterval, mPendingIntent);

这是接收者,在清单中注册:

private class MyIntentReceiver extends BroadcastReceiver {

    private static final String TAG = "MyIntentReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(MY_ACTION)) {

            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
            wl.acquire();

            Log.e(TAG, "onReceive");

            //Carry out my action...


            wl.release();

        }
    }

}
4

2 回答 2

0

我根据 CommonsWare 的示例AlarmManager.set()将该方法的参数更改为AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()而不是我的初始参数,现在它也可以在 S4 上运行。我不知道为什么不工作,因为它特别带有它的名字,并且可以在我测试过的所有其他设备上工作。AlarmManager.RTC_WAKEUP, System.currentTimeMillis()ELAPSED_REALTIME_WAKEUPWAKEUP

于 2013-09-20T21:06:47.087 回答
0

AlarmManager的行为随着API 19的到来而改变。在阅读更新的 Javadoc 之前,在对曾经运行良好的应用程序进行故障排除方面浪费了许多时间。

注意:从 API 19 ( KITKAT ) 开始,警报传递是不准确的:操作系统将切换警报以最大限度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;见setWindow(int, long, long, PendingIntent)setExact(int, long, PendingIntent)。早于 API 19的应用程序targetSdkVersion将继续看到以前的行为,即所有警报都在请求时准确传递。

于 2016-02-06T05:46:47.167 回答