4

我正在使用 android-priority-job-queue 'com.github.yigit:android-priority-jobqueue'。确保它每 2 分钟运行一次。下面是代码

public PoolingJob () {

    // This job requires network connectivity,
    // and should be persisted in case the application exits before job is completed.
    super (new Params (PRIORITY).requireNetwork ().groupBy (Const.POOLING_QUEUE_GROUP)
            .delayInMs (120000).persist ());//120 sec delay
}

但只要应用程序关闭或从内存中删除,它就会暂停。当应用程序关闭或从内存中删除时,如何使作业连续运行并每 2 分钟进行一次池化。有没有像粘性服务或android.permission.BIND_JOB_SERVICE之类的东西?

构建服务器池系统。需要以上 API 15。

4

3 回答 3

2

无论应用程序是否正在运行,您都可以使用AlarmManager以给定的时间间隔发送Intents 并运行作业。BroadcastReceiver

话虽如此,两分钟是一个非常短的时间间隔,您应该避免经常执行任何任务(尤其是与网络相关的任务)。它将大大增加电池消耗。

于 2016-03-31T18:35:17.927 回答
2

通过使用AlarmManagerService您可以实现这一点。在此阅读文档 AlarmManager

这是设置和删除重复任务警报的代码块

设置闹钟

public void createAlarm() {
        ServerDetails serverDetails = new ServerDetails(this);
        if (serverDetails.isSettingsOK()) {
            Intent i = new Intent(this, MyService.class);
            if (PendingIntent.getService(this, 0, i,
                    PendingIntent.FLAG_NO_CREATE) == null) {
                PendingIntent pendingIntent = PendingIntent.getService(this, 0,
                        i, PendingIntent.FLAG_CANCEL_CURRENT);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                int interval = 2 * 60 * 1000;
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                        System.currentTimeMillis() + interval, interval,
                        pendingIntent);
                Log.d("alarm", "alarm set successfully " + interval);
            } else {
                Log.d("alarm", "alarm already set");
            }

        }

    }

取消闹钟

public void cancelAlarm() {
    Intent i = new Intent(this, MyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, i,
            PendingIntent.FLAG_NO_CREATE);
    if (pendingIntent != null) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();
        Log.d("alarm", "alarm cancelled");
    }
}

这是警报激活时将在后台运行的服务。

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }

    @Override
    public void onCreate() {

        super.onCreate();
        Log.d("service Created", "service created");

    }


    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
       doYourTaskHere();
    }

    private void doYourTaskHere() {

        // call here webservice or any other task here which you want to do in every two minutes

    }


}
于 2016-04-02T06:59:31.630 回答
0

你为什么要这样做 如果我是你,我会改为研究 SyncAdapters。您可以将它们设计为即使在后台也可以工作,并且在架构上比处理 AlarmManagers 更好。在这里查看它们,同步适配器。它们对电池性能更好。允许身份验证,并将插件架构添加到代码库。

于 2016-04-05T13:45:26.157 回答