【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )
文章目錄
- 一、 JobScheduler 用法簡介
- 二、 JobScheduler 拉活完整代碼
- 1、 JobService
- 2、清單文件
- 3、啟動 JobScheduler 任務
- 4、運行效果
- 三、 源碼資源
一、 JobScheduler 用法簡介
JobScheduler 機制可以規定在特定狀態 , 特定時間 , 執行周期性任務 ;
JobScheduler 是系統服務 , 由系統負責調度第三方應用注冊的 JobScheduler , 定時完成指定任務 ;
部分設備 , 版本 , 無法達到拉活效果 ;
這種拉活方式 , 需要在 API Level 212121 以上才可以使用 ;
在應用中 , 創建一個 JobService 服務 , JobService 需要 API Level 212121 ;
該服務注冊時必須聲明 android.permission.BIND_JOB_SERVICE 權限 ;
<!-- JobScheduler 拉活 --><serviceandroid:name=".jobscheduler.KeepAliveJobService"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_JOB_SERVICE"></service>JobScheduler 用法 :
① 獲取 JobScheduler 對象 : 通過 Binder 機制獲取該 JobScheduler 系統服務 ;
// 創建 JobScheduler JobScheduler jobScheduler =(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);② 指定 JobScheduler 任務信息 JobInfo : 綁定任務 ID , 指定任務的運行組件 , 也就是之前創建并注冊的 JobService , 最后要設置該任務在重啟后也要執行 ;
// 第一個參數指定任務 ID // 第二個參數指定任務在哪個組件中執行 // setPersisted 方法需要 android.permission.RECEIVE_BOOT_COMPLETED 權限 // setPersisted 方法作用是設備重啟后 , 依然執行 JobScheduler 定時任務 JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(10,new ComponentName(context.getPackageName(), KeepAliveJobService.class.getName())).setPersisted(true);③ 設置時間信息 : 7.07.07.0 以下的系統可以設置間隔 , 7.07.07.0 以上設置不了 ; 7.07.07.0 以上的版本需要設置延遲執行 , 否則無法啟動 ;
// 7.0 以下的版本, 可以每隔 5000 毫秒執行一次任務 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){jobInfoBuilder.setPeriodic(5_000); }else{// 7.0 以上的版本 , 設置延遲 5 秒執行// 該時間不能小于 JobInfo.getMinLatencyMillis 方法獲取的最小值jobInfoBuilder.setMinimumLatency(5_000); }④ 開啟定時任務 :
// 開啟定時任務 jobScheduler.schedule(jobInfoBuilder.build());⑤ 7.07.07.0 以上的特殊處理 : 由于在 7.07.07.0 以上的系統中設置了延遲執行 , 需要在 JobService 的 onStartJob 方法中 , 再次開啟一次 JobScheduler 任務執行 , 也就是重復上述 ① ~ ④ 執行 , 這樣就實現了周期性執行的目的 ;
public class KeepAliveJobService extends JobService {@Overridepublic boolean onStartJob(JobParameters params) {Log.i("KeepAliveJobService", "JobService onStartJob 開啟");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){// 如果當前設備大于 7.0 , 延遲 5 秒 , 再次執行一次startJob(this);}return false;} }二、 JobScheduler 拉活完整代碼
1、 JobService
package kim.hsl.keep_progress_alive.jobscheduler;import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; import android.app.job.JobService; import android.content.ComponentName; import android.content.Context; import android.os.Build; import android.util.Log;import androidx.annotation.RequiresApi;@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class KeepAliveJobService extends JobService {@Overridepublic boolean onStartJob(JobParameters params) {Log.i("KeepAliveJobService", "JobService onStartJob 開啟");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){// 如果當前設備大于 7.0 , 延遲 5 秒 , 再次執行一次startJob(this);}return false;}@Overridepublic boolean onStopJob(JobParameters params) {Log.i("KeepAliveJobService", "JobService onStopJob 關閉");return false;}public static void startJob(Context context){// 創建 JobSchedulerJobScheduler jobScheduler =(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);// 第一個參數指定任務 ID// 第二個參數指定任務在哪個組件中執行// setPersisted 方法需要 android.permission.RECEIVE_BOOT_COMPLETED 權限// setPersisted 方法作用是設備重啟后 , 依然執行 JobScheduler 定時任務JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(10,new ComponentName(context.getPackageName(), KeepAliveJobService.class.getName())).setPersisted(true);// 7.0 以下的版本, 可以每隔 5000 毫秒執行一次任務if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){jobInfoBuilder.setPeriodic(5_000);}else{// 7.0 以上的版本 , 設置延遲 5 秒執行// 該時間不能小于 JobInfo.getMinLatencyMillis 方法獲取的最小值jobInfoBuilder.setMinimumLatency(5_000);}// 開啟定時任務jobScheduler.schedule(jobInfoBuilder.build());} }
2、清單文件
核心配置 :
<!-- JobScheduler 拉活 --><serviceandroid:name=".jobscheduler.KeepAliveJobService"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_JOB_SERVICE"></service>完整配置 :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.keep_progress_alive"><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permissionandroid:name="android.permission.GET_ACCOUNTS"android:maxSdkVersion="22" /><uses-permissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"android:maxSdkVersion="22" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><uses-permissionandroid:name="android.permission.WRITE_SYNC_SETTINGS"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Keep_Progress_Alive"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!--設置最近任務列表中不顯示該 Activity 組件 ( 不要被用戶察覺 )android:excludeFromRecents="true"設置 Activity 親和性讓該界面在一個獨立的任務棧中 , 不要與本應用的其它任務棧放在一起避免解除鎖屏后 , 關閉 1 像素界面 , 將整個任務棧都喚醒android:taskAffinity="kim.hsl.keep_progress_alive.alive"--><activityandroid:name=".one_pixel_activity.OnePixelActivity"android:excludeFromRecents="true"android:taskAffinity="kim.hsl.keep_progress_alive.onepixel"android:theme="@style/OnePixelActivityTheme" /><!-- 用于提權的前臺進程 --><serviceandroid:name=".foreground_service.ForegroundService"android:enabled="true"android:exported="true" /><!-- 用于提權的前臺進程, 關閉通知操作 --><serviceandroid:name=".foreground_service.CancelNotificationService"android:enabled="true"android:exported="true" /><!-- 系統 Service 機制拉活 --><serviceandroid:name=".stick_service.StickService"android:enabled="true"android:exported="true" /><!-- 用于賬戶同步拉活 --><serviceandroid:name=".account_service.AuthenticationService"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.accounts.AccountAuthenticator" /></intent-filter><meta-dataandroid:name="android.accounts.AccountAuthenticator"android:resource="@xml/account_authenticator" /></service><!-- 賬戶同步服務 --><serviceandroid:name=".account_service.AccountSyncService"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.content.SyncAdapter" /></intent-filter><meta-dataandroid:name="android.content.SyncAdapter"android:resource="@xml/sync_adapter" /></service><!-- 賬戶同步 ContentProvider --><providerandroid:authorities="kim.hsl.keep_progress_alive.provider"android:name=".account_service.AccountSyncContentProvider" /><!-- JobScheduler 拉活 --><serviceandroid:name=".jobscheduler.KeepAliveJobService"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_JOB_SERVICE"></service></application></manifest>3、啟動 JobScheduler 任務
package kim.hsl.keep_progress_alive;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent; import android.os.Build; import android.os.Bundle;import kim.hsl.keep_progress_alive.account_service.AccountUtils; import kim.hsl.keep_progress_alive.foreground_service.ForegroundService; import kim.hsl.keep_progress_alive.jobscheduler.KeepAliveJobService; import kim.hsl.keep_progress_alive.one_pixel_activity.KeepProgressAliveManager; import kim.hsl.keep_progress_alive.stick_service.StickService;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 1. 1 像素 Activity 提升應用權限// 注冊廣播接收者 , 1 像素 Activity 啟動的 廣播接收者//KeepProgressAliveManager.getmInstance().registerReceiver(this);// 2. 通過前臺 Service 提升應用權限// 啟動普通 Service , 但是在該 Service 的 onCreate 方法中執行了 startForeground// 變成了前臺 Service 服務//startService(new Intent(this, ForegroundService.class));// 3. 使用 Service 機制拉活//startService(new Intent(this, StickService.class));// 4. 賬戶同步拉活//AccountUtils.addAccount(this);// 開始同步//AccountUtils.autoSyncStart();// 5. JobScheduler 拉活if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {KeepAliveJobService.startJob(this);}}@Overrideprotected void onDestroy() {super.onDestroy();// 1. 取消注冊廣播接收者, 也可以不取消注冊//KeepProgressAliveManager.getmInstance().registerReceiver(this);} }
4、運行效果
每隔 5 秒調用一次 ;
三、 源碼資源
源碼資源 :
- GitHub 地址 : https://github.com/han1202012/Keep_Progress_Alive
- CSDN 源碼快照 : https://download.csdn.net/download/han1202012/16619430
總結
以上是生活随笔為你收集整理的【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 进程保活】应用进程拉活
- 下一篇: 【Android 进程保活】应用进程拉活