onStartCommand после завершения процесса обслуживания при запуске с START_STICKY - PullRequest
14 голосов
/ 19 октября 2010

Я читал документацию по Android, и мне интересно, сможет ли кто-нибудь пролить свет на то, что происходит с экземпляром службы, когда служба, запущенная с START_STICKY, уничтожает свой процесс. Я предполагаю, что локальные данные состояния (переменные экземпляра) также теряются. Делает ли Android что-нибудь, чтобы помочь заново заполнить локальное состояние при воссоздании службы?

У меня были некоторые данные, которые были отправлены в службу намеренно. В onStateCommand () я бы заполнял данные экземпляра службы на основе того, что было в намерении. Из того, что я прочитал в документации по Android, намерение, переданное onStartCommand (), будет нулевым, когда служба будет убита и перезапущена (с START_STICKY). Означает ли это, что при повторном создании службы я теряю и намерение, и данные участника службы?

Ответы [ 4 ]

16 голосов
/ 19 октября 2010

Когда процесс убивается и воссоздается, он снова проходит весь жизненный цикл (начиная с onCreate). В зависимости от того, как он был убит и как вы сохраняете данные, он может или не может быть доступен для вас.

Что касается возврата намерения, есть флаг для START_REDELIVER_INTENT, который повторно доставит намерение.

2 голосов
/ 09 сентября 2011

Я недавно сталкивался с этой же проблемой. Сервис не предоставляет встроенных средств для сохранения состояния, и последнее намерение может оказаться недостаточным, чтобы вернуть сервис в предыдущее состояние. Мое решение состояло в том, чтобы сохранить состояние активности и передать это состояние службе через startService (). Затем служба просто запускает события в активности, например:

  • вот обновление
  • что-то умерло, и вот исключение
  • Я был убит, пожалуйста, перезапустите меня с любым необходимым состоянием

Этот подход сильно очистил мой дизайн, и обслуживание, и активность устойчивы к гибели.

1 голос
/ 31 мая 2013

использовать Внутреннее хранилище для сохранения объекта или его поля по отдельности.

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 "";
    }
1 голос
/ 12 августа 2011

Android не будет повторно заполнять «потерянные» значения данных при перезапуске службы, поэтому ваш код должен учитывать эту возможность.

Мой подход состоит в том, чтобы использовать все не примитивные переменные состояния и оставить их пустыми.Таким образом, я могу проверить нулевое значение и предпринять соответствующие шаги для их инициализации, как и когда.

Я принял решение хранить легкие данные, которые я хочу сохранить при перезапуске приложения в настройках приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...