Android長時間后台運行Service


     項目需要在后台獲取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不容易被殺死。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM