JobService和JobScheduler机制在Android5.0以上保活
2017-06-23 14:45
232 查看
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)1
1
/* *参数: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);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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(); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在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();1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
示例代码实现
在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); } } }); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Mainfiest.xml中注册MyServcie
<service android:name=".MyJobService" android:permission="android.permission.BIND_JOB_SERVICE">1
2
3
1
2
3
在大多数Android5.0以上手机杀死APP进程后,仍然可以唤醒,手机重启在部分手机可是可以唤醒APP的。
JobScheduler还有待深入,这里推荐几篇比较好的博客。
Android之JobScheduler运行机制源码分析
在Android 5.0中使用JobScheduler
相关文章推荐
- JobService和JobScheduler机制在Android5.0以上保活
- JobScheduler和JobService机制保活进程
- JobService和JobScheduler机制在Android5.0以上保活
- JobService和JobScheduler机制在Android5.0以上保活
- JobService 和 JobScheduler Android5.0以上的进程保活
- 解决Android5.0及以上启动Service时,java.lang.IllegalArgumentException: Service Intent must be explicit
- 《完美解决系列》Android5.0以上 Implicit intents with startService are not safe
- Activity跳转共享元素(android5.0以上)
- JobIntentService详解及使用
- 深入探究Android中的Service的运行机制
- Android IPC机制绑定Service实现本地通信
- nova service的heatbeat机制
- 定时任务 中的job中注入的service接口 为空 解决方法
- service mongod start start: Unknown job: mongod问题
- Atitit webservice的发现机制 discover机制
- Android5.0以上的状态栏透明和沉浸式模式兼容底部导航栏与界面重复
- Miranda的HOOK及SERVICE机制分析
- Binder机制之Service Manager(大内总管)
- k8s中service的机制
- 解决Service Networking Restart Job Failed方法之一