JobService和JobScheduler机制在Android5.0以上保活

JobService和JobScheduler机制在Android5.0以上保活

我们知道在Android5.0之前,Android源代码还是有不小漏洞的,导致非常多不光明的手段来进行++保活++。但是在Android5.0之后。非常多都是能够被APP杀死的。Android5.0之后Android提供了JobService和JobScheduler这两的类。我们能够通过这个JobScheduler来进行保活。

JobScheduler

JobScheduler是Job的调度类。负责运行。取消任务等逻辑。详细看下JobScheduler的获取和类代码。

 JobScheduler jobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE)
/*
*參数:JobInfo採用Builder的设计模式,对须要运行的Job任务信息进行的封装。
*返回值:RESULT_SUCCESS=1   RESULT_FAILURE=0 表示运行成功或失败
*/
public abstract int schedule(JobInfo job);

/**通过指定的jobId取消Job任务*/
public abstract void cancel(int jobId);

/**取消全部的Job任务*/
public abstract void cancelAll();

/**获取全部的未运行的Job任务*/
public abstract @NonNull List<JobInfo> getAllPendingJobs();

/**获取指定的Job未运行的任务*/
public abstract @Nullable JobInfo getPendingJob(int jobId);

JobService

JobService中的代码实现不多,内部使用AIDL + Handler的方式来传递消息,当中重要的就是这几个方法。

/*
*须要重写,開始jobScheduler的方法
*/
public abstract boolean onStartJob(JobParameters params);

/*
*停止JobScheduler的方法
*/
public abstract boolean onStopJob(JobParameters params);

/*
*完毕JobScheduler的方法
*/
public final void jobFinished(JobParameters params, boolean needsReschedule) {
    ensureHandler();
    Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
    m.arg2 = needsReschedule ? 1 : 0;
    m.sendToTarget();
}

在JobService中,这几个方法都是通过Handler发送Message。在Handler中调用了IJobCallback的底层的实现。

JobInfo

// jobId每一个Job任务的id
int jobId = 1;
// 指定你须要运行的JobService
ComponentName name = new ComponentName(getPackageName(), MyJobService.class.getName()));

JobInfo.Builder builder = new JobInfo.Bulider(jobId, name);

builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE); //设置须要的网络条件,默认NETWORK_TYPE_NONE

builder.setPeriodic(3000);//设置间隔时间

builder.setMinimumLatency(3000);// 设置任务运行最少延迟时间

builder.setOverrideDeadline(50000);// 设置deadline,若到期还没有达到规定的条件则会開始运行  

builder.setRequiresCharging(true);// 设置是否充电的条件,默认false

builder.setRequiresDeviceIdle(false);// 设置手机是否空暇的条件,默认false

builder.setPersisted(true);//设备重新启动之后你的任务是否还要继续运行

JobInfo info = builder.build();

演示样例代码实现

在MainActivity中运行JobScheduler的scheduler()方法

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.btn);
        button.setText(getClass().getSimpleName());
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
                    JobInfo jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()))
                            .setPeriodic(2000)
                            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                            .build();
                    jobScheduler.schedule(jobInfo);
                }
            }
        });
    }
}

MyService类

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)//API须要在21及以上
public class MyJobService extends JobService {

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            Toast.makeText(MyJobService.this, "MyJobService", Toast.LENGTH_SHORT).show();
            JobParameters param = (JobParameters) msg.obj;
            jobFinished(param, true);
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            return true;
        }
    });

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        Message m = Message.obtain();
        m.obj = params;
        handler.sendMessage(m);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        handler.removeCallbacksAndMessages(null);
        return false;
    }
}

Mainfiest.xml中注冊MyServcie

    <service
        android:name=".MyJobService"
        android:permission="android.permission.BIND_JOB_SERVICE">

在大多数Android5.0以上手机杀死APP进程后,仍然能够唤醒,手机重新启动在部分手机但是能够唤醒APP的。

JobScheduler还有待深入。这里推荐几篇比較好的博客。

Android之JobScheduler运行机制源代码分析

在Android 5.0中使用JobScheduler

5
0
查看评论
* 以上用户言论仅仅代表其个人观点,不代表CSDN站点的观点或立场

JobService的使用及源代码分析

Google在Android 5.0中引入JobScheduler来运行一些须要满足特定条件但不紧急的后台任务,APP利用JobScheduler来运行这些特殊的后台任务时来降低电量的消耗。本文首先介...
  • fishle123
  • fishle123
  • 2016-03-03 19:11
  • 8983

Android应用进程防杀指南3-JobService

本篇博文。我将带领大家学习更高端的APP进行防杀技巧。该技巧除了可以应对卫士、管家的清杀以外。更可以在相似于某米、某为系统的清理内存软件清理下确保进程存活下来。

它就是我们今天的主角JobShedule...

  • mynameishuangshuai
  • mynameishuangshuai
  • 2016-10-10 12:28
  • 8688

jobservice与jobchedule具体解释,以及怎样应用

 Jobschedule是android5.0之后提供的机制。

通过这样的机制。能够让系统在某些特定环境下或固定时间间隔里,异步运行一些作业。 Android提供这样的机制的目的就是为了优化...

  • syb666eee
  • syb666eee
  • 2017-04-20 14:40
  • 1602

Android 5.0 jobservice进程守活

Mainifrest文件声明service android:name=".service.ProcessService" android:permission="android.per...
  • liyantsc
  • liyantsc
  • 2016-10-13 17:27
  • 774

JobService和JobScheduler机制在Android5.0以上保活

原文地址:http://blog.csdn.net/mynameishuangshuai/article/details/52770129 http://blog.csdn.net/qq_336894...
  • dodod2012
  • dodod2012
  • 2017-04-05 16:17
  • 2990

Android JobScheduler/JobService 工作调度

这两个类是一个很有意思的类,最開始接触的是在看高人关于省电的文章发现的.它能够让开发人员在规定的时间内,然后在满足指定的条件下才開始运行任务.这样就牛逼多了. 可是这两个类仅仅在Android5.0版本号...
  • qq_31726827
  • qq_31726827
  • 2016-01-05 13:42
  • 8317

JobService使用演示样例源代码

  • 2016-03-03 19:15
  • 121KB
  • 下载

JSS 第 4 篇 - JobSchedulerService - cancel

基于 Android 7.1.1 源代码分析 前提 接下来,我们来看看 JobServiceService 服务中和 cancel 相关的服务: // 取消指定设备用户的所...
  • bcbaba
  • bcbaba
  • 2017-03-23 11:13
  • 260

JobService的使用及源代码分析

转自:http://blog.csdn.net/fishle123/article/details/50790894 Google在Android 5.0中引入JobScheduler来运行一些须要...
  • u010335298
  • u010335298
  • 2017-04-12 16:41
  • 364

JSS 第 2 篇 - JobSchedulerService 初始化

前言 服务端和client是通过 Binder 机制通信的,我们通常是通过例如以下方式来注冊和运行一个任务: public static int schedulePreOdexJob(int jo...
  • bcbaba
  • bcbaba
  • 2017-03-20 16:18
  • 361
    个人资料
    • 訪问:307553次
    • 积分:5290
    • 等级:
    • 排名:第5924名
    • 原创:232篇
    • 转载:7篇
    • 译文:2篇
    • 评论:55条
    博客专栏
    最新评论
posted @ 2018-01-11 14:33  llguanli  阅读(508)  评论(0编辑  收藏  举报