Android:使用START_REDELIVER_INTENT标志检测重新启动的服务

时间:2011-10-17 21:11:21

标签: android

我的小部件附加了一个服务来处理各种点击“命令”,这些命令通过其意图传递。我还为重新启动服务的情况设置return START_REDELIVER_INTENT;,以便在调用intent.getAction()时不给出nullPointerException;等等。问题是,当我通过setOnClickPendingIntent调用之一发送最后一个intent时,那么当重新启动服务时,它就好像用户点击了一个viewId一样。 e.g。

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重新启动我的服务的情况下不运行任何这些命令?

1 个答案:

答案 0 :(得分:17)

  

我可以做些什么来检查服务是否正在重新启动,以便在Android重新启动我的服务的情况下不运行任何这些命令?

如果正在重新发送onStartCommand()START_FLAG_REDELIVERY的flags参数将包含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
}