我想在特定时间重复某种代码,即xx:02,xx:17,xx:32,xx:47 我尝试使用AlarmManager类来brodcast一个未决的意图。
我的问题是 - 以下代码在HTC欲望816和三星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 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:17 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:32 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:47 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
但是在金立M2上 -
时间|结果
xx:00 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:02 |没有任何反应
xx:17 |没有任何反应
xx:20 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:32 |没有任何反应
xx:40 |吐司显示消息&#34;时间到了!!!!。&#34; 2秒振动
xx:47 |没有任何反应
为什么在具有相同的代码安静时行为是不同的.. 我做错了吗?或其他任何东西.. 请告诉我,提前谢谢。
答案 0 :(得分:1)
如果您希望以指定的间隔准确触发警报,请使用setExact(int,long,PendingIntent)。
您遇到问题的原因是您正在使用对AlarmManager的API调用,该调用被定义为不精确。如果你查看setInexactRepeating(int, long, long, PendingIntent)
的文档,你会发现这段话。
您的闹钟的第一次触发不会在请求的时间之前,但是 在此之后几乎整整一段时间内可能不会发生。在 另外,重复报警的整个周期将为 要求,任何两次连续发出警报之间的时间 可能会有所不同。如果您的应用需要非常低的抖动,请使用一次性 用适当的窗口报警;见setWindow(int,long, long,PendingIntent)和setExact(int,long,PendingIntent)。