使用START_STICKY启动服务进程后,onStartCommand被终止

我一直在阅读Android的文档,我想知道是否有人可以揭示一个服务启动的服务开始与服务实例发生什么事情的START_STICKY有它的进程被杀害。 我假设本地状态数据(实例variables)也丢失。 当Android重新创build服务时,Android是否做任何事情来帮助重新填充本地状态?

我有一些数据被发送到服务的意图。 在onStateCommand()中,我将根据意图中的内容来填充服务的实例数据。 根据我在Android文档中读到的内容,当服务被终止并重新启动(使用START_STICKY)时,传递给onStartCommand()的意图将为空。 这是否意味着服务被重新创build时,我失去了意图和服务的成员数据?

Solutions Collecting From Web of "使用START_STICKY启动服务进程后,onStartCommand被终止"

当一个进程被终止并重新创build时,它会再次遍历整个生命周期(从onCreate开始)。 取决于如何杀死数据以及如何保存数据,可能会或可能不会提供给您。

至于意图回来,有一个START_REDELIVER_INTENT的标志,将重新传递意图。

我最近遇到了同样的问题。 服务没有提供保存状态的内置方法,最后的意图可能不足以使服务恢复到之前的状态。 我的解决scheme是让活动保持状态,并通过startService()将该状态传递给服务。 该服务然后只是在活动中触发事件,如:

  • 这是一个更新
  • 有些事情死了,这是个例外
  • 我已经遇害,请以任何必要的状态重新启动我

这种方法清理了我的devise了很多,服务和活动都有适应力被杀死。

Android在重新启动服务时不会重新填充“丢失的”数据值,因此您的代码需要迎合这种可能性。

我的方法是使用所有非原始状态variables,并将它们保留为空。 这样,我可以testing为空,并采取适当的步骤来初始化他们的时间。

我已经采取了存储轻量级的数据,我想在应用程序的偏好重新启动应用程序持续。

使用内部存储单独保存对象或其字段。

 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 ""; }