![](/img/trans.png)
[英]How to keep a service alive using AlarmManager.setInexactRepeating()?
[英]alarmManager.setInexactRepeating does not working exactly on time
我只想在特定時間重復某種代碼,即在xx:02,xx:17,xx:32,xx:47,我嘗試使用AlarmManager類廣播未完成的意圖。
我的問題是-以下代碼可以在HTC 816和Samsung Galaxy Grand neo上正常運行,但不能在Gionee M2上運行。
MainActivity.java
package com.example.alarmexample;
import java.text.SimpleDateFormat;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int newmin=0;
SimpleDateFormat f= new SimpleDateFormat("dd-MM-yy HH:mm");
long current= System.currentTimeMillis();
String d= f.format(current);
String time[]=d.split(":");
int min = Integer.parseInt(time[1]);
if(min>=0 && min<=2)
{
newmin=2-min;
}
else if(min<=17)
{
newmin=17-min;
}
else if( min<=32)
{
newmin=32-min;
}
else if(min<=47)
{
newmin=47-min;
}
else
{
newmin=62-min;
}
long newtime= current+(newmin * 60 * 1000);
Intent intent = new Intent(this,MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, newtime, 15*60*1000 , pendingIntent);
Toast.makeText(this, "Alarm set in " + newmin + " miniuts",
Toast.LENGTH_LONG).show();
}
}
MyBroadcastReceiver.java
package com.example.alarmexample;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Time is up!!!!.",
Toast.LENGTH_LONG).show();
// Vibrate the mobile phone
Vibrator vibrator = (Vibrator) context
.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(2000);
}
}
HTC 816和三星Galaxy Grand Neo的輸出是-
時間| 結果
xx:02 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:17 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:32 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:47 | 吐司顯示消息“時間到了!!!”。 振動2秒
但是在Gionee M2上-
時間| 結果
xx:00 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:02 | 什么都沒發生
xx:17 | 什么都沒發生
xx:20 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:32 | 什么都沒發生
xx:40 | 吐司顯示消息“時間到了!!!”。 振動2秒
xx:47 | 什么都沒發生
為什么在使用相同代碼的情況下行為會有所不同。.做錯了嗎? 或其他任何內容..請告訴我,謝謝。
如果要使警報准確按指定的間隔觸發,請使用setExact(int,long,PendingIntent)。
造成問題的原因是,您正在使用對AlarmManager的API調用,該API定義為inexact 。 如果您查看setInexactRepeating(int, long, long, PendingIntent)
的文檔,則會發現此段落。
警報的第一個觸發器不會在請求的時間之前出現,但是在該時間之后的幾乎整個時間間隔內都不會發生。 另外,雖然重復警報的整個時間段將按要求進行,但連續兩次發出警報之間的時間可能會有所不同。 如果您的應用要求非常低的抖動,請使用帶有適當窗口的單次警報; 請參見setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.