首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Service 防殺核心:START_REDELIVER_INTENT + 前台服務雙保險

     編輯:程式設計綜合問答

場景

監聽短信的 Service,靜態註冊退出 Activity 仍工作,但「清理內存/長按 Home 鍵清理」後被殺,失去監聽。

核心代碼:onStartCommand 返回粘性標誌

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // 關鍵:被異常殺死後,系統自動重啟並重傳 Intent
    return START_REDELIVER_INTENT;
}

四種啟動標誌對比

常量被殺後行為Intent 保留適用場景
START_STICKY重啟 Service,onStartCommand(Intent=null)否媒體播放器等狀態型
START_NOT_STICKY不重啟否一次性任務
START_REDELIVER_INTENT重啟並重傳最後 Intent是**關鍵監聽/下載/同步**
START_STICKY_COMPATIBILITY兼容模式,不保證重啟否舊版本兼容

雙重保險:前台服務

// 在 onCreate 或 onStartCommand 中
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("短信監聽服務")
    .setContentText("正在運行...")
    .setSmallIcon(R.drawable.ic_notification)
    .build();
startForeground(ONGOING_NOTIFICATION_ID, notification);
  • 前台服務優先級最高,系統極難殺死(除非極度內存不足)。
  • Android 8.0+ **必須**創建 NotificationChannel。
  • 配合 START_REDELIVER_INTENT,極大提升存活率。

補充:靜態註冊廣播的局限

Android 7.0+ 限制隱式廣播靜態註冊(如 SMS_RECEIVED 除外),建議動態註冊 + 高優先級 Service 保活。

**Service 不死秘籍:前台服務 + START_REDELIVER_INTENT + 合理內存佔用。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved