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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android安卓进程保活(二)

發布時間:2025/3/17 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android安卓进程保活(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android進程?;睢ぴO置前臺Service,提升App進程優先級

Android進程


此文章代碼Github上有提交:https://github.com/NorthernBrain/processKeep_Service/tree/master


首先你要知道Android中的進程以及它的優先級,下面來說明它進程
  • 前臺進程 (Foreground process)
  • 可見進程 (Visible process)
  • 服務進程 (Service process) 后臺進程 (Background process) 空進程 (Empty process)

    下面進行解釋:


    前臺進程(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進程?;?/h2> 有很多種方法可以實現Android的進程?;?#xff0c;比如通過?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;@Overridepublic void onCreate() {super.onCreate();Log.d("ForegroundServiceNew", "開啟ForegroundService");}@Overridepublic void onDestroy() {super.onDestroy();Log.d("ForegroundServiceNew", "銷毀ForegroundService");}@Overridepublic IBinder onBind(Intent intent) {return null;}@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic 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 {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic 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 {@Overrideprotected 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安卓进程保活(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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