方案适用范围
该方案主要适用于 Android5.0 以上版本手机。
该方案在 Android5.0 以上版本中不受 forcestop 影响,被强制停止的应用依然可以被拉活,在 Android5.0 以上版本拉活效果非常好。
仅在小米手机可能会出现有时无法拉活的问题。
方案实现
JobSchedulerService
package com.aoaoyi.service;
import android.annotation.TargetApi;
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.content.Intent;
import android.os.Build;
/**
- Created by xy on 2016/12/2.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class JobSchedulerService extends JobService{
@Override
public boolean onStartJob(JobParameters params) {
startMainService();
jobFinished(params, false);
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
startMainService();
return false;
}
@Override
public void onTaskRemoved(Intent rootIntent) {
startMainService();
}
public void startMainService(){
startService(MainService.getIntentAlarm(this));
}
}
注册JobSchedulerService
<service
android:name=“com.aoaoyi.service.JobSchedulerService”
android:permission=“android.permission.BIND_JOB_SERVICE”
android:enabled=“true”
android:exported=“true”
android:process=“:push”/>
权限
MainService
package com.aoaoyi.service;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
public class MainService extends Service {
/**
- 每10分钟检查一次链接状态,确保service不被杀掉
*/
private static final int KEEP_ALIVE_INTERVAL = BuildConfig.DEBUG ? 1 * 60 * 1000 : 10 * 60 * 1000;
/**
- ACTION Start
*/
private static final String ACTION_START = “MainService.Action.Start”;
/**
- ACTION Alarm
*/
private static final String ACTION_ALARM = “MainService.Action.Alarm”;
/**
- ACTION end start
*/
private static final String ACTION_END_START = “MainService.Action.EndStart”;
private boolean mIsAddAliveAlarm = false;
public MainService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
if (!mIsAddAliveAlarm){
addAliveAlarm();
mIsAddAliveAlarm = true;
}
super.onCreate();
}
@Override
public int onStartCommand(Intent pIntent, int pFlags, int pStartId) {
if (null != pIntent){
switch (pIntent.getAction()){
case ACTION_START:
break;
case ACTION_ALARM:
break;
case ACTION_END_START:
break;
}
}
if (!mIsAddAliveAlarm){
addAliveAlarm();
mIsAddAliveAlarm = true;
}
return START_STICKY;
}
@Override
public void onTaskRemoved(Intent pIntent) {
onEnd();
}
@Override
public void onDestroy() {
onEnd();
结尾
我还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。**
[外链图片转存中…(img-lLVyOX1z-1714553304036)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!