Articles of 进程

Android – 如何使用PID获取processName或packageName?

我的问题:在给定PID情况下,我可以使用什么来检索某个进程的processName或packageName ? 因为在我的任务管理器中我想使用PID同时使用killBackgroundProcesses代码来终止进程。 问题是我需要packageName / processName来做这件事,如果我让他们输入processName而不是只输入它的PID,那对用户来说会很麻烦。 这是我的任务经理的形象:

如何杀死我自己的活动 – 艰难的方式

所以我有我的活动,按下“退出”按钮我调用Activity.finish()。 这有效地关闭了我的申请。 问题:我的应用程序的Dalvik过程仍然像背景中的僵尸一样徘徊。 看起来这是正常的,因为其他应用程序也这样做。 甚至hello-world示例也在内存中徘徊。 我可以忍受这个,但不幸的是这种行为使我的应用程序的开发变得痛苦。 我有一个连接到我的Activity的远程服务,并且在我的Activity卸载之前这个服务不会卸载(正如它所说的那样)。 一切都以某种方式保持活着,没有任何理由。 我怎样才能真正从记忆中删除我的活动? 我正在寻找像Activity.finish_and_kill_my_process_please()调用或类似的东西。

Android进程杀手

也许你可以帮忙。 是否有可能获得在Android系统中运行的所有Processes列表,并杀死其中一些Processes ? 我知道有一些应用程序( task managers ),但我想编写自己的简单应用程序。 我想编写简单的任务管理器,只列出所有进程和按钮,它们会杀死其中的一些。 你能不能写一些我可以调用的Java方法来获取进程列表,以及杀死它们的方法。 或者只是给我一些建议。

当应用程序的所有活动完成后会发生什么?

场景: 我在我的Android应用程序中有四个活动,比如A,B,C和D.应用程序中有一个Constants.java类,它扩展了Application类以维护全局应用程序状态。 Constants类包含应用程序的所有常量variables。 活动流程就像这样A–>B–>C–>D 当从活动A按下后退按钮时,我正在调用finish()方法,该方法将完成活动A并关闭应用程序。 之后,如果我从所有应用程序打开应用程序, Constants.java有一个variables,其值在上次启动时仍然存在。 当我从Process.killProcess(Process.myPid()) A执行System.exit(10)后跟Process.killProcess(Process.myPid())从事活动A(在背面按下)时,同样的事情就不会发生。 问题: 通过调用每个活动的finish()完成所有活动将关闭应用程序(其过程)? 即使所有活动都已完成(关闭),variables的值如何仍然存在? 调用System.exit(10)后跟Process.killProcess(Process.myPid())退出应用程序是否公平? 更新: 如何在退出应用程序时清除应用程序常量(BackAnd HomeActivity)?

Android服务:流程与非流程

将服务放在单独的流程中或将其保留在应用程序的主流程中有什么实际区别? 每个场景将用于什么?

Android会杀死每个服务还是整个进程?

我们中的许多人都知道(在松散的情况下)如果不调用Service.startForeground() ,Android中的Service将被系统杀死。 但这是整个故事……? 我正在研究一些遗留代码,将“系统”权限应用程序移植到Play商店。 由于应用程序运行的“系统”权限,此应用程序有5个后台服务(不调用startForeground() ),这些服务到目前为止是安全的。 它安装在自定义设备上。 由于时间紧迫和预算紧张,将这5个重构为1不是短期解决方案,但我们希望尽快转向公测。 简短的问题是: 如果没有前台Activity或Service ,Android会杀死每个单独的后台服务,还是仅仅杀死进程本身? 以下是有关进程和线程的Android文档中的一些信息,这些信息讨论了Android在压力下如何终止进程: Android可能会决定在某个时刻关闭某个进程 ,此时内存不足并且需要更直接为用户提供服务的其他进程。 因此,在被杀死的进程中运行的应用程序组件将被销毁。 当这些组件再次为它们工作时,将再次启动该过程。 在决定要杀死哪些进程时,Android系统会权衡它们对用户的相对重要性。 例如,与托管可见活动的进程相比,它更容易关闭托管在屏幕上不再可见的活动的进程。 因此,是否终止进程的决定取决于在该进程中运行的组件的状态。 … 常识称“ Android会杀死服务 ” 个人经验表明, Android也会杀死进程本身(如上面引用中所述)。 这可以通过在Application对象中存储对象来显示,并注意在服务被终止后它们会被重新初始化。 考虑到上述因素,有几种方法可以解决问题 : 1)做正确的事 将5个服务重构为1,在各种不同的线程上运行。 将1服务带到前台。 问题解决了。 不幸的是,目前还没有这方面的预算,我们宁愿根据项目时间表find快速解决方案。 这是将在全面生产中实施的最终解决方案。 2)许多通知 在前台启动每个服务,每个服务都有自己的Notification图标。 这是一个混乱的解决方案,但将适用于beta现场试验,购买我们一段时间。 我认为这是“蛮力”的做法。 3)受一项服务保护的流程 如果它是被杀死的进程,而不是每个单独的服务,那么运行单个前台服务就足够了。 这将“防止”(即降低Android)杀死进程的可能性。 所有5项服务都将因此而存在。 4)一项服务来统治它们 服务上的文档告诉我们,如果服务绑定到另一个上下文,那么 stopService()或stopSelf()实际上不会停止服务,直到所有客户端解除绑定。 如果我从单个前台服务绑定到其他服务,那么它们会保持活着吗? 所以: Android会杀死每个未绑定的后台服务吗? 或者它只是杀死运行应用程序的VM? 更新 经过18个 41小时的测试#3( 受一个服务保护的进程 ),所有6个服务仍在运行(5个旧加1个新服务)。 因此,如果没有前台活动或服务正在运行,那么看起来Android会杀死进程 […]

