Android小知識-電量優化JobScheduler
通過不停的喚醒CPU(通過後天常駐的Service)來達到一些功能的使用,這樣會造成電量資源的消耗,比如後臺日誌的上報,定期更新資料等等,在Android 5.0提供了一個JobScheduler元件,通過設定一系列的預置條件,當條件滿足時,才執行對應的操作,這樣既能省電,有保證了功能的完整性。
JobScheduler的適用場景:
-
重要不緊急的任務,可以延遲執行,比如定期資料庫資料更新和資料上報
-
耗電量較大的任務,比如充電時才執行的備份資料操作。
-
不緊急可以不執行的網路任務,比如在Wi-Fi環境下預載入資料。
-
可以批量執行的任務
-
......等等
JobScheduler的使用
private Context mContext; private JobScheduler mJobScheduler; public JobSchedulerManager(Context context){ this.mContext=context; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { this.mJobScheduler= (JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE); } }
通過getSystemService()方法獲取一個JobSchedule的物件。
public boolean addTask(int taskId) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { JobInfo.Builder builder = new JobInfo.Builder(taskId, new ComponentName("com.apk.administrator.loadapk", JobScheduleService.class.getName())); switch (taskId) { case 1: //每隔1秒執行一次 builder.setPeriodic(1000); break; case 2: //裝置重啟後,不再執行該任務 builder.setPersisted(false); break; default: break; } if (null != mJobScheduler) { return mJobScheduler.schedule(builder.build()) > 0; } else { return false; } } else { return true; } }
建立一個JobInfo物件時傳入兩個引數,第一個引數是任務ID,可以對不同的任務ID做不同的觸發條件,執行任務時根據任務ID執行具體的任務;第二個引數是JobScheduler任務的服務,引數為程序名和服務類名。
JobInfo支援以下幾種觸發條件:
-
setMinimumLatency(long minLatencyMillis):設定任務的延遲時間(單位是ms),需要注意的是,setMinimumLatency與setPeriodic(long time)方法不相容,同時呼叫會引起異常。
-
setOverrideDeadline(long maxExecutionDelayMillis):設定任務最晚的延遲時間。如果到了規定時間,其它條件還未滿足,這個任務也會被啟動。與setMinimumLatency(long time)一樣,setOverriddeDeadline與setPeriodic(long time)同時呼叫會引起異常。
-
setPersisted(boolean isPersisted):設定重啟之後,任務是否還要繼續執行。
-
setRequiredNetworkType(int networkType):只有滿足指定的網路條件時,才會被執行。有三種網路條件,JobInfo.NETWORK_TYPE_NONE不管是否有網路,這個任務都會被執行(如果未設定,這個引數就是預設引數);JobInfo.NETWORK_TYPE_ANY只有在有網路的情況下,任務才會執行,和網路型別無關;JobInfo.NETWORK_TYPE_UNMETERED非運營商網路(比如在Wi-Fi連線時),任務才會被執行。
-
setRequiresCharging(boolean requiresCharging):只有當裝置在充電時,這個任務才會被執行。
-
setRequiresDeviceIdle(boolean requiresDeviceIdle):只有當用戶沒有在使用該裝置且有一段時間沒有使用時,才會啟動該任務。
public class JobScheduleService extends JobService { @Override public boolean onStartJob(JobParameters params) { return false; } @Override public boolean onStopJob(JobParameters params) { return false; } }
JobService執行在主執行緒,如果是耗時任務,使用ThreadHandler或者一個非同步任務來執行耗時的任務,防止阻塞主執行緒。
JobScheduleService繼承JobService,實現兩個方法onStartJob和onStopJob。
任務開始時,執行onStartJob方法,當任務執行完畢後,需要呼叫jobFinished方法來通知系統;任務執行完成後,呼叫jobFinished方法通知JobScheduler;當系統接受到一個取消請求時,呼叫onStopJob方法取消正在等待執行的任務。如果系統在接受到一個取消請求時,實際任務佇列中已經沒有正在執行的任務,onStopJob不會被呼叫。
最後在AndroidManifest中配置下:
<service android:name=".JobScheduleService" android:permission="android.permission.BIND_JOB_SERVICE" />

掃碼_搜尋聯合傳播樣式-標準色版.png
Android、Java、Python、Go、PHP、IOS、C++、HTML等等技術文章,更有各種書籍推薦和程式員資訊,快來加入我們吧!關注技術共享筆記。

838794-506ddad529df4cd4.webp.jpg
搜尋微信“顧林海”公眾號,定期推送優質文章。