6

runtime.getruntime().exec()Androidアプリケーションを介して使用を開始したプロセスのプロセスIDを取得するにはどうすればよいですか??

ここに問題があります。UI APP から runtime.getruntime().exec() を使用してプロセスを開始します。Android UI アプリがまだ実行されている場合は、destroy を使用してプロセスを強制終了できます。そのため、プロセスを強制終了するにはプロセスの PID が必要です。

これを行うより良い方法はありますか?

4

4 に答える 4

8

Androidのjava.lang.Process実装はjava.lang.ProcessManager$ProcessImpl、 field を持っていますprivate final int pid;。Reflection から取得できます。

public static int getPid(Process p) {
    int pid = -1;

    try {
        Field f = p.getClass().getDeclaredField("pid");
        f.setAccessible(true);
        pid = f.getInt(p);
        f.setAccessible(false);
    } catch (Throwable e) {
        pid = -1;
    }
    return pid;
}

別の方法 - toString を使用します。

    public String toString() {
        return "Process[pid=" + pid + "]";
    }

リフレクションなしで、出力を解析して pid を取得できます。

完全な方法:

public static int getPid(Process p) {
    int pid = -1;

    try {
        Field f = p.getClass().getDeclaredField("pid");
        f.setAccessible(true);
        pid = f.getInt(p);
        f.setAccessible(false);
    } catch (Throwable ignored) {
        try {
            Matcher m = Pattern.compile("pid=(\\d+)").matcher(p.toString());
            pid = m.find() ? Integer.parseInt(m.group(1)) : -1;
        } catch (Throwable ignored2) {
            pid = -1;
        }
    }
    return pid;
}
于 2015-11-15T18:29:59.560 に答える
2

PID を使用してプロセスを強制終了しますか? その場合はdestroy()Processインスタンスを呼び出すだけです。PID は必要ありません。ProcessBuilderこれが機能するには、 ではなくを使用してプロセスを起動する必要があることに注意してくださいgetRuntime().exec()

プロセス ID がどうしても必要な場合は、シェル スクリプトを使用する必要があります。Java から PID を取得する方法はありません。

編集

Processアプリを離れてアプリに戻った後も のハンドルを保持する必要があるため、1 つの解決策は、 を生成するクラスで静的メンバーを作成することProcessです。

private static Process myProcess;

Processこのメンバーを使用して、 を呼び出して返された を格納start()しますProcessBuilder。静的メンバーは、アプリがメモリ内にある限り存在し続けます — 可視である必要はありません。アプリに戻った後、プロセスを強制終了できるはずです。システムがたまたまアプリを強制終了してリソースを解放した場合、子プロセスを終了する方法はありません (実行中の場合) が、この解決策はほとんどの場合に有効です。

于 2012-10-24T19:45:02.277 に答える
0

オンラインドキュメントには警告がありますが、ActivityManagerを使用してこのようなことを行いました...システムアプリとしても実行していますが、それが重要かどうかはわかりません。

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int pid = 0;
List<RunningAppProcessInfo> procInfo = am.getRunningAppProcesses();
for (RunningAppProcessInfo proc : procInfo)
    if (proc.processName.indexOf("myApp") >= 0)
        pid = proc.pid;
于 2015-02-17T11:10:33.437 に答える
-3

次を試してください:
int p_Id = android.os.myPid(); 詳細については

于 2012-10-24T19:11:12.590 に答える