【问题标题】:How can I kill processes in Android?如何在 Android 中杀死进程?
【发布时间】:2012-12-12 19:51:51
【问题描述】:

我有以下代码:

package com.example.killall;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
//import android.widget.TextView;
import android.app.ActivityManager;

public class MainKill extends Activity {

private Button BprocessesKill ;
//private TextView processesKill;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_kill);

    final ActivityManager am=(ActivityManager)     getSystemService("SYSTEM_ACTIVITY");

    BprocessesKill=(Button) this.findViewById(R.id.BkillProcesses);
    //processesKill=(TextView) this.findViewById(R.id.killProcesses);



    BprocessesKill.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            am.killBackgroundProcesses(getPackageName());

        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_kill, menu);
    return true;
}

}

我想要做的只是按下按钮并杀死所有后台进程。我遇到的问题是,当我按下按钮时,它会向我显示消息:不幸的是 KillAll(那是我的应用程序的名称)已经停止。我应该改变什么?

【问题讨论】:

  • 为什么要杀死一个进程?
  • 您的目标 API 级别是什么?
  • @johnjohn 因为你不应该杀死 Android 中的应用程序......
  • 为什么 killBackgroundProcesses(package name) 存在呢?
  • 请注意,后台进程可能会占用内存,但不会占用时钟周期,并且会在前台进程需要它时立即放弃它的内存 - 因此杀死该后台进程会花费您额外的时间你重新开始它,但什么也没有为你节省......

标签: android process kill


【解决方案1】:
  1. 您收到的消息表明您的应用程序已崩溃。您需要查看它的 LogCat 以找出原因。这在 Android 开发者指南中有记录。
  2. 请说明您杀死所有后台进程的原因,因为我想不出任何合适的理由来执行此操作。人们坚持声称“任务杀手”或“应用程序杀手”可以提高性能,但这种态度忽略了真正的问题:写得不好的应用程序。只要我们继续声称任务杀手有帮助,用户就会继续使用那些让不必要的服务等运行的应用程序。强迫用户使用任务杀手就像处理白蚁问题一样,每次杀死一只白蚁。真正的答案是消灭所有的白蚁。

简而言之,任何向您展示如何杀死所有后台进程的人都是对您的伤害,对 Android 社​​区也是一种伤害。

【讨论】:

  • “简而言之,任何向您展示如何杀死所有后台进程的人都是在伤害您,对 Android 社​​区也是一种伤害。” +1
  • 并非所有僵尸都是应用程序,Android 社​​区不仅限于应用程序开发。任何为移动设备设计分布式系统的人在探索时都将需要他们的僵尸霰弹枪。
  • 我想测试一个应用程序在 android 杀死它的一个后台服务时会如何反应。最快的方法是知道如何杀死进程
  • 太好了,这个线程是谷歌首先为“android close process by name”提出的,没有真正的答案。我正在为自己编写一个只能在我的手机中运行的应用程序。接受的答案是无用的。有时 SO 没有任何意义。你无权称我的需求“是一种伤害”(请注意,你缺乏找出原因的能力意味着什么)。
【解决方案2】:

我使用这段代码杀死我自己的进程(应用程序):

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

【讨论】:

  • 只有在不得已的情况下才有意义。如果你想让我接受这是一个好的做法,请捍卫它!
  • 不管它是否不可取,这甚至不能回答所提出的问题。
  • System.exit(0) 可能更好,因为至少会调用一些终结器。从理论上讲,它永远不需要。您应该在应用程序生命周期内工作,并进行单元测试以涵盖野生动物漫游的所有边缘情况。
  • 抱歉更新旧线程,在我使用 JNI lib 的应用程序中需要终止进程,因为我们无法卸载 .so lib,所以我们终止进程以强制销毁 lib。所以当应用程序再次启动时,lib 将作为新的加载。
  • 对于任何想知道为什么我的应用程序卸载库的人,因为我在 c++ 中绘制了视觉/视图
【解决方案3】:

你可以使用这个代码:

List<ApplicationInfo> packages;
    PackageManager pm;
    pm = getPackageManager();
    //get a list of installed apps.
    packages = pm.getInstalledApplications(0);

    ActivityManager mActivityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

   for (ApplicationInfo packageInfo : packages) {
        if((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)continue;
        if(packageInfo.packageName.equals("mypackage")) continue;
        mActivityManager.killBackgroundProcesses(packageInfo.packageName);
   }  

Source

请记住,杀死应用程序是非常危险的。如果您不完全了解自己在做什么,请不要使用此代码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2013-05-26
    • 2013-07-24
    • 2012-10-08
    相关资源
    最近更新 更多