我的应用程序检查应用程序是否正在运行,显示其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;
}
}
答案 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
以便您可以再次启动它。