Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android alarmManager.setInexactRepeating不能完全按时工作_Android_Broadcastreceiver_Alarmmanager - Fatal编程技术网

Android alarmManager.setInexactRepeating不能完全按时工作

Android 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

我只想在某个特定的时间重复某种代码,即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.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);
    }

}