在 Android O 上使用 JobScheduler 启动服务
Start service with JobScheduler on Android O
我正在尝试启动 IntentService 以在 Android O 上注册到 firebase 云消息传递。
On Android O 不允许启动 Intent Service "in a situation when it isn't permitted" 每个人都告诉我使用 JobService 但不知道如何使用它。
JobInfo.Builder 应该有什么约束才能得到 "situation where it's permitted",我一直得到相同的 IllegalStateException
这是我的 JobService
@Override
public boolean onStartJob(JobParameters params) {
Intent intent = new Intent(this, RegistrationIntentService.class);
getApplicationContext().startService(intent);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
public static void scheduleJob(Context context) {
ComponentName serviceComponent = new ComponentName(context, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(MyJobService.JOB_ID, serviceComponent);
builder.setMinimumLatency(1 * 1000); // wait at least
JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
if(jobScheduler != null) jobScheduler.schedule(builder.build());
}
如果您使用的是支持库版本 26.1.0 或更高版本,您可以访问类似于 Intent Service
的 JobIntentService
,并具有作业调度程序的附加优势,您不需要管理除启动它以外的任何事情。
根据文档
Helper for processing work that has been enqueued for a job/service. When running on Android O or later, the work will be dispatched as a job via JobScheduler.enqueue. When running on older versions of the platform, it will use Context.startService.
您可以在此处找到更多详细信息 JobIntentService。
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
public class JobIntentNotificationService extends JobIntentService {
public static void start(Context context) {
Intent starter = new Intent(context, JobIntentNotificationService.class);
JobIntentNotificationService.enqueueWork(context, starter);
}
/**
* Unique job ID for this service.
*/
static final int JOB_ID = 1000;
/**
* Convenience method for enqueuing work in to this service.
*/
private static void enqueueWork(Context context, Intent intent) {
enqueueWork(context, JobIntentNotificationService.class, JOB_ID, intent);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// do your work here
}
}
你的称呼方式是
JobIntentNotificationService.start(getApplicationContext());
您需要为 Oreo 之前的设备添加此权限
<!-- used for job scheduler pre Oreo -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
Firebase 实际上有一个名为 FirebaseMessagingService
的专门用于接收消息的服务。 This Firebase page 应该包含帮助您开始这方面的所有信息。
除此之外,您正在尝试从服务访问应用程序上下文,而您应该使用父服务的基本上下文:
getApplicationContext().startService(intent);
到
startService(intent);
如果您想从 FirebaseMessagingService
启动某些作业,请查看他们的 JobDispatcher 库,它非常棒。
我正在尝试启动 IntentService 以在 Android O 上注册到 firebase 云消息传递。
On Android O 不允许启动 Intent Service "in a situation when it isn't permitted" 每个人都告诉我使用 JobService 但不知道如何使用它。
JobInfo.Builder 应该有什么约束才能得到 "situation where it's permitted",我一直得到相同的 IllegalStateException
这是我的 JobService
@Override
public boolean onStartJob(JobParameters params) {
Intent intent = new Intent(this, RegistrationIntentService.class);
getApplicationContext().startService(intent);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
public static void scheduleJob(Context context) {
ComponentName serviceComponent = new ComponentName(context, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(MyJobService.JOB_ID, serviceComponent);
builder.setMinimumLatency(1 * 1000); // wait at least
JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
if(jobScheduler != null) jobScheduler.schedule(builder.build());
}
如果您使用的是支持库版本 26.1.0 或更高版本,您可以访问类似于 Intent Service
的 JobIntentService
,并具有作业调度程序的附加优势,您不需要管理除启动它以外的任何事情。
根据文档
Helper for processing work that has been enqueued for a job/service. When running on Android O or later, the work will be dispatched as a job via JobScheduler.enqueue. When running on older versions of the platform, it will use Context.startService.
您可以在此处找到更多详细信息 JobIntentService。
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v4.app.JobIntentService;
public class JobIntentNotificationService extends JobIntentService {
public static void start(Context context) {
Intent starter = new Intent(context, JobIntentNotificationService.class);
JobIntentNotificationService.enqueueWork(context, starter);
}
/**
* Unique job ID for this service.
*/
static final int JOB_ID = 1000;
/**
* Convenience method for enqueuing work in to this service.
*/
private static void enqueueWork(Context context, Intent intent) {
enqueueWork(context, JobIntentNotificationService.class, JOB_ID, intent);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// do your work here
}
}
你的称呼方式是
JobIntentNotificationService.start(getApplicationContext());
您需要为 Oreo 之前的设备添加此权限
<!-- used for job scheduler pre Oreo -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
Firebase 实际上有一个名为 FirebaseMessagingService
的专门用于接收消息的服务。 This Firebase page 应该包含帮助您开始这方面的所有信息。
除此之外,您正在尝试从服务访问应用程序上下文,而您应该使用父服务的基本上下文:
getApplicationContext().startService(intent);
到
startService(intent);
如果您想从 FirebaseMessagingService
启动某些作业,请查看他们的 JobDispatcher 库,它非常棒。