2011-10-17 142 views
4

我的窗口小部件附加了一個服務,用於處理通過其意圖傳遞的各種點擊「命令」。我還設置了return START_REDELIVER_INTENT;用於重新啓動服務時在調用intent.getAction()時不給出nullPointerException的情況。等等。問題是,當最後一個意圖是由我有的一個setOnClickPendingIntent調用發送的,那麼當服務重新啓動時,就好像用戶點擊了其中一個viewId一樣。例如Android:使用START_REDELIVER_INTENT標記檢測重新啓動的服務

String command = intent.getAction(); 
int appWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 
if(command.equals("some command")){ 
    //do something 
} 

... 

remoteView.setOnClickPendingIntent(R.id.viewId,MyClass.makeControlPendingIntent(getApplicationContext(),"some command",appWidgetId)); 

其中makeControlPendingIntent是:

public static PendingIntent makeControlPendingIntent(Context context, String command, int appWidgetId) { 
     Intent active = new Intent(context,MyService.class); 
     active.setAction(command); 
     active.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     Uri data = Uri.withAppendedPath(Uri.parse("myclass://widget/id/#"+command+appWidgetId), String.valueOf(appWidgetId)); 
     active.setData(data); 
     return(PendingIntent.getService(context, 0, active, PendingIntent.FLAG_UPDATE_CURRENT)); 
    } 

有什麼我可以做,以檢查服務是否正在重新啓動,以便不運行任何在Android的重新啓動我的服務的情況下,這些命令的?

回答

17

有什麼我可以做的,以檢查服務是否正在重新啓動,以便在Android重新啓動我的服務的情況下不運行任何這些命令?

flags參數onStartCommand()將包含START_FLAG_REDELIVERY如果Intent正在重新交付。所以,你可以做這樣的事情:

public int onStartCommand(Intent intent, int flags, int startId) { 
    if ((flags & START_FLAG_REDELIVERY)!=0) { // if crash restart... 
     // do something here 
    } 

    // rest of logic here 
} 
+1

在這種情況下,它可能更有意義返回START_STICKY和檢查爲NULL意圖。 – paul

0

你應該能夠只檢查是否意圖爲null知道,如果它的重新啓動

+0

START_REDELIVER_INTENT不會像START_STICKY那樣重新傳遞null Intent。 – paul