2013-05-24 4 views
0

У меня есть приложение для Android, в котором я реализую Службу, которая взаимодействует с некоторыми аппаратными средствами через последовательное соединение Bluetooth. Установка этой связи идет медленно, поэтому я решил оставить службу на переднем плане, так что если/когда вы хотите просмотреть другое приложение, соединение готово к работе (псевдокод следует):Остановка службы переднего плана на Android при сбое приложения

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    start(); 
    return (START_STICKY); 
} 

@Override 
public void onDestroy() { 
    stop(); 
} 

start() и stop() частные методы, которые начинают связь с аппаратными средствами, и в случае, если начать, в создает Notification для использования в startForeground() Мои Activity позвонит

@Override 
public void onStart() { 
    super.onStart(); 
    // Start the service 

    Intent intent = new Intent(getApplicationContext(), MyService.class); 
    ComponentName theService = startService(intent); 
    //this is to register the functions I need to handle functions my Activity calls 
    // to the service 
    bindService(intent, svcConn, BIND_AUTO_CREATE); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    if (theService != null) { 
     unbindService(svcConn); 
     theService = null; 
     if (isFinishing()) { 
      stopService(new Intent(getApplicationContext(), MyService.class)); 
     } 
    } 
} 

Я должен был добавить «Quit» пункт меню, чтобы убедиться, что Service выключается. Хуже того, если мое приложение выходит из строя, я должен войти и вручную убить Service. Есть ли способ элегантно убить Service, если все идет ужасно неправильно, или я злоупотребляю целью Service и должен найти альтернативный метод выполнения того, что я хотел бы сделать?

ответ

1

Может быть, вы можете добавить крючок для основного потока вашего приложения (UI потока) для аварии, смотрите ниже:

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
       //Kill the service. 
      } 
     }); 
    throw new RuntimeException("Uncaught Exception"); 
Смежные вопросы