在本地調(diào)試app中的一個(gè)service時(shí),使用adb shell am startservice彈出報(bào)錯(cuò)
錯(cuò)誤信息如下:app is in background uid null秘案,如圖:
查了一些帖子發(fā)現(xiàn)提供的2018年左右的解決方案為:
Settings->Build,Execution,Deployment->Instant Run
關(guān)掉 Enable Instant Run to hot swap code/?
嘗試失效蓖墅。
后續(xù)找到解決方案:
adb shell am start-foreground-service -n com.demo.screenrecorder/com.demo.screenrecorder.RecordService
使用這個(gè)start-foreground-service來替換startservice可以解決這個(gè)問題。特此記錄。
PS:Android O 推出出了Background Execution Limits,減少后臺(tái)應(yīng)用內(nèi)存使用及耗電,一個(gè)很明顯的應(yīng)用就是不準(zhǔn)后臺(tái)應(yīng)用通過startService啟動(dòng)服務(wù)鹃觉。
解決方案就是及時(shí)調(diào)用startForeground,對(duì)于O以后的還要注意Notification需要一個(gè)ChannelID
@Override
public void onCreate() {
super.onCreate();
? ? try {
String CHANNEL_ONE_ID ="com.demo.screenrecorder";
? ? ? ? String CHANNEL_ONE_NAME ="Channel One";
? ? ? ? NotificationChannel notificationChannel =null;
? ? ? ? notificationChannel =new NotificationChannel(CHANNEL_ONE_ID,
? ? ? ? ? ? ? ? CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_DEFAULT);
? ? ? ? NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
? ? ? ? assert manager !=null;
? ? ? ? manager.createNotificationChannel(notificationChannel);
? ? ? ? startForeground(1, new NotificationCompat.Builder(this, CHANNEL_ONE_ID).build());
? ? }catch (Exception e) {
Log.e(TAG, e.getMessage());
? ? }
initView();
}