2013-07-02 3 views
2

У меня есть деятельность, в OnCreate:андроид ICS: перезапуск службы вешают на intent.getExtras()

serviceIntent = new Intent(this, MyServ.class); 
    int templen = myString.length(); 
    Log.i("check", "mystring"+templen);  
    serviceIntent.putExtra("myString", myString);  
    startService(serviceIntent); 

В службе,

public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub  
    myString = intent.getExtras().getString("myString"); 
    return START_STICKY; 
} 

Он работает отлично. Затем я открыл много приложений, чтобы андроид закрыл мои приложения/службы, чтобы освободить некоторый баран. Как и следовало ожидать, с помощью START_STICKY служба попытается перезапустить, однако она не смогла перезапустить. Журнал ошибок:

Вызванный: java.lang.NullPointerException на com.example.myapp.myserv.onStartCommand (MyServ.java:77), что указывает на этой линии:

myString = intent.getExtras().getString("myString"); 

Так я верю, что нет намерения, отправленного из myact при перезапуске службы. Как я должен обрабатывать этот случай? благодаря

ответ

2

Если вы вернетесь START_STICKY, документация говорит:

если процесс этого сервиса будет убит в то время как он был запущен (после возвращения из onStartCommand (Intent, Int, Int)), а затем оставить его в началось с состояния, но не сохраните это поставленное намерение. Позже система попытается воссоздать сервис. Поскольку он находится в начальном состоянии, будет гарантировать вызов onStartCommand (Intent, int, int) после , создавая новый экземпляр службы; если нет ожидающих запуска команд , которые будут доставлены в службу, он будет вызываться с нулевым объектом цели , поэтому вы должны позаботиться об этом.

Если вместо START_STICKY, вы вернетесь START_REDELIVER_INTENT, документация говорит:

если процесс этого сервиса будет убит в то время как он был запущен (после возвращения из onStartCommand (Intent, Int, Int)) , то это будет , запланированное на перезапуск, и последний доставленный Intent повторно отправлен на его снова через onStartCommand (Intent, int, int). Это намерение останется , запланированное для повторной доставки, пока служба не вызовет stopSelf (int) с идентификатор начала, предоставленный onStartCommand (Intent, int, int). Служба не получит вызов onStartCommand (Intent, int, int) с нулевым Intent, потому что он будет перезагружен, только если он не завершен. обрабатывает все намерения, отправленные ему (и любые такие ожидающие события будут доставлен в момент перезапуска).

Итак, это звучит для меня, как вам необходимо либо вернуть START_STICKY и понять, что при перезапуске onStartCommand() будет вызываться с нулем Intent объекта или вам нужно возвратить START_REDELIVER_INTENT и понять, что если ваша служба не в настоящее время выполняется метод onStartCommand(), когда он убит, что он не будет перезагружен вообще.

Если вам нужно сохранить последнее значение myString, вы можете записать это в общие настройки.

+0

Я пытался понять ваши советы словом. «если процесс этой службы убит во время ее запуска». Мое дело: «если процесс этой службы убит после того, как он начал иногда». такой же сценарий? «если этот процесс службы убит, а затем оставьте его в запущенном состоянии»: даже служба убита, она все еще находится в запущенном состоянии? Хотя я не полностью понимаю, я думаю, что смогу справиться с этим, проверив, является ли намерение нулевым, если оно равно null, то служба ничего не делает. Здесь возникает другая проблема: будет ли служба пытаться перезапустить связанную с ней деятельность, которая отправляет намерение на обслуживание? спасибо – manhon

+0

Если вы просто хотите, чтобы Android перезапустил службу после ее убийства, а при перезапуске службы ничего не нужно делать, тогда да, вы можете просто проверить «намерение == null» в 'onStartCommand()' и ничего не делать. Чтобы ответить на другой вопрос: служба не будет автоматически пытаться перезапустить активность, которая отправила намерение службе. Теперь я задам вопрос сам: зачем вам нужно, чтобы ваш сервис работал, если ему нечего делать? –

+0

Фактически, это пользовательский пользовательский сервис-копир. Большое спасибо за ваш ответ. он не вешает сейчас для проверки намерения == null – manhon

Смежные вопросы