Android安卓进程保活(二)
生活随笔
收集整理的這篇文章主要介紹了
Android安卓进程保活(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android進程保活·設置前臺Service,提升App進程優先級
Android進程
此文章代碼Github上有提交:https://github.com/NorthernBrain/processKeep_Service/tree/master
首先你要知道Android中的進程以及它的優先級,下面來說明它進程
下面進行解釋:
前臺進程(Foreground process):
用戶當前操作所必需的進程。如果一個進程滿足以下任一條件,即視為前臺進程:- 托管用戶正在交互的 Activity(已調用 Activity 的 onResume() 方法)
- 托管某個 Service,后者綁定到用戶正在交互的 Activity
- 托管正在“前臺”運行的 Service(服務已調用 startForeground())
- 托管正執行一個生命周期回調的 Service(onCreate()、onStart() 或 onDestroy())
- 托管正執行其 onReceive() 方法的 BroadcastReceiver
可見進程 (Visible process):
沒有任何前臺組件、但仍會影響用戶在屏幕上所見內容的進程。 如果一個進程滿足以下任一條件,即視為可見進程:- 托管不在前臺、但仍對用戶可見的 Activity(已調用其 onPause() 方法)。例如,如果前臺 Activity 啟動了一個對話框,允許在其后顯示上一 Activity,則有可能會發生這種情況。
- 托管綁定到可見(或前臺)Activity 的 Service。
可見進程被視為是極其重要的進程,除非為了維持所有前臺進程同時運行而必須終止,否則系統不會終止這些進程。
服務進程 (Service process):
正在運行已使用 startService() 方法啟動的服務且不屬于上述兩個更高類別進程的進程。盡管服務進程與用戶所見內容沒有直接關聯,但是它們通常在執行一些用戶關心的操作(例如,在后臺播放音樂或從網絡下載數據)。因此,除非內存不足以維持所有前臺進程和可見進程同時運行,否則系統會讓服務進程保持運行狀態。后臺進程 (Service process):
包含目前對用戶不可見的 Activity 的進程(已調用 Activity 的 onStop() 方法)。這些進程對用戶體驗沒有直接影響,系統可能隨時終止它們,以回收內存供前臺進程、可見進程或服務進程使用。 通常會有很多后臺進程在運行,因此它們會保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進程最后一個被終止。如果某個 Activity 正確實現了生命周期方法,并保存了其當前狀態,則終止其進程不會對用戶體驗產生明顯影響,因為當用戶導航回該 Activity 時,Activity 會恢復其所有可見狀態。空進程 (Empty process):
不含任何活動應用組件的進程。保留這種進程的的唯一目的是用作緩存,以縮短下次在其中運行組件所需的啟動時間。 為使總體系統資源在進程緩存和底層內核緩存之間保持平衡,系統往往會終止這些進程。進程優先級:
首先空進程是最先被回收的,其次便是后臺進程,依次往上,前臺進程是最后才會被結束。Android進程保活
有很多種方法可以實現Android的進程保活,比如通過?1像素且透明Activity提升App進程優先級、通過設置前臺Service提升App進程優先級、Java層的雙進程拉活、JobScheduler實現、NDK雙進程守護、使用賬戶同步拉活、workmanager實現。下面這幅圖,說明的是:
- 紅色部分是容易被回收的進程,屬于android進程
- 綠色部分是較難被回收的進程,屬于android進程
- 其他部分則不是android進程,也不會被系統回收,一般是ROM自帶的app和服務才能擁有
本篇文章介紹的是進程第二種方式:
- 設置前臺Service,提升App進程優先級
設置前臺Service,提升App進程優先級:
首先創建ForegroundService.java繼承自Service(android.app.Service):↓
這里要注意,不同的Android版本,所用的方式也就不同,并且不能顯示通知欄,這里需要在onStartCommand中判斷Android版本,選擇不同的操作
public class ForegroundService extends Service {private static final int SERVICE_ID = 1;public void onCreate() {super.onCreate();Log.d("ForegroundServiceNew", "開啟ForegroundService");}public void onDestroy() {super.onDestroy();Log.d("ForegroundServiceNew", "銷毀ForegroundService");}public IBinder onBind(Intent intent) {return null;}(api = Build.VERSION_CODES.O)public int onStartCommand(Intent intent, int flags, int startId) {//判斷版本if (Build.VERSION.SDK_INT < 18) {//Android4.3以下版本//將Service設置為前臺服務,可以取消通知欄消息startForeground(SERVICE_ID, new Notification());} else if (Build.VERSION.SDK_INT < 24) {//Android4.3 - 7.0之間//將Service設置為前臺服務,可以取消通知欄消息startForeground(SERVICE_ID, new Notification());startService(new Intent(this, InnerService.class));} else {//Android 8.0以上NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);if (manager != null) {NotificationChannel channel = new NotificationChannel("channel","name",NotificationManager.IMPORTANCE_NONE);manager.createNotificationChannel(channel);NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"channel");//將Service設置為前臺服務,Android 8.0 App啟動不會彈出通知欄消息,退出后臺會彈出通知消息//Android9.0啟動時候會立刻彈出通知欄消息startForeground(SERVICE_ID,new Notification());}}return START_STICKY;}public static class InnerService extends Service {public IBinder onBind(Intent intent) {return null;}public int onStartCommand(Intent intent, int flags, int startId) {startForeground(SERVICE_ID, new Notification());stopForeground(true);//移除通知欄消息stopSelf();return super.onStartCommand(intent, flags, startId);}}}復制代碼加入權限 <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> 復制代碼
最后在MainActivity啟動服務就行:↓ public class MainActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//設置前臺Service,提升App進程優先級startService(new Intent(this,ForegroundService.class));} }復制代碼
轉載于:https://juejin.im/post/5c1b8a9b6fb9a049e70212b8
總結
以上是生活随笔為你收集整理的Android安卓进程保活(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作为Java工程师,你的Spring用对
- 下一篇: PostgreSQL SSL启用与CA证