[英]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.