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

5
我的小部件附带了一个服务来处理通过意图传递的各种点击“命令”。我还设置了return START_REDELIVER_INTENT;,以防止在调用intent.getAction()等时出现nullPointerException,这是当服务重新启动时的情况。问题是,当最后一个意图由我设置的其中一个setOnClickPendingIntent调用发送时,当服务重新启动时,它会像用户单击了一个viewId一样操作。例如:
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个回答

17

如果Android重新启动服务,有什么方法可以检查服务是否正在重新启动,以便不运行任何这些命令?

onStartCommand()的flags参数将包含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 Intent可能更有意义。 - paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接