我一直在阅读Android文档,我想知道是否有人能够了解当服务以START_STICKY启动服务时,服务实例会发生什么事情。我假设本地状态数据(实例变量)也丢失了。 Android在重新创建服务时是否有助于重新填充本地状态?
我有一些在意图中发送到服务的数据。在onStateCommand()中,我将根据intent中的内容填充服务的实例数据。根据我在Android文档中读到的内容,当服务被终止并重新启动时(传递给START_STICKY),传递给onStartCommand()的意图将为null。这是否意味着在重新创建服务时我丢失了intent和service的成员数据?
答案 0 :(得分:16)
当一个进程被终止并重新创建时,它会再次经历整个生命周期(从onCreate开始)。根据它的杀死方式以及如何保存数据,它可能也可能不可用。
至于重新获得意图,START_REDELIVER_INTENT
有一个标志会重新发出意图。
答案 1 :(得分:2)
我最近遇到了同样的问题。服务没有内置的保存状态的方法,最后的意图可能不足以使服务恢复到以前的状态。我的解决方案是让活动保持状态并通过startService()将该状态传递给服务。然后,该服务仅在活动中触发事件,例如:
这种方法清理了我的设计,服务和活动都很容易被杀死。
答案 2 :(得分:1)
Android在重新启动您的服务时不会重新填充“丢失的”数据值,因此您的代码需要满足此可能性。
我的方法是使用所有非原始状态变量并将它们保留为null。这样我可以测试null并采取适当的步骤来初始化它们。
我已经采取了存储轻量级数据的方法,我希望在应用程序首选项中重新启动应用程序。
答案 3 :(得分:1)
使用内部存储单独保存对象或其字段。
public void writeToInternalStorage(String fileName,String userName)
{
try{
String endOfLine = System.getProperty("line.separator");
StringBuffer buffer = new StringBuffer();
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); //// MODE_PRIVATE will create the file (or replace a file of the same name) and make it private to your application. Other modes available are: MODE_APPEND, MODE_WORLD_READABLE, and MODE_WORLD_WRITEABLE.
buffer.append(userName.toString() + endOfLine);
fos.write(buffer.toString().getBytes());
Log.v(TAG, "writeFileToInternalStorage complete.. " + buffer.toString());
// writer.write(userName);
fos.close();
}
catch(Exception e)
{
Log.v(TAG, "Error: " + e.getMessage());
ExceptionNotificationMessage("writeToInternalStorage() Error: " + e.getMessage());
}
}
public String readFromInternalStorage(String fileName)
{
try{
File file = this.getFileStreamPath(fileName);
if(file.exists() == true)
{
Log.v(TAG, "readFileFromInternalStorage File found...");
FileInputStream fis = openFileInput(fileName);
StringBuilder buffer = new StringBuilder();
int ch;
while( (ch = fis.read()) != -1){
buffer.append((char)ch);
}
Log.v(TAG, "readFileFromInternalStorage complete.. " + buffer.toString());
fis.close();
return buffer.toString();
}
}
catch(Exception e)
{
Log.v(TAG, "Error: " + e.getMessage());
ExceptionNotificationMessage("readFromInternalStorage() Error: " + e.getMessage());
}
return "";
}