【问题标题】:How to properly terminate Android application with live sockets如何使用实时套接字正确终止 Android 应用程序
【发布时间】:2012-08-07 08:26:50
【问题描述】:

我实现了一个具有以下功能的 Android 应用程序:

应用程序:public class ApplicationGlobalAgent extends Application 包含:

  • 一个 MainActivity:显示 GUI 绘图 -> 并从中启动其他活动。
  • 一个网络 ServerSocket 和一个客户端 Socket:以双工模式发送/接收数据。

我想在 MainActivity 完成时终止应用程序,我做了如下:

在 MainActivity 中扩展 Activity:

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

    Log.d(DEBUG_TAG, "finish and call app termination");

    //call the application to terminate
    getApplication().onTerminate(); 
}

在 ApplicationGlobalAgent 中扩展应用程序:

@Override
public void onTerminate()
{
    // do close ServerSocket and client Socket in networking threads
    mNetworkManager.DoStop();

    System.gc();

    Log.d(DEBUG_TAG, "Terminated!");

    super.onTerminate(); //?? should be placed at the end of functions ??

    //totally kill this application process
    android.os.Process.killProcess(android.os.Process.myPid());
}

但结果是:

当没有网络连接时,应用程序成功终止,否则"Terminated!" 永远不会打印,直到我关闭另一端的网络套接字(连接到 Android 套接字)。

那么,当退出 MainActivity 并连接网络套接字时,如何强制应用程序正确和完全终止

感谢您的所有帮助!

【问题讨论】:

标签: android multithreading sockets terminate


【解决方案1】:

@Override public void finish()

您应该改写onDestroy

getApplication().onTerminate();

永远不要直接调用它。

System.gc();

这真的没有必要。

android.os.Process.killProcess(android.os.Process.myPid());

为什么你的应用程序自己调用killProcess?您应该让 Android 运行时系统为您杀死进程。

当存在带有连接网络套接字的MainActivity 时,如何强制应用程序正确和完全终止?

除非您分配了在 Java 进程被内核杀死时不会被清理的资源,否则您无需担心清理工作。

【讨论】:

  • 感谢您的快速回复,但您的建议不起作用(我刚刚测试过)。实际上,我已经阅读了许多关于终止进程的 Stack-overflow 线程。但我的问题是application.onTerminate() 仅在所有子进程完成后由系统进程管理器调用,因此应用程序将等待mNetworkManager.DoStop() 完成其关闭连接和侦听套接字的网络线程。我打算尝试将:android.os.Process.killProcess(android.os.Process.myPid()); 放在 onTerminate() 的顶部,看看它是如何工作的。
  • onTerminate 不会被系统调用,除非在模拟环境中(阅读docs。同样,你不应该调用killProcessonTerminate...你可能想要关闭ActivityonDestroy 中的线程。
  • 是的,你是对的!这就是为什么我尝试从主要活动中明确调用app.onTerminate()。不幸的是,我必须在全局应用程序中实现网络线程,以便为所有应用程序的子活动提供独特的网络工具。可笑的是,不推荐使用的 Thread.stop() or Thread.destroy() 方法不能用于安全终止 [我使用 Thread.join(duration) 来处理我的案例]。我已按照您的建议将activity.finish() 更改为onDestroy(),但网络服务器仍未终止。
  • 如果您需要网络线程来处理所有活动,听起来您应该改用Service
  • 谢谢 Alex,实际上我曾考虑过 Service,但我的情况是:我正在编写一个包含多个模拟(网络和图形)的应用程序。我在使用共享网络连接时将它们分成单独的活动。我写了一个主要活动来启动其他活动。但是网络连接不会保留(作为服务),每次我停止并重新启动全局应用程序时都必须处理和重新建立它们。我尝试将Process.killProcess(pid) 放在onTerminate() 的末尾,到目前为止似乎工作得很好,但对解决方案的稳定性不太满意。
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多