繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM