成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從Service到WorkManager

開發 前端
關于Service,想必大家都太熟悉了,今天我們就再回顧下它的使用、概念、區別、變更歷史等等。

[[384763]]

前言

關于Service,想必大家都太熟悉了,今天我們就再回顧下它的使用、概念、區別、變更歷史等等。

概念和使用

Service 是一種可在后臺執行長時間運行操作而不提供界面的應用組件

兩種啟動方式:

  • startService() 生命周期為:onCreate() -> onStartCommand() -> onDestory()
  • bindService() 生命周期為:onCreate() -> onBind() -> onUnBind() -> onDestory()

其中要注意的是onStartCommand方法的返回值,有三種常量:

1) START_NOT_STICKY,終止服務后,除非除非有待傳遞的掛起 Intent,否則系統不會重建服務。

2) START_STICKY,終止服務后,會自動重新服務并調用 onStartCommand(),但不會重新傳遞最后一個 Intent。

3) START_REDELIVER_INTENT,終止服務后,會重建服務,并通過傳遞給服務的最后一個 Intent 調用 onStartCommand()。

當然,最后要使用的話還要在清單文件中注冊:

  1. <service android:enabled=["true" | "false"
  2.     android:exported=["true" | "false"
  3.     android:icon="drawable resource" 
  4.     android:isolatedProcess=["true" | "false"
  5.     android:label="string resource" 
  6.     android:name="string" 
  7.     android:permission="string" 
  8.     android:process="string" > 
  9.     . . . 
  10. </service> 

 

Service與子線程

關于Service,我的第一反應是運行在后臺的服務。

關于后臺,我的第一反應又是子線程。

那么Service和子線程到底是什么關系呢?

Service有兩個比較重要的元素:

  • 長時間運行。Service可以在Activity被銷毀,程序被關閉之后都可以繼續運行。
  • 不提供界面的應用組件。這其實解釋了后臺的意義,Service的后臺指的是不和界面交互,不依賴UI元素。

而且比較關鍵的點是,Service也是運行在主線程之中。

所以運行在后臺的Service和運行在后臺的線程區別還是挺大的。

  • 首先,所運行的線程不同。Service還是運行在主線程,而子線程肯定是開辟了新的線程。
  • 其次,后臺的概念不同。Service的后臺指的是不與界面交互,子線程的后臺指的是異步運行。
  • 最后,Service作為四大組件之一,控制它也更方便,只要有上下文就可以對其進行控制。

當然,雖然兩者概念不同,但是還是有很多合作之處。

Service作為后臺運行的組件,其實很多時候也會被用來做耗時操作,那運行在主線程的Service肯定不能直接進行耗時操作,這就需要子線程了。

開啟一個后臺Service,然后在Service里面進行子線程操作,這樣的結合給項目帶來的可能性就更大了。

Google也是考慮到這一點,設計出了IntentService這種已經結合好的組件供我們使用。

IntentService

IntentService 是一個繼承自Service,自帶工作線程和Handler,并且線程任務結束后自動銷毀的一個類。

源碼很簡單:

  1. @Override 
  2. public void onCreate() { 
  3.           super.onCreate(); 
  4.           //創建新線程并start 
  5.     HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); 
  6.     thread.start(); 
  7.     mServiceLooper = thread.getLooper(); 
  8.     //創建新線程對應的handler 
  9.     mServiceHandler = new ServiceHandler(mServiceLooper); 
  10.  
  11. @Override 
  12. public void onStart(@Nullable Intent intent, int startId) { 
  13.     //service啟動后發送消息給handler 
  14.     Message msg = mServiceHandler.obtainMessage(); 
  15.     msg.arg1 = startId; 
  16.     msg.obj = intent; 
  17.     mServiceHandler.sendMessage(msg); 
  18.  
  19. private final class ServiceHandler extends Handler { 
  20.     public ServiceHandler(Looper looper) { 
  21.         super(looper); 
  22.     } 
  23.     @Override 
  24.     public void handleMessage(Message msg) { 
  25.             //handler收到消息后調用onHandleIntent方法 
  26.         onHandleIntent((Intent)msg.obj); 
  27.         stopSelf(msg.arg1); 
  28.     } 

弊端

之前也說了,Service這些特性確實給了我們更多的可能性,我們可以在后臺靜默下載項目需要的東西、可以發心跳包、可以處理一些數據。

但是,也正是因為后臺無感知的特性,也帶來了隱私方面的隱患和弊端。

App可以在后臺操作用戶數據,下載應用無關的文件等等。

所以Google為了保護用戶隱私,在Android8.0開始,限制了后臺Service。

后臺和前臺Service

這就涉及到Service的分類了。

如果從是否無感知來分類,Service可以分為前臺和后臺。前臺Service會通過通知的方式讓用戶感知到,后臺有這么一個玩意在運行。

比如音樂類APP,在后臺播放音樂的同時,可以發現始終有一個通知顯示在前臺,讓用戶知道,后臺有一個這么音樂相關的服務。

在Android8.0,Google要求如果程序在后臺,那么就不能創建后臺服務,已經開啟的后臺服務會在一定時間后被停止。

所以,建議使用前臺Service,它擁有更高的優先級,不易被銷毀。使用方法如下:

  1. startForegroundService(intent); 
  2.  
  3.  public void onCreate() { 
  4.      super.onCreate(); 
  5.      Notification notification = new Notification.Builder(this) 
  6.              .setChannelId(CHANNEL_ID) 
  7.              .setContentTitle("主服務")//標題 
  8.              .setContentText("運行中...")//內容 
  9.              .setSmallIcon(R.mipmap.ic_launcher) 
  10.              .build(); 
  11.      startForeground(1,notification); 
  12.  }   
  13.  
  14.  
  15.  <!--android 9.0上使用前臺服務,需要添加權限--> 
  16.  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 

那后臺任務該怎么辦呢?官方建議使用 JobScheduler 。

JobScheduler

任務調度JobScheduler,Android5.0被推出。(可能有的朋友感覺比較陌生,其實他也是通過Service實現的,這個待會再說)

它能做的工作就是可以在你所規定的要求下進行自動任務執行。比如規定時間、網絡為WIFI情況、設備空閑、充電時等各種情況下后臺自動運行。

所以Google讓它來替代后臺Service的一部分功能,使用:

首先,創建一個JobService:

  1. public class MyJobService extends JobService { 
  2.  
  3.     @Override 
  4.     public boolean onStartJob(JobParameters params) { 
  5.         return false
  6.     } 
  7.  
  8.     @Override 
  9.     public boolean onStopJob(JobParameters params) { 
  10.         return false
  11.     } 
  12. }   

然后,注冊這個服務(因為JobService也是Service)

  1. <service android:name=".MyJobService" 
  2.     android:permission="android.permission.BIND_JOB_SERVICE" /> 

最后,創建一個JobInfo并執行

  1. JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);   
  2.  ComponentName jobService = new ComponentName(this, MyJobService.class); 
  3.  
  4.  JobInfo jobInfo = new JobInfo.Builder(ID, jobService)  
  5.          .setMinimumLatency(5000)// 任務最少延遲時間  
  6.          .setOverrideDeadline(60000)// 任務deadline,當到期沒達到指定條件也會開始執行  
  7.          .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 網絡條件,默認值NETWORK_TYPE_NONE 
  8.          .setRequiresCharging(true)// 是否充電  
  9.          .setRequiresDeviceIdle(false)// 設備是否空閑 
  10.          .setPersisted(true) //設備重啟后是否繼續執行 
  11.          .setBackoffCriteria(3000,JobInfo.BACKOFF_POLICY_LINEAR) //設置退避/重試策略 
  12.          .build();   
  13.  scheduler.schedule(jobInfo); 

簡單說下原理:

JobSchedulerService是在SystemServer中啟動的服務,然后會遍歷沒有完成的任務,通過Binder找到對應的JobService,執行onStartJob方法,完成任務。具體可以看看參考鏈接的分析。

所以也就知道了,在5.0之后,如果有需要后臺任務執行,特別是需要滿足一定條件觸發的任務,比如網絡電量等等情況,就可以使用JobScheduler。

有的人可能要問了,5.0之前怎么辦呢?

可以使用GcmNetworkManager或者BroadcastReceiver等處理部分情況下的任務需求。

Google也是考慮到了這一點,所以將5.0之后的JobScheduler和5.0之前的GcmNetworkManager、GcmNetworkManager、AlarmManager等和任務相關的API相結合,設計出了WorkManager。

WorkManager

WorkManager 是一個 API,可供您輕松調度那些即使在退出應用或重啟設備后仍應運行的可延期異步任務。

作為Jetpack的一員,并不算很新的內容,它的本質就是結合已有的任務調度相關的API,然后根據版本需求等來執行這些任務,官網有一張圖:

所以WorkManager到底能做什么呢?

  • 1、對于一些任務約束能很好的執行,比如網絡、設備空閑狀態、足夠存儲空間等條件下需要執行的任務。
  • 2、可以重復、一次性、穩定的執行任務。包括在設備重啟之后都能繼續任務。
  • 3、可以定義不同工作任務的銜接關系。比如設定一個任務接著一個任務。

總之,它是后臺執行任務的一大利器。

參考

https://developer.android.google.cn/guide/components/services#Lifecycle

http://gityuan.com/2017/03/10/job_scheduler_service/

本文轉載自微信公眾號「碼上積木」,作者碼上積木。轉載本文請聯系碼上積木公眾號。

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2009-03-25 09:44:46

IBM云計算智慧地球

2021-11-24 22:42:15

WorkManagerAPI

2021-06-29 10:50:40

Linux.NET命令

2025-04-30 10:55:46

2023-11-16 21:20:13

ListWatchkube

2022-07-27 11:10:49

SPserverBRPC引擎

2021-02-25 11:19:37

谷歌Android開發者

2015-09-17 13:09:48

預裝軟件毒瘤國產手機

2022-05-09 08:35:43

面試產品互聯網

2021-06-30 13:26:07

Service MesHTTP協議 Oitsi

2013-06-06 13:42:48

OSPF入門配置

2017-06-26 09:15:39

SQL數據庫基礎

2022-09-04 21:46:12

數據信息風險

2013-04-07 10:10:23

2023-10-12 15:38:50

FreeDOS命令

2011-05-17 10:22:24

項目管理

2015-02-27 11:05:12

開源云計算程序員

2011-02-23 11:22:59

DojoHTML 5

2012-03-31 10:49:18

ibmdw

2025-02-14 08:40:57

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产96在线 | 午夜合集| 欧美精品久久久久 | 国产精品一区在线观看 | 久草视 | 久久久久国产精品一区二区 | 欧美视频成人 | 69av在线视频| 日韩久久中文字幕 | 亚洲视频三区 | 日韩视频中文字幕 | 成人高清视频在线观看 | 亚洲精品视频免费观看 | 亚洲一区二区三区免费在线观看 | 操夜夜| 亚洲精品乱码久久久久久按摩 | 麻豆毛片| 九九爱这里只有精品 | 久久精品中文字幕 | 一级片在线观看 | 日本精品一区二区三区在线观看 | 国产成人综合久久 | 日韩精品久久久久 | www.jizzjizz| 欧美一二三 | 日本激情视频中文字幕 | 另类 综合 日韩 欧美 亚洲 | 欧美一区二区三区高清视频 | 亚洲精品福利视频 | 国产乱码精品一区二区三区忘忧草 | www.久| 日韩欧美一区在线 | 91av在线看| www.se91| 天天干天天玩天天操 | 国产在线色| 国产精品久久久久久吹潮 | 91国在线高清视频 | 久久av网站 | 日本天堂一区 | 精品天堂|