程序结构如下:一个Activity,一个Service,使用bindService启动服务,Service使用Socket连接外边的服务器,成功后,使用finish关掉Activity。此Activity实现一个接口,这个接口有一个函数,参数是一个字串。Service接收到数据后,呼叫这个函数(之前,Service保存了Activity的指针,方法是Service也实现了一个接口,其中一个函数参数就是Activity实现的接口类型,这样,Service启动成功后,Activity通过这个函数把this传给Service)。因为是异步调用,Activity使用了消息机制响应收到的字串。现在Activity使用finish退出,实际上,Service还在,虽然Service的onDestroy确实已经被调用了,Service里的Socket接收线程也还在,实际上接收一切正常,使用Log.d可以看到。那么Service呼叫Activity的那个函数呢,通过Log.d可以看到,也正常呼叫,在往下,实际上消息也运行正常。结果就是Activiy看不到了,但是奶奶的一切还在正常运行。

解决方案 »

  1.   

    还遇到一个麻烦,就是调用了Socket的close函数后,如果对方发来数据,接收线程会引发异常(除非服务端发数据,否则连接还在,不像Windows,你一调close,接收函数马上返回-1),此异常发生后,服务端会得到连接已断开消息。如果Send数据,会得到一个异常,socket is closed。但是连接还在,接收函数不返回,服务端也认为连接正常。使用的是2.2的sdk。
      

  2.   

    Service还在,虽然Service的onDestroy确实已经被调用了,Service里的Socket接收线程也还在你如果想要在推出activity时候都结束掉,需要在onDestroy里面close掉socket呀,你没有关socket网络连接当然还存在,但是服务和activity都已经结束掉了所以在onDestroy关闭socket
      

  3.   

    是你的service是不是在destory的时候没有去关闭内部的thread。不管的话,当然 有问题啊
      

  4.   

    就算Thread,Timer等等一些东西还在,那么Service本身是什么,我如果需要一个后台服务,是不是我启动线程,连接好,然后,Service之类的东西就都可以退出了,反正退了也一样。我Socket关闭了,线程结束了,onDestroy调用了,我怎么知道你资源是否释放了,我就是为了看下,它到底是什么退出了。实际上连Activiy也没有退出,只是看不到而已。那实际上finish就是Windows下的一个Hide而已,一切都在。
      

  5.   

    咱俩一个毛病,我最近作了个东西也是。activity启动调用service。service里面有个timer,然后做一些事情,我就想退出这个程序,用了finish(()。就跟你说的一样,我都服了,我想让service,和程序真正的关闭。找不到办法
      

  6.   


    Java是这样的,刚弄的时候非常不习惯。还有Service确实没必要,除非你要单独运行Service,否则,线程解决一切问题,实际上一个程序是可以不启动任何Activity的,那么,无界面的程序仍然无需用Service,我一直疑问,什么东西必须用Service。但是我仍然认为Android程序不退出,是个不会的设计,实际上现在很多程序都设置了退出菜单,事实表明,自动内存管理不是很好。而且那个什么增加启动速度的理由非常扯淡,那些不驻留的程序慢吗?一点都不慢。
      

  7.   

    用finish确实不管用,我直接System.exit(0),倒是退出当前activity了(这是这个activity的菜单按钮执行的方法)。但是我想在service里面活干完后停掉启动他的这个activity,就只能用finish了,真无奈,会异常退出整个应用,功能还没影响,就是界面不友好……