2

我的课堂上有一个这样的方法,它可以扩展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

活动生命周期在这里

onDestroy()方法应由 Android 框架调用。当我再次启动应用程序时,onCreate应该调用该方法,但似乎BluetoothServerSocket没有创建 的实例。我没有LogCat信息,因为发送蓝牙文件的设备只说:

Error Log:
Write Error: 
Transport endpoint is not connected
__obex_connect:
error=-2
Unable to connect to the server
Error

这告诉我BluetoothServerSocket不是“活着”

关于我如何做到这一点的任何建议?

4

3 回答 3

3

通常不保证会调用 onDestroy() 方法。根据文档:

注意:不要指望这个方法被称为保存数据的地方!例如,如果一个活动正在内容提供者中编辑数据,那么这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在这里。此方法通常用于释放资源,例如与活动相关联的线程,以便被破坏的活动不会在其应用程序的其余部分仍在运行时留下这些东西。在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。

派生类必须调用该方法的超类实现。如果他们不这样做,将引发异常。


所以我会首先测试它是否被可靠地调用。

此外,您正在调用super.onStop()您的onDestroy(). 它应该是super.onDestroy()

于 2012-11-08T12:50:49.817 回答
2

由于我无法发表评论,因此我在这里发布。正如 Egor 评论的那样,我认为您不能从 onDestroy() 中调用 onStop(),Android 本身会根据内存在 onPause() 之后调用 onStop()。现在,请注意线程的 stop()、suspend() 和 destroy() 方法已被弃用,终止线程的唯一安全方法是让线程退出其 run()。现在,当您调用 server.destroy() 时,它可能仍会在内存中保留一些链接,因此垃圾收集器将无法对您的活动进行垃圾收集。因此,我相信这可能是您的 onDestroy 未被调用的可能原因。点我,如果我穿着。

于 2012-11-08T13:03:52.740 回答
1

你是如何杀死你的应用程序的?我在课堂上为您的问题寻找解决方案,Application我发现了有关该onTerminate()方法的以下信息:

此方法用于模拟过程环境。它永远不会在生产 Android 设备上调用,在这些设备上,只需杀死进程即可删除它们;这样做时不会执行任何用户代码(包括此回调)。

我记得我在我的一个应用程序中遇到了类似的问题,其中一些组件的onDestroy()方法没有被调用,因为我使用了任务管理器中的“清除内存”按钮(三星 Galaxy 2)

于 2012-11-08T12:54:36.610 回答