項目需要在后台獲取GPS經緯度。當用戶對手機有一段時間沒有操作后,屏幕(Screen)將從高亮(Bright)變為暗淡(Dim),如果再過段時間沒操作,
屏幕(Screen)將又由暗淡(Dim)變為不顯示(Off),如果再過段時間沒操作,CPU將sleep,從on變為off.這時服務會被殺死。
輸出log:

網絡給出很多種解決方法有橫豎屏還有輸入輸出沒close,創建太多對象等,但是發現不做任何實質操作只開啟一個服務,鎖屏后一段時間也會出現上面log。
之后嘗試過:
1.休眠后,手機鬧鍾服務定時觸發后台服務無效。
2.長時間休眠后,注冊動態廣播監聽app被移除無效。
3.長時間休眠后,后台服務被銷毀時觸發重啟服務無效,根本沒有進入ondestory()方法。
4.WAKE_LOCK無效。
還有就是一個解決辦法是開啟前台服務但是會一直有通知。最后綜合思路是:
1監聽用戶鎖屏。
2.鎖屏時打開前台廣播,解鎖時打開后台廣播。
監聽用戶鎖屏時必須是動態注冊在manifest中無效。
IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(MyBroadCastReciever, screenStateFilter) BroadcastReceiver MyBroadCastReciever = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i("application", "Screen went OFF"); Toast.makeText(context, "screen OFF", Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.i("application", "Screen went ON"); Toast.makeText(context, "screen ON", Toast.LENGTH_LONG).show(); } } };
然后就是前台服務就是在service的onStartCommand中加入
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setPriority(Notification.PRIORITY_MIN);// 設置該通知優先級 // mBuilder.setSmallIcon(R.drawable.gpsblue); Notification notification = mBuilder.build(); startForeground(1, notification);
startForeground(1, notification);方法中參數是0,前台服務是無效的;傳1是有效的。所以監聽鎖屏時,鎖屏開啟服務傳1。這樣service是前台的一直運行,但是看不到通知。屏幕亮時服務傳0,service不容易被殺死。
