0

我有一个 Android 应用程序,我在其中实现了一个通过蓝牙串行连接与某些硬件交互的服务。这个连接的设置很慢,所以我决定将服务保持在前台,所以如果/当你想查看另一个应用程序时,连接就可以开始了(伪代码如下):

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

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

start()并且stop()是开始与硬件通信的私有方法,在开始的情况下,创建一个Notification用于startForeground()My Activitywill call

 @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));
         }
     }
 }

我不得不添加一个“退出”菜单项以确保Service关闭。更糟糕的是,如果我的应用程序崩溃,我必须进入并手动杀死Service. 有没有办法优雅地杀死Service如果事情发生可怕的错误,或者我是否滥用了 a 的目的Service,并且应该找到一种替代方法来做我想做的事情?

4

1 回答 1

1

也许您可以为应用程序的主线程(UI 线程)添加一个挂钩以防崩溃,见下文:

Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
                //Kill the service.
            }
        });
    throw new RuntimeException("Uncaught Exception");
于 2013-07-24T23:38:07.420 回答