Android--使用JobService实现进程保活
进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径。
- 先来看看android中有几种进程吧。
- 前台进程:Foreground process
- 用户正在交互的Activity(onResume())
- 当某个Service绑定正在交互的Activity。
- 被主动调用为前台Service(startForeground())
- 组件正在执行生命周期的回调(onCreate()/onStart()/onDestroy())
BroadcastReceiver 正在执行onReceive();
- 可见进程:Visible process
- 我们的Activity处在onPause()(没有进入onStop())
- 绑定到前台Activity的Service。
- 服务进程:Service process
- 简单的startService()启动。
- 后台进程:Background process
对用户没有直接影响的进程----Activity出于onStop()的时候。
android:process=":xxx"
- 空进程:Empty process
不含有任何的活动的组件。(android设计的,为了第二次启动更快,采取的一个权衡)
- 前台进程:Foreground process
2、通常我们启动的都是一个服务进程,要么直接 startService() 要么 bindService(),我们可能需要在这些服务进程里面做一些事情,但这些事情并不是说我们现在要做的,可能是将来要做的,或者是在某个时间条件下要做的,这时候我们就需要我们的service保持活动状态。
3、JobService 可以算是一个 JobScheduler 的回调服务。JobScheduler是一个系统级的作业调度器,我们将某些任务扔给系统,当达到我们设定的条件以后,JobScheduler再吊起我们的JobService执行我们的业务逻辑。
- 这里主要是介绍如何利用JobScheduler进行我们的服务保活,JobScheduler就不介绍了,有需要了解请移驾官方文档。
- https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
4、接下来看看我们如何实现。(我就直接上代码了)
@SuppressLint("NewApi")
public class JobHandleService extends JobService {
private int kJobId = 0; @Override
public void onCreate() {
super.onCreate();
Log.i("INFO", "jobService create");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("INFO", "jobService start");
// 在服务启动时,直接将任务推到JobScheduler 的任务队列,然后在设定的时间条件到达时,便会直接吊起我们的服务,走onStartJob()方法
scheduleJob(getJobInfo());
return START_NOT_STICKY;
} @Override
public void onDestroy() {
super.onDestroy();
} @Override
public boolean onStartJob(JobParameters params) {
// params.getExtras()
// scheduleJob(getJobInfo());
boolean isLocalServiceWork = isServiceWork(this, "com.xxx.XxxService");
boolean isRemoteServiceWork = isServiceWork(this, "com.xxx.XxxService"); if (!isLocalServiceWork || !isRemoteServiceWork) {
this.startService(new Intent(this, LocalService.class));
this.startService(new Intent(this, RemoteService.class));
Toast.makeText(this, "process start", Toast.LENGTH_SHORT).show();
}
return true;
} @Override
public boolean onStopJob(JobParameters params) {
Log.i("INFO", "job stop");
// 当执行完毕时,我们再将任务加入到 JobScheduler 里面就可以了。
scheduleJob(getJobInfo());
return true;
} /**
* Send job to the JobScheduler.
*/
public void scheduleJob(JobInfo t) {
Log.i("INFO", "Scheduling job");
JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
if (tm != null) {
tm.schedule(t);
}
} public JobInfo getJobInfo() {
JobInfo.Builder builder = new JobInfo.Builder(kJobId++, new ComponentName(this, JobHandleService.class));
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPersisted(true);
builder.setRequiresCharging(false);
builder.setRequiresDeviceIdle(false);
builder.setPeriodic(10);//间隔时间--周期
return builder.build();
} /**
* 判断某个服务是否正在运行的方法
*
* @param mContext
* @param serviceName 是包名+服务的类名(例如:net.loonggg.testbackstage.TestService)
* @return true代表正在运行,false代表服务没有正在运行
*/
public boolean isServiceWork(Context mContext, String serviceName) {
boolean isWork = false;
ActivityManager myAM = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> myList = null;
if (myAM != null) {
myList = myAM.getRunningServices(100);
}
if (myList != null && myList.size() <= 0) {
return false;
}
if (myList != null) {
for (int i = 0; i < myList.size(); i++) {
String mName = myList.get(i).service.getClassName();
if (mName.equals(serviceName)) {
isWork = true;
break;
}
}
}
return isWork;
}
}
我这里就是简单的示范一下,具体我们项目里面的实现并没有发到上面,各位可以自己琢磨。
Android--使用JobService实现进程保活的更多相关文章
- JobScheduler布置后台任务以及实现进程保活?
1.简介 在Android 5.0 提供了一套新的 JobScheduler API,它允许您定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命. https: ...
- Android进程保活
Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...
- 转: android app进程保活的文章列表
1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...
- 关于 Android 进程保活,你所需要知道的一切
早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...
- Android记一次后台保活设计心得2018
首先我并不推荐也不喜欢手机应用通过各种手段后台保活,但是当产品经理确定一定以及肯定地提出了这个需求,活着应用有着必须常驻后台的理由,也就只有硬着头皮去与各个手机的后台管理机制做斗争了. 背景:因为开发 ...
- Android中的跨进程调用技术AIDL
什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...
- Google Android官方文档进程与线程(Processes and Threads)翻译
android的多线程在开发中已经有使用过了,想再系统地学习一下,找到了android的官方文档,介绍进程与线程的介绍,试着翻译一下. 原文地址:http://developer.android.co ...
- 内存不足时Android 系统如何Kill进程
[转]内存不足时Android 系统如何Kill进程 大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可 ...
随机推荐
- Spring Boot(八):RabbitMQ 详解
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将 RocketMQ 捐献给了 ...
- Js中处理日期加减天数
Js的处理日期还是很方便的. 一. 格式化日期为2017-07-04的格式 function formatTime(date) { var year = date.getFullYear(); var ...
- bootbox.js官方文档
简介 Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Bootstrap模态框生成的都是非阻塞事 ...
- socket的阻塞与非阻塞,同步与异步
同步/异步主要针对C端: 同步: 所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步 ...
- OJ:又一道考察多态的题目
Description 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: 程序代码如下 #include <iostream> using namesp ...
- HttpClient+Jsoup模拟登陆贺州学院教务系统,获取学生个人信息
前言 注:可能学校的教务系统已经做了升级,当前的程序不知道还能不能成功获取信息,加上已经毕业,我的账户已经被注销,试不了,在这里做下思路跟过程的记录. 在我的毕业设计中”基于SSM框架贺州学院校园二手 ...
- [转] JSON Web Token in ASP.NET Web API 2 using Owin
本文转自:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ...
- [转]What is Blue Prism?
本文转自:https://www.guru99.com/blue-prism-tutorial.html#5 What is Blue Prism? Blue Prism is a UK-based ...
- C#基础知识总结(五)
摘要 其他的数据类型:常量.枚举(enum).结构(struct).数组一.常量 语法:const 类型 变量名 = 变量值 常量称之为值不可变的变量! 在定义的地方赋值,其他的地方不能赋值. 常量变 ...
- c# 后台分页 jqgrid
/// <summary> /// 获取设备数量 /// </summary> /// <param name="Organid">单位ID&l ...