从IntentService迁移到Android O的JobIntentService

时间:2018-02-15 10:38:40

标签: android background-service android-8.0-oreo jobintentservice

以前我使用IntentService定期向服务器发送数据。但是,由于Android O限制后台任务和进程,我正朝着JobIntentService。

我的活动代码,用于安排闹钟

NSPersistentStoreCoordinator

我的服务如下

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();
    }
}

但是当应用程序处于后台时,这不适用于Android O,如果我使用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); } } 启动我的服务,则会将异常抛出为context.startForegroundService(myIntent);

1 个答案:

答案 0 :(得分:5)

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

对于定期后台工作,请使用JobSchedulerJobService。如果您需要支持早于Android 5.0的版本,请使用合适的包装库(例如,Evernote的android-job),在新设备上使用JobScheduler,在旧设备上使用AlarmManager

或者,坚持AlarmManager,但使用前台服务。