设置较长时间后,Android AlarmManager无法正常工作

时间:2016-03-22 17:45:29

标签: android android-alarms

在我的应用中,我尝试使用此代码设置闹钟:

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, 2016);
        calendar.set(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 15);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 1);
        calendar.set(Calendar.MILLISECOND, 1);

        Intent intent = new Intent(G.context, AlarmService.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext, 1010, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        G.alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

当我将闹钟设置为1分钟或更晚时,它会起作用,但是当我将闹钟设置为30或40分钟后,它不起作用。虽然我没有打电话30分钟,30分钟后闹钟无法正常工作,当手机屏幕亮起时,报警功能正常...

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

好的,因为经过很长一段时间(让我们说超过5分钟),你的应用程序暂停,然后手机就会睡着了#34;带锁屏。解锁后,您会收到警报,因为它已排队。 要解决此问题,您需要实施唤醒锁并将其权限添加到清单文件中。 根据Google文档"唤醒锁是一种机制,用于指示您的应用程序需要让设备保持运行状态。" 这是您必须在清单中添加的行:

<uses-permission android:name="android.permission.WAKE_LOCK" />

您需要在BroadcastReceiver中的onReceive()方法中实现此对象。您可以按照本教程使用您所需要的一切。 https://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

另外,请注意,您要保持设备清醒&#34;因此,您将保持手机处理能够影响电池续航时间,但即使屏幕被锁定,您仍可以获得警报。

希望它有所帮助!

答案 1 :(得分:0)

由于API 19 set()被视为不精确,可能会延迟。如果您确实需要精确警报,则应使用setExact()(自API 19起可用):

  

注意:从API 19开始,传递给此方法的触发时间是   被视为不精确:在此时间之前不会发出警报,   但可能会推迟并在一段时间后交付。操作系统将使用   这个政策是为了在整个过程中“批处理”警报   系统,最大限度地减少设备需要“唤醒”的次数   并尽量减少电池使用。一般来说,警报安排在附近   只要警报安排在远期,将来不会推迟   将来

此更改发生在19+设备上(显然),但也仅限于APK的目标 API为19+,因此您可以

另外,当您使用*_WAKE_UP警报时,警报管理器会保证设备将唤醒足够长的时间以执行接收方的方法,但不会启动它可能启动的服务:

  

只要报警,报警管理器就会保持CPU唤醒锁定   接收者的onReceive()方法正在执行。这保证了   在完成广播处理后,手机才会睡眠。   一旦onReceive()返回,Alarm Manager就会释放此唤醒锁定。   这意味着手机在某些情况下会尽快睡觉   onReceive()方法完成。如果你的报警接收器叫   Context.startService(),手机可能会睡眠   在所请求的服务启动之前。

支持v4库提供了一个有用的帮助类来处理这种情况:WakefulBroadcastReceiver

在您的情况下,当您使用服务待定意图时,我不确定适用的唤醒警示。

答案 2 :(得分:0)

我使用服务

public class AlarmService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onStart(Intent intent, int startid) {
    //This is my Code and set Alarm
    stopSelf();
}

}