在任何人将我的问题报告为重复之前,我已经检查了几十个类似的问题,但没有任何成功。
我制作了一个闹钟应用程序似乎适用于所有设备,但是我的,或者是用户或者没有一个用户在向我报告此问题。
我遇到的问题是当我的设备睡着时我的闹钟没有触发。在警报响起几分钟后,我经常自己醒来,只要按下电源按钮,我的电话就会唤醒然后警报响起。
如果我正在使用我的手机,我的应用程序可以正常工作,这实际上并不是它的理想用途。
如果我杀了这个过程,它也不会消失。
以下是我的代码,希望你们能帮助我:
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>