public class KeepAliveService extends JobService {
private static final String TAG = "KeepAliveService";
private static final long INTERVAL_MILLIS = 60_000;
private HandlerThread mHandlerThread;
private Handler mHandler;
@Override
public void onCreate() {
super.onCreate();
mHandlerThread = new HandlerThread("KeepAliveThread");
mHandlerThread.start();
mHandler = new JobHandler(mHandlerThread.getLooper());
}
public static void startJobScheduler(Context context) {
JobScheduler jobScheduler = (JobScheduler) context.getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
if (jobScheduler != null) {
jobScheduler.schedule(new JobInfo.Builder(JobId.KEEP_ALIVE,
new ComponentName(context.getApplicationContext().getPackageName(), KeepAliveService.class.getName()))
.setPeriodic(INTERVAL_MILLIS)
.build());
}
}
@Override
public boolean onStartJob(JobParameters params) {
mHandler.sendMessage(mHandler.obtainMessage(params.getJobId(), params));
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
static class JobHandler extends Handler {
public JobHandler(@NonNull Looper looper) {
super(looper);
}
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case JobId.KEEP_ALIVE:
Context context = MainApp.getContext();
if (!isSafetyAppRunning(context)) {
startSelf(context);
}
break;
}
}
}
// use in api21
static boolean isSafetyAppRunning(Context context) {
ActivityManager am = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = null;
if (am != null) {
tasks = am.getRunningAppProcesses();
}
String pkgName = null;
if (null != tasks && tasks.size() > 0) {
pkgName = tasks.get(0).processName;
}
return context.getPackageName().equals(pkgName);
}
interface JobId {
int KEEP_ALIVE = 1;
}
@Override
public void onDestroy() {
super.onDestroy();
mHandlerThread.quit();
}
}
<service
android:name=".service.KeepAliveService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":watch" />