alarmManager.setInexactRepeating不能准确地按时运行

时间:2014-11-10 07:30:54

标签: android broadcastreceiver alarmmanager

我想在特定时间重复某种代码,即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 |没有任何反应

为什么在具有相同的代码安静时行为是不同的.. 我做错了吗?或其他任何东西.. 请告诉我,提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您希望以指定的间隔准确触发警报,请使用setExact(int,long,PendingIntent)。

您遇到问题的原因是您正在使用对AlarmManager的API调用,该调用被定义为不精确。如果你查看setInexactRepeating(int, long, long, PendingIntent)的文档,你会发现这段话。

  

您的闹钟的第一次触发不会在请求的时间之前,但是   在此之后几乎整整一段时间内可能不会发生。在   另外,重复报警的整个周期将为   要求,任何两次连续发出警报之间的时间   可能会有所不同。如果您的应用需要非常低的抖动,请使用一次性   用适当的窗口报警;见setWindow(int,long,   long,PendingIntent)和setExact(int,long,PendingIntent)。