2015年3月17日 星期二

[Android] 關於服務Service - Service會被Killed?

是的,Service會被killed,尤其是Low Memory時,
如果系統loading不重時呢?還是有可能,
以下就Service相關的一些設定來討論一下...

1. onStartCommand()的回傳值
START_STICKY:之前的範例裡,我們就是採用這回傳值,
Service被killed後,在系統loading允許下,Service會被重新啓動,
不過,傳進來的intent可能是null,
如果我們需要從intent取得資料,要先做判斷:
@Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  if(intent != null)
  {
   String sData1=Intent.getStringExtra("DATA_KEY1");
   int iData2=Intent.getIntExtra("DATA_KEY2",0);
   mServiceThread = new ServiceThread();
   mServiceThread.start();
   }
   else
   {
     Intent i = new Intent(xxx);
     sendBroadcast(i);
   }
    return  START_STICKY ; 
 }      
如果你就是需要這些資料才能開始Service,
那麼,你需要透過sendBroadcast(),
發一個broadcast event給當初啓動Service的Activity,
從那裡再啓動Service一次,順便把資料帶入,
經實驗結果,Service大概在30分鐘左右會被重啓(每個裝置會不同),
尤其是Service在idle時,
例如監控網路通訊,如果都沒有封包,
Service一直沒事做,那它可能就會被killed,然後很快又被重啓,
你可以看到執行中,Service不見了幾秒,
目前是沒遇到重啓失敗的情形
START_NOT_STICKY: Service被killed就結束了,不會自動重啓
START_REDELIVER_INTENT: Service被killed後會被重啓,
並且傳入最後的intent,
也就是說,intent不會是null,
不過,不知為何,我使用這個參數時程式會hang up

2. 修改AndroidManifest.xml
有人建議可以加上<intent-filter android:priority="1000"></intent-filter>來提高Service的Priority,
經實際結果,被重啓時間有稍微拉長些,大概60分鐘會重啓一次

其它還有人試著在onDestroy()裡重啓自己,
但因為Service被killed時,onDestroy()不見得會被呼叫,
所以此法我就沒有試了...

不管怎樣,怎麼好像都會被重啓呢?
有沒有不被重啓的方法?
可以試試把Service設成Foreground Service:
Notification notification = new Notification(R.drawable.launch, "Your Application Name", System.currentTimeMillis());  
Intent notificationIntent = new Intent(this, YourMainActivity.class);  
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);  
notification.setLatestEventInfo(this, "Your Application Name", "Your Service Name", pendingIntent);  
startForeground(1, notification);
使用Foreground方式,啓動後,你會看到在狀態列有一個你自定的icon, 經實際結果,跑了一天,Service從未被重啓過

沒有留言:

張貼留言