日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )

發布時間:2025/6/17 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 服务 | 不同版本兼容 | 源码资源 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。