在单独的进程android中启动服务

我想在一个单独的进程中启动一个服务(即当我在设置中转到我的应用程序管理器然后转到运行服务时,它应该在一个单独的进程中显示我的服务)。 我的Android Manifest如下: 我在MainActivity中启动服务,所以当我杀死应用程序时,服务也会关闭。 任何人都可以告诉我如何将服务作为一个不同的过程启动。

Runtime.exec()bug:挂起而不提供Process对象

我是否用这个: process = Runtime.getRuntime().exec(“logcat -d time”); 或者那个: process = new ProcessBuilder() .command(“logcat”, “-d”, “time”) .redirectErrorStream(true) .start(); 我得到了相同的结果:它经常挂在exec()或start()调用中,无论我试图做什么! 运行它的线程甚至不能被Thread.interrupt()中断! subprocess肯定已启动,如果被杀死,则返回上述命令。 这些调用可能在第一次尝试时失败,所以没有办法阅读他们的输出! 我也可以用一个简单的“su -c kill xxx”命令行,结果相同! 编辑:开始使用一些调试日志调试NDK项目中的java_lang_ProcessManager.cpp文件! 所以这是我到目前为止发现的,在fork()之后父进程执行此操作: int result; int count = read(statusIn, &result, sizeof(int)); <- hangs there close(statusIn); 虽然subprocess不应该阻止它:这就是孩子做的事情( 如果开始的话 !): // Make statusOut automatically close if execvp() succeeds. fcntl(statusOut, F_SETFD, FD_CLOEXEC); <- make the […]

PackageManager的applicationInfo.name始终为null

PackageManager pm = this.getPackageManager(); ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List runningAppProcesses = am.getRunningAppProcesses(); for(RunningAppProcessInfo process : runningAppProcesses) { try { ApplicationInfo ai = pm.getApplicationInfo(process.processName, PackageManager.GET_META_DATA); Log.d(TAG, applicationInfo.name + “”); } catch (NameNotFoundException e) { e.printStackTrace(); } } process.processName返回有效的包名称,但applicationInfo.name始终为null。

使用activityManager.getRunningAppProcesses()获取(实际)前台进程

我正在尝试确定用户当前可见的应用程序。 为此,我使用activityManager.getRunningAppProcesses()方法。 我知道Android 5.1.1不支持该方法 – 这没关系。 一开始它就像魅力一样,我正在迭代RunningAppProcessInfos列表并检查重要性。 tl; dr获取当前前台进程和防止错误postives的正确方法是什么? 如何完成列表的顺序 – API说它没有指定。 有没有办法正确订购它们? 我做了什么: 不幸的是,ActivityManager返回的列表在每个设备上都是不同的。 某些设备返回具有重要性100(即FOREGROUND)的多个信息,即使该过程当前不可见。 这导致了我有很多误报的问题。 例如,我每次使用Facebook测试它并创建一个吐司,每次facebook都在前台。 我切换到Home,所以我的启动器应该是前台进程。 这是10秒之后,在那之后,facebook又重新出现在列表中的FOREGROUND(它不是开放也不可见)而且我得到了误报。 我认识到有些设备按照最近的流程排序列表。 所以我决定尝试以下方法: ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0); final String processName = appProcess.processName; final String packageName = removeProcessSuffix(processName); if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){ //do something, like the toast } 使用appProcesses.get(0); 我只检查第一个元素,然后bug就消失了。 再也没有误报了。 但是 ,现在在某些设备上我根本不再获得前台进程了。 […]