2010-11-07 3 views
0

У меня возникла странная ситуация, когда созданная служба останавливается - иногда. У меня есть запись Activity A, который запускает услугу, используя bindServiceAndroid-сервис останавливается без ответа?

// if we now have an IP address then bind ourselves to the MessageService 
bindService(new Intent(this, MessagingService.class), 
      onMessageService, 
      BIND_AUTO_CREATE); 

MessageService ручку ноги от чтения и отправки потоков для обработки трафика сообщений с приложением. Он в основном обрабатывает опрос для новых сообщений с интервалом в 1 секунду, используя StatusTask и его таймер, используя timer.scheduleAtFixedRate.

Деятельность A затем запускает другое действие B, которое отображает информацию пользователю. По какой-то причине, что я еще не понял, большую часть времени, когда я нажимаю кнопку «домой», опрос останавливается, и Служба, похоже, остановилась. Выбрав мое приложение из списка недавних приложений Home или с помощью уведомления, которое я публикую, когда оно не отображается, вызывается действие на передний план, но служба, похоже, исчезла. Это сложнее отлаживать, примерно в 10-20% случаев все отлично работает, и служба опроса сообщений продолжает отключаться.

Должен ли я использовать startService? Единственное прямое отношение, которое второе действие B имеет к Сервису, заключается в том, что он регистрируется как наблюдатель потока Read, чтобы получать уведомления о тайм-аутах в Reads. Я не вызываю stopService в любом месте моего кода.

ответ

1

общественного класс TestService расширяет службу {

частного статический окончательной Строка TAG = Testservice.class.getSimpleName();

общественный таймер; TimerTask scanTask; final Обработчик обработчика = новый обработчик(); Таймер t = новый таймер();

@Override 
public IBinder onBind(Intent intent) { 
    return null; 

} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    Log.i(TAG, "Service creating"); 
    _startService(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.i(TAG, "Service destroying"); 

    t.cancel(); 
    t = null; 
} 

общественный недействительный yourfunction() {

}

// это будет вызывать функцию на everysecond основе так попробовать его, если он helpsa общественность недействительного _startService() {

scanTask = new TimerTask() { 
      public void run() { 

        handler.post(new Runnable() { 
          public void run() { 

           yourfunction(); 

          } 
        }); 
      }}; 

      t.schedule(scanTask, 1000L, 1000L); 
} 
+0

Спасибо, я сегодня вечером попробую что-то подобное. Я надеюсь, что вы и Фальмари правы, и я должен использовать звонок startService. – bursk

1

при разработке с использованием eclipse ---> попробуйте это перейти к DDMS, который будет в опции перспективы в строке меню ---> выберите Logcat, и пока вы запускаете приложение, просто попробуйте повторить последовательность, указанную выше и на нажатие кнопки домой просто посмотреть на то, что это ошибка, если вообще приходит в течение этого экземпляра и после ошибки, так что конкретная причина может быть понята

с уважением, Мистри Hardik

+0

Спасибо за идею. Я использую eclipse и смотрю на журнал. В журнал не сообщается об ошибке. – bursk

+0

Итак, как вы начинаете и останавливаете свое обслуживание? вызвав методы onStart() и onStop() .... и вы можете просто указать конкретный код. Потому что, как вы упомянули! Когда нажата кнопка «домой» или «назад», приложение остановится и сразу потеряет намерение. поэтому просто убедитесь, что у вас есть onStart() и и onStop() –

+0

извините за пропущенную часть: вам нужны два класса: 1. основной класс активности, который вызовет службу, а другой 2. класс обслуживания, имеющий всю сервис-ориентированную логику , –

0

простой сервис демонстрационный класс

импорт android.app.Activity; импорт android.content.Intent; import android.os.Bundle; импорт android.util.Log; импорт android.view.View; import android.view.View.OnClickListener; import android.widget.Button;

общественного класс ServicesDemo расширяет активность реализует OnClickListener {

private static final String TAG = "AlertService"; 
Button buttonStart, buttonStop; 

@Override общественного недействительного OnCreate (Пачка savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.servicedemo);

buttonStart = (Button) findViewById(R.id.btnStart); 
buttonStop = (Button) findViewById(R.id.btnStop); 

buttonStart.setOnClickListener(this); 
buttonStop.setOnClickListener(this); 

}

общественного недействительными OnClick (View ЦСИ) { переключатель (src.getId()) { случай R.id.btnStart: Log.d (TAG, «OnClick: начиная srvice «); startService (новое намерение (это, Testservice.class)); break; case R.id.btnStop: Log.d (TAG, "onClick: stopping srvice"); stopService (новое намерение (это, Testservice.класс)); break; } }}

1

Запуск службы с bbindService делает жизненный цикл услуг, привязанный к переплетенной деятельности. Как только ваша деятельность отвязана от службы, служба умирает.

+0

Надеюсь, что все! Я попробую перейти на использование startService. Я буду публиковать и обновлять, как только проверю его. Благодаря! – bursk

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