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

Android BroadcastReceiver 中啟動 Service 與 Thread 的合規性分析

     編輯:程式設計綜合問答

直接回答

  • 可以啟動 Service:context.startService(intent) 或 ContextCompat.startForegroundService()(API 26+)。Service 是四大組件,生命週期獨立,廣播結束後 Service 仍在運行。
  • 可以啟動 Thread:但極不推薦。廣播接收器生命週期極短(onReceive 超過 10 秒會 ANR),若線程執行耗時任務,廣播結束後進程優先級降低,線程極易被系統殺掉,導致任務中斷。

正確模式:廣播 → Service → 線程池/WorkManager

// BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent) {
    Intent serviceIntent = new Intent(context, MyTaskService.class);
    serviceIntent.putExtra("data", intent.getStringExtra("key"));
    ContextCompat.startForegroundService(context, serviceIntent); // 或 startService
}

// Service (IntentService 已棄用,推薦自定義 Service + 線程池)
public class MyTaskService extends Service {
    private ExecutorService executor = Executors.newSingleThreadExecutor();
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String data = intent.getStringExtra("data");
        executor.execute(() -> {
            doLongTask(data);
            stopSelf(startId); // 任務結束停止服務
        });
        return START_NOT_STICKY;
    }
    // ...
}

現代替代:WorkManager

Android Jetpack WorkManager 專為可延遲、可持久化的後台任務設計,自動處理 Doze 模式、電池優化、進程死亡重試,完全替代「廣播啟動線程」的場景:

OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(MyWorker.class)
    .setInputData(new Data.Builder().putString("key", value).build())
    .build();
WorkManager.getInstance(context).enqueue(work);

總結

廣播中**只做輕量分發**(啟動 Service/WorkManager/發送通知),**嚴禁**直接執行耗時邏輯或啟動裸線程。

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