gpt4 book ai didi

java - 如何使用 START_STICKY 将额外值传递给服务?

转载 作者:行者123 更新时间:2023-11-29 18:37:06 25 4
gpt4 key购买 nike

在我的 Android 应用程序中,我有一个服务应该在它被杀死后自动重启。我发现这可以使用 START_STICKY 来完成。

但显然当服务自动重启时, Intent 是null。然而,问题在于 Intent 是用来传递一个值的。请参见下面的示例:

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: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference

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


关于可能的重复:我的问题不是关于为什么 Intent 是 null,而是关于我如何处理这个问题。

最佳答案

使用 START_REDELIVER_INTENT 而不是 START_STICKY。此外,确保对于您完全处理的每个 Intent,调用 stopSelf() 并使用在对 onStartCommand() 的相应调用中提供的 ID 值>.

然后,如果 Android 终止了您的进程(例如,低内存),Android 将重新启动您的服务并向您提供您未指定的任何 Intent 对象(通过 stopSelf()) 你处理过的。


或者,不要依赖 Intent 额外功能。相反,将您的数据存储在文件、数据库、SharedPreferences、服务器等中,然后让您的服务从那里获取数据。

关于java - 如何使用 START_STICKY 将额外值传递给服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53853980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com