在我的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
,而是关于我如何处理此问题。
答案 0 :(得分:2)
使用START_REDELIVER_INTENT
代替START_STICKY
。另外,请确保对于您完全处理过的每个Intent
,使用对stopSelf()
的相应调用中提供的ID值来调用onStartCommand()
。
然后,如果Android终止您的进程(例如,内存不足),则Android将重新启动您的服务,并向您提供您未(通过Intent
表示)的任何stopSelf()
对象。
或者,不要依赖Intent
附加功能。而是将数据存储在文件,数据库,SharedPreferences
,服务器等中,并让您的服务从那里获取数据。