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

时间:2010-10-18 20:31:52

标签: android

我一直在阅读Android文档,我想知道是否有人能够了解当服务以START_STICKY启动服务时,服务实例会发生什么事情。我假设本地状态数据(实例变量)也丢失了。 Android在重新创建服务时是否有助于重新填充本地状态?

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

4 个答案:

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