4

シンプルなタスクキラーを書こうとしています。Android でタスクを強制終了してはならないことはわかっていますが、このようなことを試してみたいと思っています。次のコードがあります。

List<RunningAppProcessInfo> procInfo = activityManager.getRunningAppProcesses();
for (int i = 0; i < procInfo.size(); i++) {
    Log.v("proces " + i,procInfo.get(i).processName + " pid:" + procInfo.get(i).pid + " importance: " + procInfo.get(i).importance + " reason: " + procInfo.get(i).importanceReasonCode);
    //First I display all processes into the log
}
for (int i = 0; i < procInfo.size(); i++) {
    RunningAppProcessInfo process = procInfo.get(i);
    int importance = process.importance;
    int pid = process.pid;
    String name = process.processName;
    if (name.equals("manager.main")) {
        //I dont want to kill this application
        continue;
    }
    if (importance == RunningAppProcessInfo.IMPORTANCE_SERVICE) {
        //From what I have read about importances at android developers, I asume that I can safely kill everithing except for services, am I right?
        Log.v("manager","task " + name + " pid: " + pid + " has importance: " + importance + " WILL NOT KILL");
        continue;                       
    }
    Log.v("manager","task " + name + " pid: " + pid + " has importance: " + importance + " WILL KILL");
    android.os.Process.killProcess(procInfo.get(i).pid);
}   
procInfo = activityManager.getRunningAppProcesses();
//I get a new list with running tasks
for (int i = 0; i < procInfo.size(); i++) {
    Log.v("proces after killings" + i,procInfo.get(i).processName + " pid:" + procInfo.get(i).pid + " importance: " + procInfo.get(i).importance + " reason: " + procInfo.get(i).importanceReasonCode);
}

ここでの問題は、このコードを実行すると、最初にすべてのタスクのリストを取得することです。これで問題ありません。ログに次の行がいくつか表示されます。

Sending signal. pid: (processId) SIG: 9

死の合図だと思います。しかし、コードの最後で実行中のすべてのプロセスを表示すると、リストは以前と同じで、タスクは強制終了されていません。なぜですか?ありがとうございました!

4

3 に答える 3

2

最良の結果を得るには、何度もkillProcess電話してみてください。killProcess

for (int i = 0; i < 10; i++)
{
 android.os.Process.killProcess(procInfo.get(i).pid);
}

ノート:

バージョン2.2 --killBackgroundProcesses: "これは、カーネルがこれらのプロセスを強制終了してメモリを再利用するのと同じです。システムは、必要に応じて、これらのプロセスを将来再起動します。"

ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses("com.est.testetst");

必要な権限:

android.Manifest.permission.KILL_BACKGROUND_PROCESSES

version 2.1 --restartPackage-"このメソッドは非推奨です。(2.2未満のバージョンで機能します。これはkillBackgroundProcesses(String)の単なるラッパーになります。これまでの動作は、他のアプリケーションを壊すことができるため、アプリケーションでは使用できなくなりました。アラームを削除したり、サービスを停止したりすることによるアプリケーション。」

 ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    am.restartPackage(getPackageName());

必要な権限:

<uses-permission android:name="android.permission.RESTART_PACKAGES" />
于 2012-05-06T14:40:04.277 に答える
2

カーネルがアクセス許可を強制するため、他のタスクを強制終了することはできません。代わりにこれを試してください:

ActivityManager activityManager = (ActivityManager) context.getSystemService("activity");
activityManager.restartPackage(packageName);

マニフェストには次の権限が必要です。

<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

編集:

実はrestartPackageは非推奨です。代わりに killBackgroundProcesses() を使用してください。

于 2012-05-06T14:36:49.543 に答える
0

幸いなことに、killProcess()自分のプロセスを強制終了する場合にのみ機能します。これは、ドキュメントを読むことでわかります。

于 2012-05-06T14:36:15.067 に答える