【发布时间】:2019-12-23 07:03:45
【问题描述】:
我想执行一个动作,等待 n 秒,执行另一个动作,再次等待,等等(异步)。
首先,我使用 AsyncTask 得到它。问题是即使设备被锁定,我也需要它(因为目标是将订单发送到另一台设备)。
然后我想用AlarmManager,做这样的事情:
public class MainClass {
private static MainClass instance;
private static Context context;
private MainClass(){}
public static MainClass getInstance(Context context){
MainClass.context = context;
if (instance == null) instance = new MainClass();
return instance;
}
// [...]
private Alarm alarm = null;
private static Worker worker = null ;
private static Handler my_handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message message) {
worker.executeNextAction();
}
};
public void start(){
alarm = new Alarm();
worker = new Worker();
worker.executeNextAction();
}
public static class Alarm extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
my_handler.sendMessage(new Message());
}
public void setAlarm(Context context, int seconds)
{
AlarmManager alarm_manager =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, Alarm.class);
PendingIntent pending_intent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarm_manager.set(AlarmManager.RTC_WAKEUP, 1000 * seconds, pending_intent);
}
public void cancelAlarm(Context context) { /*[...]*/ }
}
private class Worker {
void executeNextAction() {
// do tasks
alarm.setAlarm(context, duration);
}
// [...]
}
}
这不起作用,因为 handleMessage() 中的 worker 将为 null。
如何从onReceive() 方法调用executeNextAction() 方法?
【问题讨论】:
-
你不应该经常使用 AlarmManager,而是使用 WorkManager,就像@Richard Dapice 解释的那样。
-
非常感谢,我不知道 WorkManager。阅读更多内容后,我认为使用前台服务对我来说更好(它在后台显示通知),因为如果用户关闭应用程序,我不希望完成工作。这是一个即时工作,每 n 秒修改一次。 developer.android.com/guide/components/servicesandroid-developers.googleblog.com/2018/10/…
If the app needs to complete a user-initiated task without deferring even if the user leaves the app or turns off the screen, you should use a Foreground service.
标签: android android-asynctask broadcastreceiver alarmmanager android-handler