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

JobService和JobScheduler机制在Android5.0以上保活的更多相关文章

  1. Android5.0和Android6.0适配

    gradle配置项 compileSdkVersion 用哪个 Android SDK 版本编译你的应用.因此我们强烈推荐总是使用最新的 SDK 进行编译.在现有代码上使用新的编译检查可以获得很多好处 ...

  2. android5.0联系人 sort_key改成phonebook_label

    项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...

  3. ANdroid5.0不能隐式启动service,必须显示,解决办法,加服务端包名

    Intent intent = new Intent(); intent.setAction("com.viaembedded.veonvif.RemoteService");// ...

  4. 一个Activity掌握Android5.0新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...

  5. android5.0 编译

    android5.0编译需要jdk1.7版本,将来本地可能需要同时维护两套jdk版本,请参考: 在线安装openjdk1.7 sudo apt-get install openjdk-7-jre op ...

  6. Eclipse搭建Android5.0应用开发环境 “ndk-build”:launchingfailed问题解决

    Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...

  7. 友情提醒:欲开发android5.0以上应用,请全部更新开发工具至最新

    周末帮人完成一个项目,android5.0以上版本,谁知道被开发工具折腾的死去活来.我的开发环境是adt-bundle-windows-x86-20140702.zip版本,也是目前能找到的adt-b ...

  8. Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决

    Android Material Design Ripple Effect在Android5.0(SDK=21)以下Android版本崩溃问题解决 附录1的Android Ripple Effect水 ...

  9. ANDROID5.0触摸屏校准

    1.校准原理: 1)首先生成校准用的参数,可以适用tslib生成校准参数,也可以使用校准app生成:使用校准app进行校准对使用者要求比较低,使用者可以不用学习复杂的命令:本文使用app方式 2)生成 ...

随机推荐

  1. logback 生成日志

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <appender ...

  2. 编程精粹--编写高质量C语言代码(4):为子系统设防(一)

    通常,子系统都要对事实上现细节进行隐藏,在进行细节隐藏的同一时候.子系统为用户提供了一些关键入口点. 程序猿通过调用这些关键的入口点来实现与子系统的通信.因此假设在程序中使用这种子系统而且在其调用点加 ...

  3. 利用hibernateTemplate进行最简单的分页

    安全的方法例如以下.别用Session s=getSession()........ /**  * 使用hql 语句进行操作  * @param hql HSQL 查询语句  * @param off ...

  4. ajax同时请求多个服务器?

    这是地址, http://119.29.23.116/info.php 大侠你怎么看 想利用雅黑探针检测服务器的在线状态,但对AJAX多个请求不会操作 header('Access-Control-A ...

  5. worktools-git 工具的使用总结(2)

    1.创建分支 git branch son parent //创建分支,是在master 分支的基础上创建 :~/myGit$ git st # On branch master nothing to ...

  6. Flume的Collector

    Collector的作用是将多个Agent的数据汇总后,加载到Storage中.它的source和sink与agent类似. 数据源(source),如: collectorSource[(port) ...

  7. Codefroces 831B Keyboard Layouts

    B. Keyboard Layouts time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. var和ES6的let

    来源自:http://www.jstips.co/zh_cn/javascript/keyword-var-vs-let/ 特此做个笔记 概述 通过 var 定义的变量,它的作用域是在 functio ...

  9. matlab 局部特征检测与提取(问题与特征)

    物体识别:SIFT 特征: 人脸识别:LBP 特征: 行人检测:HOG 特征: 0. 常见手工设计的低级别特征 manually designed low-level features 语音:高斯混合 ...

  10. 3. ZAB与Paxos算法的联系与区别。

    转自:https://blog.csdn.net/en_joker/article/details/78665809 ZAB协议并不是Paxos算法的一个典型实现,在讲解ZAB和Paxos之间的区别之 ...