无法以编程方式强制停止应用程序

时间:2015-02-02 21:51:38

标签: android kill-process

我的应用程序检查应用程序是否正在运行,显示其PID,并且旨在通过单击按钮将其终止。我正在使用android.os.Process.killProcess();,但它正在发生。当我在设置的Running Applications部分中检查它时,我仍然发现它正在运行。有没有其他方法可以实现我想要的?

import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

int pid;


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

    Button B = (Button) findViewById(R.id.button);
    TextView PI = (TextView) findViewById(R.id.tV);

    if (isAppRunning("com.whatsapp")) {
        Toast.makeText(this, "Running", Toast.LENGTH_SHORT).show();
        PI.setText(Integer.toString(getPid("com.whatsapp")));
        B.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                android.os.Process.killProcess(getPid("com.whatsapp"));
                Toast.makeText(MainActivity.this, "Killed", Toast.LENGTH_SHORT).show();

            }
        });

    }else
        Toast.makeText(this, "Not Running", Toast.LENGTH_SHORT).show(); 
}   


public boolean isAppRunning (String aApplicationPackageName)
{
            ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
                if (activityManager == null)
                    {
                        return false;
                    }
                    List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
                    for(int idx = 0; idx < procInfos.size(); idx++)
                        {   

                            if(procInfos.get(idx).processName.equals(aApplicationPackageName))
                            {   
                                    return true;
                            }
                        }
                                return false;
}

public int getPid (String packageName){
    ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses();
    int processid = 0;
    for(int i = 0; i < pids.size(); i++) {
        ActivityManager.RunningAppProcessInfo info = pids.get(i);

        Log.i("PID",pids.get(i) + "");
        Log.i("PID Package",info.processName);

        if(info.processName.equalsIgnoreCase(packageName)){
            processid = info.pid;
            return processid;
        } 
    }
    return -1;
}
}

2 个答案:

答案 0 :(得分:1)

这是不允许的;您只能终止与尝试终止的用户ID具有相同用户ID的应用程序。有关详细信息,请参阅此处:Kill another application on Android?

答案 1 :(得分:0)

似乎你正试图杀死另一个应用程序。嗯,那是不可能的。

您只能终止与正在执行查杀的用户ID相同的进程。如果你试图杀死你自己的进程它应该工作。否则你不能这样做(除非你有一个root设备,你的应用程序有root权限。)

从Android 2.2开始,你只能杀死其他应用程序的后台进程,你将无法杀死他们的活动。

如果您的应用定位到Android&lt; 2.2,则可以使用android.permission.RESTART_PACKAGE.

如果你希望它在2.2及更高版本上正常工作,请使用android.permission.KILL_BACKGROUND_PROCESSES,但是,这只会杀死后台服务,并且可能“搞乱”其他应用程序而不是做任何好事。

使用正确的权限,您可以执行以下操作:

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

编辑获得root特权(how to do it?)后,您可以使用pm disable com.my.app.package之类的命令来杀死它。然后使用pm enable com.my.app.package以便您可以再次启动它。