如何通过START_STICKY将额外的值传递给服务?

时间:2018-12-19 15:06:28

标签: java android android-intent

在我的Android应用中,我有一项服务,该服务在被杀死后应自动重新启动。我发现可以使用START_STICKY来做到这一点。

但是很显然,当服务自动重新启动时,其意图是null。但是,问题在于意图用于传递值。请参见下面的示例:

public class MyService extends Service {
    public static final String MY_STRING_HANDLE = "MyString";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        // Read my string from intent
        Bundle extras = intent.getExtras(); // ERROR: Intent can be null
        if (extras == null) {
            throw new Error("Intent did not contain my string");
        }

        String myString = extras.getString(MY_STRING_HANDLE);
        if (myString == null || myString.isEmpty()) {
            throw new Error("Intent did not contain my string");
        }

        // Do something with my string
        doSomeThing(myString);

        return START_STICKY;
    }
}

所以通常我是这样启动服务的:

Intent intent = new Intent(activity, MyService.class);
intent.putExtra(MyService.MY_STRING_HANDLE, "Example string");
activity.startService(intent);

这可行,但是当服务被终止并自动重启时,我得到以下结果:

  

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.os.Bundle android.content.Intent.getExtras()'

所以我的问题是:如果我不能使用意图,那么我该如何将值(即myString)传递给我的服务?


关于可能的重复:我的问题不是关于意图为何null,而是关于我如何处理此问题。

1 个答案:

答案 0 :(得分:2)

使用START_REDELIVER_INTENT代替START_STICKY。另外,请确保对于您完全处理过的每个Intent,使用对stopSelf()的相应调用中提供的ID值来调用onStartCommand()

然后,如果Android终止您的进程(例如,内存不足),则Android将重新启动您的服务,并向您提供您未(通过Intent表示)的任何stopSelf()对象。


或者,不要依赖Intent附加功能。而是将数据存储在文件,数据库,SharedPreferences,服务器等中,并让您的服务从那里获取数据。