需要在android中每分钟运行一个后台任务

Posted

技术标签:

【中文标题】需要在android中每分钟运行一个后台任务【英文标题】:Need to have one background task to run for every minute in android 【发布时间】:2020-03-21 11:52:01 【问题描述】:

在我的一个 android 应用程序中,我需要每分钟运行一个任务。即使应用程序关闭并且设备也处于空闲状态,它也应该运行。

    我已经尝试过处理程序,当设备处于活动状态时它工作正常,但当设备处于空闲状态时它不工作。 我也尝试过 workmanager(一次并重复)。文档说即使设备处于空闲模式也可以使用,但是在 3/4 重复后停止工作。Workmanager 不一致,它有时会工作,并且在我重新启动设备之前大多数情况下都无法工作。

谁能提出更好的方法来处理这种情况?

谢谢 布瓦那

【问题讨论】:

首先,为什么你需要每分钟运行一次任务,因为它在电池消耗方面成本很高,第二个工作经理需要至少 15 分钟的间隔 我想每分钟将位置发布到服务器 只有前台服务可能是您的解决方案 【参考方案1】:

如果您没有定义更长的时间,工作经理只能在 15 分钟的间隔内工作。要每分钟运行一次,您需要一个带有粘性通知的前台服务。没有其他方法可以每分钟运行一次。

要启动前台服务,像往常一样创建一个服务,并在其onStartCommand 中调用startForeground 并从方法中返回START_STICKY。这些应该可以满足您的需求。

编辑:处理程序线程的示例代码(这是 Java 顺便说一句,在 Xamarin 上应该类似):

private HandlerThread handlerThread;
private Handler backgroundHandler;

@Override
public int onStartCommand (params)

    // Start the foreground service immediately.
    startForeground((int) System.currentTimeMillis(), getNotification());

    handlerThread = new HandlerThread("MyLocationThread");
    handlerThread.setDaemon(true);
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper())

    // Every other call is up to you. You can update the location, 
    // do whatever you want after this part.

    // Sample code (which should call handler.postDelayed()
    // in the function as well to create the repetitive task.)
    handler.postDelayed(() => myFuncToUpdateLocation(), 60000);

    return START_STICKY;


@Override
public void onDestroy() 
    super.onDestroy();
    handlerThread.quit();

【讨论】:

前台服务该怎么办?重复处理程序每​​分钟重复一次?定期工作请求工作 15 分钟。但我正在尝试使用连续循环的 oneTimeRequest 。 val work = OneTimeWorkRequestBuilder().setConstraints(constraints) .setInitialDelay(interval, TimeUnit.SECONDS).addTag("jobTag") .build() 说到worker,再次调度同一个wokre。 这取决于你。只要您有粘性通知,系统就会尽可能保留您的服务。您可以使用线程、处理程序、线程池等。这取决于您想要实现的目标。如果您想将位置发布到服务器,我会说创建一个 HandlerThread 并在其中附加一个循环器。编辑一些信息的代码。

以上是关于需要在android中每分钟运行一个后台任务的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中每n秒连续在后台线程中运行一个进程

如何让android的service一直在后台运行

运行后台任务时防止 IIS 空闲超时

UWP中复杂的后台工作,是真的吗?

在 iOS 应用程序中安排每 n 分钟运行一次的后台任务

如何在 iOS 应用程序中每 n 分钟获取一次后台位置更新?