从 IntentService 迁移到 JobIntentService 适用于 Android O

6

之前我使用IntentService周期性地向服务器发送数据。然而,由于Android O限制了后台任务和进程,我现在正在转向使用JobIntentService。

这是我的活动代码以安排一个闹钟:

Intent intent = new Intent(BaseActivity.this, EventBroadcastReceiver.class);

// Create a PendingIntent to be triggered when the alarm goes off
final PendingIntent pIntent = PendingIntent.getBroadcast(this, EventBroadcastReceiver.REQUEST_CODE,
        intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Setup periodic alarm every half hour
long firstMillis = System.currentTimeMillis(); // alarm is set right away
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
        AlarmManager.INTERVAL_HALF_HOUR, pIntent);

我的服务如下:

public class EventAnalyticsService extends JobIntentService {    
    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // Perform your task
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

这段代码的接收者是:

public class EventBroadcastReceiver extends BroadcastReceiver {

    public static final int REQUEST_CODE = 12345;

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent myIntent = new Intent(context, EventAnalyticsService.class);
        context.startService(myIntent);
    }
}

然而,当应用程序在后台运行时,这对于Android O来说是不起作用的,如果我使用context.startForegroundService(myIntent);启动我的服务,它会抛出异常,如下所示:Context.startForegroundService()未调用Service.startForeground()


停止使用AlarmManager来安排不是闹钟的任意任务。请使用JobScheduler。 - Tim
有没有降低SDK版本的解决方法? - Kunu
1个回答

5

JobIntentService 主要用于由 UI 调用的服务,例如用户点击“下载!”按钮时启动的执行大型下载的服务。

对于定期后台工作,请使用 JobScheduler 和一个 JobService。如果需要支持 Android 5.0 以前的版本,请使用适当的包装库(例如 Evernote 的 android-job),该库将在较新设备上使用 JobScheduler,而在旧设备上使用 AlarmManager

或者您也可以继续使用 AlarmManager,但请使用前台服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接