Как получить PID с именем класса и убить полученный процесс - PullRequest
0 голосов
/ 16 марта 2012

Я пытаюсь получить PID процесса, имеющего имя класса. Идея состоит в том, что пользователь создаст задачу, выберет событие, приложение, и если приложение будет открыто или уничтожено, поэтому, если пользователь выберет kill, я хочу отобразить имя класса в 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

1 Ответ

0 голосов
/ 17 марта 2012

Это решение работает на терминале, но перезагружает телефон при вызове приложения, это решение проблемы, но мне нужно исправить проблему с перезагрузкой. В этом случае я использую скрипт для получения pid с pidof-s для одного пида и убить -9.принудительно закрывает процесс с полученным pid

ПРИМЕЧАНИЕ. Система использует имя пакета для идентификации запущенного процесса

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();
...