2012-03-16 76 views
0

我试图获得具有类名称的进程的PID。这个想法是,用户将创建一个任务,选择事件,应用程序,如果应用程序将被打开或杀死,所以如果用户选择杀死,我想映射的意图ComponentName的类名称ComponentNameRunningAppProcessInfo如何获得具有类名称的PID并终止获得的进程

问题是我得到一个NullPointerException,我真的无法弄清楚为什么,当我检查if中的classname时可能会发生 - 也许我误解了某些东西......任何想法?

注:我传递的背景下,以有机会获得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; 

} 

这里是logcat的:

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 [email protected] 
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 
+0

你为什么不调试,看看什么是空?题外话:你为什么不马上通过ActivityManager? – m0skit0 2012-03-16 13:50:38

+0

请从logcat粘贴堆栈跟踪 – slayton 2012-03-16 13:50:49

+0

我修复了代码,重要性原因组件为null,但在列表中没有出现所有的应用程序... – DGomez 2012-03-16 14:33:29

回答

0

该方案正在研究终端,但重新启动手机时被应用程序调用, 是问题的解决方案,但我需要重新启动的修复程序 在这种情况下,我使用脚本来获取pidof的pid,-s是针对单个pid并杀死-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();