进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径。

  1. 先来看看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设计的,为了第二次启动更快,采取的一个权衡)

  2、通常我们启动的都是一个服务进程,要么直接 startService() 要么 bindService(),我们可能需要在这些服务进程里面做一些事情,但这些事情并不是说我们现在要做的,可能是将来要做的,或者是在某个时间条件下要做的,这时候我们就需要我们的service保持活动状态。

  3、JobService 可以算是一个 JobScheduler 的回调服务。JobScheduler是一个系统级的作业调度器,我们将某些任务扔给系统,当达到我们设定的条件以后,JobScheduler再吊起我们的JobService执行我们的业务逻辑。

  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实现进程保活的更多相关文章

  1. JobScheduler布置后台任务以及实现进程保活?

    1.简介 在Android 5.0 提供了一套新的 JobScheduler API,它允许您定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命. https: ...

  2. Android进程保活

    Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...

  3. 转: android app进程保活的文章列表

    1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...

  4. 关于 Android 进程保活,你所需要知道的一切

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...

  5. Android记一次后台保活设计心得2018

    首先我并不推荐也不喜欢手机应用通过各种手段后台保活,但是当产品经理确定一定以及肯定地提出了这个需求,活着应用有着必须常驻后台的理由,也就只有硬着头皮去与各个手机的后台管理机制做斗争了. 背景:因为开发 ...

  6. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

  7. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  8. Google Android官方文档进程与线程(Processes and Threads)翻译

    android的多线程在开发中已经有使用过了,想再系统地学习一下,找到了android的官方文档,介绍进程与线程的介绍,试着翻译一下. 原文地址:http://developer.android.co ...

  9. 内存不足时Android 系统如何Kill进程

    [转]内存不足时Android 系统如何Kill进程 大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可 ...

随机推荐

  1. Go语言下的线程模型

    阅读Go并发编程对go语言线程模型的笔记,解释的非常到,好记性不如烂笔头,忘记的时候回来翻一番,在此做下笔记. Go语言的线程实现模型,又3个必知的核心元素,他们支撑起了这个线程实现模型的主要框架: ...

  2. jsp fmt页面显示value does not support runtime expressions

    最近使用Struts2+Spring3+Mybatis3做一个项目,在用户修改页面显示生日, <fmt:formatDate value="${user.birthday}" ...

  3. [Java Plasterer] Java Components 3:Java Enum

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. Written In The Font Whe ...

  4. 【EF6学习笔记】(七)读取关联数据

    本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy loading 这种加载方式在于需要用到这个导航属性数据的时候,才会去数据库 ...

  5. Disconf源码分析之启动过程分析上(1)

    Disconf的启动,主要是包括两次扫描和XML非注解式配置,总共分为上下两篇,上篇先主要介绍第一次静态扫描过程. 先从入口分析,通过Disconf帮助文档,可以看到xml必须添加如下配置. < ...

  6. Java 并发编程-再谈 AbstractQueuedSynchronizer 2:共享模式与基于 Condition 的等待 / 通知机制实现

    共享模式acquire实现流程 上文我们讲解了AbstractQueuedSynchronizer独占模式的acquire实现流程,本文趁热打铁继续看一下AbstractQueuedSynchroni ...

  7. go使用context包避免goroutine泄露问题

    go是带内存自动回收的特性,因此内存一般不会泄漏.但是Goroutine确存在泄漏的情况,同时泄漏的Goroutine引用的内存同样无法被回收. 下面的程序中后台Goroutine向管道输入自然数序列 ...

  8. FineUI开源版(ASP.Net)开发实践-目录

    点我订阅 目前所有博客的截图,方便离线观看,点图片 FineUI初学手册 下载,实例项目搭建 FineUI初学手册-部分JS整理 部分JS整理 ASP.NET-FineUI开发实践-1 实际开发环境是 ...

  9. 2017 ACM/ICPC Asia Regional Shenyang Online(部分题解)

    HDU 6197 array array array 题意 输入n和k,表示输入n个整数和可以擦除的次数k,如果至多擦除k次能是的数组中的序列是不上升或者是不下降序列,就是魔力数组,否则不是. 解题思 ...

  10. CSS定位概述

    CSS中有三种基本的定位机制:普通流,浮动和绝对定位.   1.相对定位:relative 如果对一个元素进行相对定位,它将出现在它所在的位置上,然后可以通过设置垂直或者水平位置,让这个元素“相对于” ...