我试图找到一种方法在特定时间执行一些代码。为此,我目前正在尝试使用安卓系统提供的: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; } }
Calls to AlarmManager.set()
是不确切的。这使得Android能够优化设备的电力使用。如果您需要精确的交付,您需要使用 setExact()
或 setExactAndAllowWhileIdle()
. 请参见本手册中的注释。文件.