原文地址:Android8.0 後臺服務保活的一種思路 | Stars-One的雜貨小窩 項目中有個MQ服務,需要一直連著,接收到消息會發送語音,且手機要在鎖屏也要實現此功能 目前是使用廣播機制實現,每次MQ收到消息,觸發一次啟動服務操作邏輯 在Android11版本測試成功,可實現上述功能 步驟 ...
原文地址:Android8.0 後臺服務保活的一種思路 | Stars-One的雜貨小窩
項目中有個MQ服務,需要一直連著,接收到消息會發送語音,且手機要在鎖屏也要實現此功能
目前是使用廣播機制實現,每次MQ收到消息,觸發一次啟動服務操作邏輯
在Android11版本測試成功,可實現上述功能
步驟
具體流程:
- 進入APP
- 開啟後臺服務Service
- 後臺服務Service開啟線程,連接MQ
- MQ的消費事件,發送廣播
- 廣播接收器中,處理啟動服務(若服務已被關閉)和文本語音播放功能
1.廣播註冊
<receiver
android:name=".receiver.MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//匹配下之前定義的action
if ("OPEN_SERVICE".equals(action)) {
if (!ServiceUtils.isServiceRunning(MqMsgService.class)) {
Log.e("--test", "服務未啟動,先啟動服務");
Intent myIntent = new Intent(context, MqMsgService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
}
String text = intent.getStringExtra("text");
Log.e("--test", "廣播傳的消息"+text);
EventBus.getDefault().post(new SpeakEvent(text));
}
}
}
語音初始化的相關操作都在服務中進行的,這裡不再贅述(通過EventBus轉發時間事件)
這裡需要註意的是,Android8.0版本,廣播不能直接startService()
啟動服務,而是要通過startForegroundService()
方法,而調用了startForegroundService()
方法,則是需要服務在5s內調用一個方法startForeground()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification notification = NotifyUtil.sendNotification(this, "平板", "後臺MQ服務運行中", NotificationCompat.PRIORITY_HIGH);
startForeground(1, notification);
}
上面這段代碼,就是寫在Service中的onCreate方法內,之前也是找到有資料說,需要有通知欄,服務才不會被Android系統給關閉,也不知道有沒有起到作用