Android 如何扼杀我自己的活动——艰难之路

Android 如何扼杀我自己的活动——艰难之路,android,process,android-activity,kill,Android,Process,Android Activity,Kill,所以我有了我的活动,按下“退出”按钮,我就调用Activity.finish()。这实际上关闭了我的应用程序 问题是:我的应用程序的Dalvik进程仍然像僵尸一样挂在后台。这似乎是正常的,因为其他应用程序也这样做。甚至hello world的例子也挂在了内存中 我可以接受这种情况,但不幸的是,这种行为使我的应用程序的开发成为一种痛苦。我有一个远程服务连接到我的活动,这个服务将不会卸载,直到我的活动卸载(正如所说,它永远不会卸载) 一切都不知何故地保持着活力,没有什么好的理由 我如何才能真正从记忆

所以我有了我的活动,按下“退出”按钮,我就调用Activity.finish()。这实际上关闭了我的应用程序

问题是:我的应用程序的Dalvik进程仍然像僵尸一样挂在后台。这似乎是正常的,因为其他应用程序也这样做。甚至hello world的例子也挂在了内存中

我可以接受这种情况,但不幸的是,这种行为使我的应用程序的开发成为一种痛苦。我有一个远程服务连接到我的活动,这个服务将不会卸载,直到我的活动卸载(正如所说,它永远不会卸载)

一切都不知何故地保持着活力,没有什么好的理由

我如何才能真正从记忆中删除我的活动

我正在寻找类似活动的内容。请调用finish_和kill_my_process_please()或类似的内容。

尝试使用以下方法:

您需要将权限添加到
AndroidManifest.xml
文件中

因此,我有我的活动,并按 我呼叫的“退出”按钮 Activity.finish()。这有效地 关闭我的应用程序

我申请的Dalvik流程 仍然像一个僵尸一样在这里游荡 背景

这个过程被保存在缓存中,以备安卓系统重用。你可以放心地忽略它

我有一个远程服务连接到 我的活动,而此服务不会 卸载,直到我的活动卸载 (正如所说,它从来不会这样做)

您的应用程序中可能存在错误,例如调用
startService()
但未能调用
stopService()
,或者调用
bindService()
但未能调用
unbindService()

  • 调用finish()点击按钮
  • 将此行添加到onDestroy方法:
  • android.os.Process.killProcess(android.os.Process.myPid())


    通过终止进程,您可以完全停止应用程序。从“后退”按钮的最后一个屏幕,您可以通过以下方式终止进程:

    public void onBackPressed() {   
            super.onBackPressed();   
            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);    }
    

    通过使用ActivityManager,我们还可以关闭其他应用程序

    private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    am.restartPackage("com.jimmy.appToBeClosed");
    

    要使用上述代码,必须具有android.permission.RESTART\u包在清单文件中的权限。

    如果不仅是活动,而且是要终止的应用程序,您可以使用

    System.exit(0)


    人们说这是一个不推荐使用的或不好的例子,但是,它是纯Java的,并且确实有效……

    System.exit()会立即卸载整个虚拟机以及所有本机库、服务等。

    类似于System.exit(0),在Java端,您还可以在onDestroy期间调用一个本机方法,在C/C++端调用exit(0)。这似乎迫使lib完全退出。这对我有用

    好的,这个方法似乎不再是ActivityManager类的一部分??Android 2.2Froyo有了一个新的API,但这是一个非常糟糕的主意。权限被标记为危险,用户将看到你的应用程序有能力杀死其他应用程序。虽然在开发过程中,除了晦涩难懂的测试之外,终止应用程序的进程几乎从来都不是一个好主意,但这是一种不必要的迂回方式。一个进程可以简单地退出()或终止自己-它不需要要求ActivityManager这样做。对于一个发布的应用程序,KillProcess()不是一个好主意。但对于开发阶段(为了调试目的加速终止应用程序),这是一个救命稻草+1.开发(临时使用)时绝对有用这有助于我卸载本机库:-)你知道人们为什么说这些话吗?它是否与应用程序如何在安卓操作系统中“生存”有关。?这很容易在我的一个应用程序中使用。。但我想先了解一下这种沮丧背后的理论。我想他们这么说是因为Android可以自己管理应用程序;所以我们不应该插嘴。我说这是胡说八道:如果是我的申请,除了我还有谁知道什么时候终止它呢System.exit并不等同于终止进程,它可能会恢复活动堆栈上已暂停的任何活动。更多信息请参见此处:谢谢@SullX!我想这是一个很好的例子,说明了为什么不推荐它:)如果System.exit()调用后还有“未完成”的活动,Android似乎可以重新启动应用程序。。。我一点都不知道!:)restartPackage现在已被弃用。改用KillBackgroundProcess。
    public void onBackPressed() {   
            super.onBackPressed();   
            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);    }
    
    private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    am.restartPackage("com.jimmy.appToBeClosed");