2016-08-15 53 views
0

这是我第一次使用AlarmReciever。这是服务的一部分:AlarmManager在不同的API的不同时间后触发

//Service 
    this.context=this; 
    Intent alarm = new Intent(this.context,AlarmReceiver.class); 
    boolean alarmRunning =(PendingIntent.getBroadcast(this.context,0, alarm,PendingIntent.FLAG_NO_CREATE) != null); 
    if(alarmRunning == false){ 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.context,0,alarm,0); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
    } 

我认为在15000手段alarmManager.setRepeating 15秒。在我的S4 mini上用API 19是对的。但随着我的S7与API 23警报每分钟都会发生。有谁知道这个问题吗?

这里是我的日志:

08-15 10:54:15.949 11495-11522/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:55:15.619 11495-12452/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:56:15.619 11495-13407/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:57:15.629 11495-14288/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 10:58:15.629 11495-15193/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:00.039 11495-16907/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:00:15.599 11495-17149/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:01:15.619 11495-18085/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:02:15.659 11495-19040/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:03:58.049 11495-19601/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:06:11.419 11495-19878/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:11:11.349 11495-24547/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 
08-15 11:16:11.449 11495-29123/com.example.entwicklung1.designtestapp D/BackgroundRunning:: 

当我看到,现在触发每隔几分钟。

回答

0

由于闹铃管理器唤醒耗尽电池的设备,Android有一些新的方法来触发待定的意图。在API大于或等于19的设备上,如果两个或更多报警具有类似的时间来启动挂起的意图,则会一起触发报警,以便每次报警时不必每次都唤醒设备。所以,你必须做新的修改,以把这个代码:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

这行代码后,将这样的:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 

} else { 
     alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),15000,pendingIntent); 
} 

这里,如果Android的API是不是奇巧,setExact更大方法被使用,如果不是,那么警报就像你一样正常设置。希望这个工作,一切顺利。

+0

非常感谢。那么我应该使用上面的代码而不是alarmManager.setRepeating ...? – Koss

+0

是的,只需复制这个确切的代码,等待我修改它,这样你就可以复制并不需要修改你的代码。 –

+0

我的荣幸,请接受答案并投票表决,如果它的工作。 :)) –

0

在新的文档:

注:为API 19日,所有重复报警是不准确的。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,如上所述每次重新安排时间。其targetSdkVersion早于API 19的传统应用程序将继续拥有其所有警报,包括重复警报,并将其视为确切对待。

那么如何才能获得相同的行为? 您可以使用setExact并通过PendingIntent重新设置AlarmManager