Android alarmManager.setInexactRepeating不能完全按时工作
我只想在某个特定的时间重复某种代码,即xx:02、xx:17、xx:32、xx:47 我尝试使用AlarmManager类,该类可以广播挂起的意图 我的问题是-以下代码在HTC desire 816和三星Galaxy Grand neo上运行良好,但在Gionee M2上运行不好 MainActivity.javaAndroid alarmManager.setInexactRepeating不能完全按时工作,android,broadcastreceiver,alarmmanager,Android,Broadcastreceiver,Alarmmanager,我只想在某个特定的时间重复某种代码,即xx:02、xx:17、xx:32、xx:47 我尝试使用AlarmManager类,该类可以广播挂起的意图 我的问题是-以下代码在HTC desire 816和三星Galaxy Grand neo上运行良好,但在Gionee M2上运行不好 MainActivity.java package com.example.alarmexample; import java.text.SimpleDateFormat; import android.app.Act
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();
}
}
HTC desire 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、pendingEvent)
出现问题的原因是您正在使用一个定义为不精确的API调用AlarmManager。如果你看一下这篇文章的文档,你会发现这篇文章
您的闹钟的第一个触发器不会在请求的时间之前触发,但是
这可能不会在此后的几乎整个时间间隔内发生。在里面
此外,重复报警的总周期如下所示:
请求时,任意两次连续触发报警之间的时间
可能会有所不同。如果您的应用程序要求非常低的抖动,请使用一次触发
用适当的窗口代替警报;参见设置窗口(int,long,
long,pendingent)和setExact(int,long,pendingent)
但为什么会发生这种情况。。。在HTC和三星运行良好,而不是在Ginoe上,这可能是一种更积极的节能模式。但这一切都在规格范围内我对手机省电模式不太了解。。。但必须只在特定时间运行代码
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);
}
}