Androidstream程杀手
也许你可以帮忙。
是否有可能获得在Android系统中运行的所有Processes
列表,并杀死其中的一些? 我知道有一些应用程序( task managers
),但我想写我自己的,简单的应用程序。
我想编写简单的任务pipe理器,只是列出所有进程和button,将杀死其中的一些。
你能不能写一些我可以调用的Java方法来获得进程列表和杀死它们的方法。 或者只是给我一些build议。
在Android中杀死应用程序/服务通常是一个非常糟糕的主意 。 虽然有可能编写task killer
应用程序,但不应鼓励除开发/debugging之外的任何事情。
任务pipe理是Android操作系统的职责, 你可以看到的任务不是stream程 (例如你在Windows任务pipe理器中看到的stream程),事实上,当Android告诉他们时,他们只有一个stream程他们可以有一个。
这些任务pipe理工具会定期破坏应用程序,因为它们通常无法从强制终止中恢复,尤其是在正在忙于写入文件或使用其他资源时。 它也使手机用户错误地期望所列出的应用程序实际上是在手机上运行 ,而这往往不是。 这在[ActivityManager文档] [1]中有解释:
您可以检索有关系统中当前“正在运行”的特定任务的信息。 请注意,正在运行的任务并不意味着给定的任务实际上有一个正在运行的进程; 它只是意味着用户已经去了,从来没有closures它,但是目前系统可能已经终止了它的进程,并且只保留在它的最后一个状态,以便在用户返回时重新启动它。
当你在应用程序中看到running
应用程序列表,比如TaskKiller或者Quick System Info,其中很多并没有真正运行,它们只是处于暂停状态。 这些应用程序不会占用系统资源,因为Android决定阻止它们,直到再次需要它们。 然而,当你杀了他们,你不给他们时间closures干净,当你尝试启动他们下一次,你可以提出一个不友好的力量closures对话框。 我已经看到应用程序彻底崩溃,即使重新安装也是无效的,因为他们试图读取SD卡上损坏的文件,或者使用非官方的API调用。
总之,朋友不要让朋友在Android中使用任务杀手。
无论如何,要回答你的问题, ActivityManager
是大多数这些应用程序用来列出处于运行/挂起状态的活动的东西。
freetaskmanager是这些task managers
中使用的一个例子。
// Get currently running application processes List<ActivityManager.RunningAppProcessInfo> list = servMng.getRunningAppProcesses(); if(list != null){ for(int i=0;i<list.size();++i){ if("com.android.email".matches(list.get(i).processName)){ int pid = android.os.Process.getUidForName("com.android.email"); android.os.Process.killProcess(pid); }else{ mTextVIew.append(list.get(i).processName + "\n"); } } } /* // Get currently running service List<ActivityManager.RunningServiceInfo> list = servMng.getRunningServices(1024); if(list != null){ for(int i=0;i<list.size();++i){ mTextVIew.append(list.get(i).service.getClassName() + "\n"); } } */ /* // Get currently running tasks List<ActivityManager.RunningTaskInfo> list = servMng.getRunningTasks(1024); if(list != null){ for(int i=0;i<list.size();++i){ mTextVIew.append(list.get(i).toString() + "\n"); } } */
通过Java退出Android应用程序是很棘手的。 通过过程对象接口杀死应用程序通常被认为是坏的forms,因为上面列出的所有原因,我不会重新粉刷它们,但我不觉得公布的灰心是为了阻止你一起做这一切,他们只是让你意识到可能的警告。 这里有一个问题,Android必须跟踪活动和load/run order
因为这些设备有一个back
button…所以你要尽职尽责地调用finish()
或finishFromChild(childActivity)
,当用户exits
应用程序时,从你的应用程序,愉快地忽略你的代码,要求退出。
有时候,你只需要杀死应用程序。 所以……在这个数字化进程杀死之前,你必须做一点规划。 确保用户不会杀死任何对您的应用至关重要的文件I / O或networking通信。 我的策略是front load
我的活动来完成负载事件或接近负载事件的所有繁重工作。
另外,我总是在退出之前提示用户,这是一个很好的翻译桌面应用程序UI约定。
上面的代码通过调用“getUidForName”错过了标记…
这个例子从硬件后退button中捕获Android Native back button
事件,并提示用户“你真的想离开我的应用程序”,如果用户select“是”,它会杀死应用程序。
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { //Handle the back button if(keyCode == KeyEvent.KEYCODE_BACK) { //Ask the user if they want to quit new AlertDialog.Builder(this) .setIcon(android.R.drawable.exclamationpoint) .setTitle("Exit?") .setMessage("You are about to exit the Application. " + "Do you really want to exit?") .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //Stop the activity //maintenancetabs.this.finish(); int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); } }) .setNegativeButton("No", null) .show(); return true; } else { return super.onKeyDown(keyCode, event); } }