安卓报警器RTC_WAKEUP不精确?

问题描述 投票:0回答:1

我试图找到一种方法在特定时间执行一些代码。为此,我目前正在尝试使用安卓系统提供的:AlarmManger。当设置时间时,它被执行,但不完全是当我已经设置了时间-> 总是有一个延迟wich似乎是更长的时间,当时间更远离当前。如何解决这个问题?而且重要的是,代码运行时,用户不在应用程序中,但没有关闭它与任务管理器。

(对不起,格式不对;D)

MainActivity:public class MainActivity extends AppCompatActivity implements View.OnClickListener {。
    private final String tag = "MainActivity";

    private TimePicker timePicker;
    private Button button;

    private boolean isRunning;
    private PendingIntent servicePI;
    private AlarmManager alarmManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    @Override
    public void onClick(View v) {
        if (isRunning) {
            Log.d(tag, "Stop service");

            alarmManager.cancel(servicePI);
            setState(false);
        }else {
            Log.d(tag, "Start service");

            int[] alarmTime = new int[2];
            if (Build.VERSION.SDK_INT < 23) {
                alarmTime[0] = timePicker.getCurrentHour();
                alarmTime[1] = timePicker.getCurrentMinute();
            }else {
                alarmTime[0] = timePicker.getHour();
                alarmTime[1] = timePicker.getMinute();
            }

            Calendar c = Calendar.getInstance();
            c.set(Calendar.HOUR_OF_DAY, alarmTime[0]);
            c.set(Calendar.MINUTE, alarmTime[1]);
            c.set(Calendar.SECOND, 0);

            alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), servicePI);
            setState(true);
        }
    }

    private void setState(boolean state) {
        isRunning = state;
        if (state)
            button.setText("Stop");
        else
            button.setText("Start");
    }

    private void init() {
        timePicker = findViewById(R.id.timePicker);
        button = findViewById(R.id.button_power);
        button.setOnClickListener(this);

        setState(false);

        Intent service = new Intent(getApplicationContext(), MyService.class);
        servicePI = PendingIntent.getService(getApplication(), 0, service,0);
        alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    }
}

MyService: public class MyService extends Service {

private final String tag = "MyService"; @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(tag, "Start"); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } }

java android alarmmanager android-pendingintent
1个回答
0
投票

Calls to AlarmManager.set() 是不确切的。这使得Android能够优化设备的电力使用。如果您需要精确的交付,您需要使用 setExact()setExactAndAllowWhileIdle(). 请参见本手册中的注释。文件.

© www.soinside.com 2019 - 2024. All rights reserved.