【问题标题】:How to obtain the PID with the class name and kill the process obtained如何获取类名的PID并杀死获取到的进程
【发布时间】:2012-03-16 13:46:28
【问题描述】:

我正在尝试获取具有类名的进程的 PID。这个想法是用户将创建一个任务,选择事件,应用程序以及应用程序是否将被打开或终止,所以如果用户选择终止,我想将意图的ComponentName中的类名映射到ComponentName 中的 RunningAppProcessInfo

问题是我得到了一个NullPointerException,我真的不知道为什么,当我检查 if 中的类名时会发生这种情况 - 也许我误解了什么......有什么想法吗?

注意:我传递上下文是为了访问 ActivityManager

public static int getPid(Context ctx, Intent intent)
{
    ActivityManager am = (ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
    int pid = 0;
    for(RunningAppProcessInfo a : am.getRunningAppProcesses())
    {
        //Revisar TODO


        if(intent.getComponent().getClassName().equals(a.importanceReasonComponent.getClassName()))
        {
            pid = a.pid;
            break;
        }
    }

    return pid;

}

这里是日志:

D/su ( 6479): 10106 com.android.test.tasker executing 0 /system/bin/sh using shell /system/bin/sh : sh
D/AndroidRuntime( 6446): Shutting down VM
W/dalvikvm( 6446): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 6446): FATAL EXCEPTION: main
E/AndroidRuntime( 6446): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.AIRPLANE_MODE flg=0x20000000 (has extras) } in com.android.test.tasker.events.AirplaneEvent@4051fee8
E/AndroidRuntime( 6446): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722)
E/AndroidRuntime( 6446): at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime( 6446): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 6446): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime( 6446): at android.app.ActivityThread.main(ActivityThread.java:3835)
E/AndroidRuntime( 6446): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 6446): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime( 6446): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
E/AndroidRuntime( 6446): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
E/AndroidRuntime( 6446): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 6446): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 6446): at com.android.test.tasker.util.Root.getPid(Root.java:97)
E/AndroidRuntime( 6446): at com.android.test.tasker.events.GenericalEvent.openKill(GenericalEvent.java:35)
E/AndroidRuntime( 6446): at com.android.test.tasker.events.AirplaneEvent.onReceive(AirplaneEvent.java:24)
E/AndroidRuntime( 6446): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
E/AndroidRuntime( 6446): ... 9 more

【问题讨论】:

  • 你为什么不调试一下看看什么是空的?题外话:为什么不马上传ActivityManager呢?
  • 请从 logcat 粘贴堆栈跟踪
  • 我修复了代码,importanceReasonComponent 为空,但列表中并未出现所有应用程序...
  • 我用解决方案编辑了帖子,谢谢!
  • @DGomez 如果您自己解决了问题,就像这里一样,请将解决方案作为正常答案发布并接受。那是totally fine,如果分数超过 3,你甚至会得到一个闪亮的自学徽章。;) 感谢您分享一般的答案,不是每个人都这样做。

标签: android root kill pid


【解决方案1】:

此解决方案在终端上运行,但在应用调用时会重启手机, 是解决问题的方法,但我需要解决重启问题 在这种情况下,我使用脚本来获取带有 pidof 的 pid, -s 用于单个 pid 并 kill -9 。是用获得的pid强制关闭proc

注意:系统使用包名来标识正在运行的进程

String command = "pidof -s " + intent.getComponent().getPackageName() + " | kill -9 .";

Process su = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(su.getOutputStream());

os.writeBytes(command + "\n");
os.flush();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2016-01-31
    • 2022-06-29
    • 1970-01-01
    • 2013-06-27
    • 2015-01-05
    相关资源
    最近更新 更多