API等级26:粘性背景服务

时间:2017-10-18 14:29:43

标签: java android multithreading

由于Android O不允许在不通知用户的情况下启动后台服务,我确实想选择一种不同的方法在后台使用Firebase Jobdispatcher运行新线程,请参阅:https://github.com/firebase/firebase-jobdispatcher-android

在为API 26构建之前,我曾经在服务中启动一个新线程。这是 STICKY 服务,并会在用户从最近关闭应用时重新启动(当幻灯片从正在运行的应用中删除应用时)。

在下面的API 26之前查看我的原始代码。

public class NotificationService extends Service {

@Override
public void onCreate() {
    // this will start the thread
    ApplicationLoader.postInitApplication();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

在API 26中,出现了一些限制:

https://developer.android.com/about/versions/oreo/android-8.0-changes.html#back-all

因此上述方法不再适用。但即使用户从最近的应用程序关闭应用程序,我仍然希望我的线程能够运行。我发现了一种解决方法,但对我来说感觉非常糟糕。

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher
                (new GooglePlayDriver(applicationContext));

Job notificationJob = dispatcher.newJobBuilder()
          .setService(NotificationService.class)
          .setTag("backgroundJob-" + System.currentTimeMillis())
          .setRecurring(true)
          .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
          .setTrigger(Trigger.executionWindow(50, 60))
          .setReplaceCurrent(false)
          .build();
dispatcher.mustSchedule(notificationJob);

服务:

public class NotificationService extends JobService {

@Override
public boolean onStartJob(JobParameters job) {
    // this will check if the thread is started, if not it will start the thread
    ApplicationLoader.initNotificationThread();
    return false;
}

@Override
public boolean onStopJob(JobParameters job) {
    return false;
}

现在我找到了一个解决方法,如果我的线程已经运行,这个作业会检查每个50/60秒,如果没有,它将启动一个线程。即使用户从最近的应用程序中删除应用程序,这仍然有效。

然而,这种解决方案感觉不舒服。我每分钟都在安排一次密集检查,而这可能甚至没有必要这样做。

有没有更好的方法来解决这个问题?我可以做一些电话,比如某个地方的onDestroy()电话,然后开始一份新工作吗?

0 个答案:

没有答案