簡體   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