当设备处于睡眠状态时,AlarmManager不会正确触发警报

时间:2016-12-24 01:04:56

标签: java android alarmmanager

在任何人将我的问题报告为重复之前,我已经检查了几十个类似的问题,但没有任何成功。

我制作了一个闹钟应用程序似乎适用于所有设备,但是我的,或者是用户或者没有一个用户在向我报告此问题。

我遇到的问题是当我的设备睡着时我的闹钟没有触发。在警报响起几分钟后,我经常自己醒来,只要按下电源按钮,我的电话就会唤醒然后警报响起。

如果我正在使用我的手机,我的应用程序可以正常工作,这实际上并不是它的理想用途。

如果我杀了这个过程,它也不会消失。

以下是我的代码,希望你们能帮助我:

public static void scheduleAlarm(Context context, Alarm alarm)
{
    AlarmRepository.getInstance(context).update(context, alarm.getId(), alarm);
    AlarmManager manager = (AlarmManager)context
            .getSystemService(Context.ALARM_SERVICE);
    long triggerTime = BackEndTools
            .getNextValidTriggerTime(alarm);
/* getNextValidTriggerTime calculates whether the alarm
 * should go off on the following day, in case it's been
 * set to a time equal to or before now */
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.setAction(AppConstants.ACTION_TRIGGER_ALARM);
    intent.putExtra(AppConstants.EXTRA_ID, alarm.getId());
    PendingIntent pendingIntent =
            PendingIntent.getBroadcast(context, alarm.getId(), intent, 0);
    if (AppConstants.OS_VERSION < Build.VERSION_CODES.KITKAT)
        manager.set(RTC_WAKEUP, triggerTime, pendingIntent);
    else
        manager.setExact(RTC_WAKEUP, triggerTime, pendingIntent);
}

现在这是我的BroadcastReceiver

public class AlarmReceiver extends WakefulBroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        int id = intent.getIntExtra(AppConstants.EXTRA_ID, AppConstants.DEFAULT_INTENT_EXTRA);
        Alarm alarm = AlarmRepository.getInstance(context).select(context, id);
        if (intent.getAction().equals(AppConstants.ACTION_TRIGGER_ALARM))
            AlarmHandler.handleReceivedAlarm(context, alarm);
        else if (intent.getAction().equals(AppConstants.ACTION_SLEEP_CHECKER))
            AlarmHandler.handleReceivedSleepChecker(context, alarm);
        else if (intent.getAction().equals(AppConstants.ACTION_SNOOZE))
            AlarmHandler.handleSnoozeTask(context, alarm);
    }
}

这是AlarmHandler.handleReceivedAlarm

public static void handleReceivedAlarm(Context context, Alarm alarm)
{
    Intent activityIntent = new Intent(context, AlarmActivity.class);
    activityIntent.putExtra(AppConstants.EXTRA_ID, alarm.getId());
    activityIntent.setAction(AppConstants.ACTION_TRIGGER_ALARM);                  
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(activityIntent);
}

最后,我AndroidManifest的相关部分:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
     android:name=".backend.AlarmReceiver"
     android:enabled="true"
     android:exported="false">
 <intent-filter>
     <action android:name="com.mypackage.myapp.ACTION_TRIGGER_ALARM"/>
     <action android:name="com.mypackage.myapp.ACTION_SLEEP_CHECKER"/>
     <action android:name="com.mypackage.myapp.ACTION_SNOOZE"/>
 </intent-filter>
</receiver>

0 个答案:

没有答案