我的课程中有一个这样的方法,它扩展了Activity
@Override
public void onDestroy() {
Log.i("onDestory: ", "Inside OnDestory!");
bluetoothCommunicator.destroyedApp();
super.onDestroy();
}
方法destroyedApp()
如下所示:
public void destroyedApp() {
if(server != null)
server.destroy();
}
其中server
是扩展Thread
以下是该方案:
我是第一次打开应用程序,在我的onCreate
方法中,我创建了一个设置BluetoothServerSocket
的蓝牙类的新实例,这很好用,我能够将文件传输到我的手机。
当我在后台运行我的应用程序时,这也有效,因为该线程仍处于活动状态。
但是
根据Activity Life Cycle
Android框架应调用onDestroy()
方法。当我再次启动应用程序时,应调用onCreate
方法,但似乎并未创建BluetoothServerSocket
的实例。我没有LogCat
信息,因为发送蓝牙文件的设备只说:
Error Log:
Write Error:
Transport endpoint is not connected
__obex_connect:
error=-2
Unable to connect to the server
Error
这告诉我BluetoothServerSocket
不是“活着的”
关于如何实现这一目标的任何建议?
答案 0 :(得分:3)
通常无法保证根本不会调用onDestroy()方法。根据文件:
注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的主机进程,因此在进程消失后,系统不应该用它来做剩余的事情。
派生类必须调用超类的此方法的实现。如果他们不这样做,将抛出异常。
所以我首先测试它是否被可靠地调用。
此外,您正在super.onStop()
中调用onDestroy()
。它应该是super.onDestroy()
答案 1 :(得分:2)
由于我无法评论,我在这里发帖。 正如Egor所评论我不认为你可以从onDestroy()中调用onStop(),Android本身会在onPause()之后调用onStop(),具体取决于内存。 现在,请注意不推荐使用线程的stop(),suspend()和destroy()方法,终止线程的唯一安全方法是让线程退出其run()。 现在,当您调用server.destroy()时,它可能仍然在内存中保留一些链接,因此垃圾收集器将无法垃圾收集您的活动。因此,我相信这可能是你没有调用onDestroy的可能原因。 如果我知道的话请指出我。
答案 2 :(得分:1)
你是如何杀死你的申请的?我正在为Application
课程中的问题寻找解决方案,我发现了有关onTerminate()
方法的信息:
此方法适用于模拟过程环境。永远不会在生产Android设备上调用它,只需杀死它们即可删除进程; 无用户代码(包括此回调)在执行此操作时执行。
我记得我的一个应用程序中存在类似的问题,其中一些组件'onDestroy()
方法未被调用,因为我在任务管理器(Samsung Galaxy 2)中使用了“清除内存”按钮