2012-01-11 12 views
15

私はアンドロイドでタスクキラータイプのアプリを構築しようとしています。 ActivityManagerを使用して現在実行中のタスクのリストを表示できますが、タスクを強制終了する際に問題が発生します。アンドロイドで現在実行中のタスクを殺す方法

am.killBackgroundProcesses(package name); 

:私はkillBackgroundProcessesを使用してタスクを殺すためにしようとしていますとそれは今私のために働いた。しかし

ActivityManager am = (ActivityManager) context. 
      getSystemService(Activity.ACTIVITY_SERVICE); 


List<RunningTaskInfo> a=am.getRunningTasks(Integer.MAX_VALUE); 

PackageManager pack=this.getPackageManager(); 

for(int i=0;i<a.size();i++){ 

      String packageName = a.get(i).topActivity.getPackageName(); 

      Drawable d=null; 
      String appName=""; 

      try { 
       d=pack.getApplicationIcon(packageName); 

       appName=(String)  pack.getApplicationLabel(pack.getApplicationInfo(packageName,PackageManager.GET_META_DATA)); 

      } catch (NameNotFoundException e) { 
       e.printStackTrace(); 
      } 

        packName.add(packageName); //arraylist of package name 
       apps.add(appName);   // arraylist of app name 
       icons.add(d);    //arraylist of icons 
     } 

:ここ

は、私は、現在のタスクを実行しているのリストを取得するためにやっているものですうまく行かなかった 。またkillBackgroundProcessesメソッドはAPIレベル2.2で使用できますが、1.6などの以前のAPIレベルで同じタスクを実行するにはどうすればいいですか?

現在アクティブなアプリケーションを表示して終了する方法はありますか?

助けてください。

ありがとうございます。

+0

( "クローズ"、偽)((this.getIntent()= NULL)!) \t \t { \t \t \tブールisLogout = this.getIntent()getBooleanExtra場合。 \t \t \t 場合(isLogout) \t \t \t //仕上げ(); \t \t \t android.os.Process.killProcess(android.os.Process.myPid()); \t \t} – Android

+0

私はプロセスではなくタスクを終了する必要があります。これは、現在実行中の1つのタスクまたはすべてのタスクです。 –

+0

30時間以上待っても返事が届かない...... :( –

答えて

21

Android OS自体を除いて、誰もプロセスを強制終了することはできません。

Androidマーケットでタスクキラーの大部分は、彼らはちょうどこのメソッドはすぐに

と呼ばれるオペレーティングシステムアクティビティによって呼び出されたとき

public void restartPackage (String packageName) 

を使用することにより、プロセス

を再起動してアプリを殺すことはありません。

savedInstanceStateあなたが殺したい活動の状態を保存します。今、このプロセスは、次回のユーザーはそれが

それが殺された場所から、または他の言葉で始まりますその活動が再開起動時にメモリやOSから削除

はstate.Nowそれを保存しています。誰もそうすることができないので、プロセスを強制終了しないでください。

タスクマネージャから確認できます。この方法もICSで

で動作します。

上記の方法については、hereをご覧ください。私の知る限り、killBackgroundProcesses (String packageName)はAPI 8以上です。

+1

貴重な情報はありがとうございます。現在実行中のタスクの一覧を表示する(プロセスではない)が、現在は多くのアプリがそうしているように(例えばAdvance Task Killer)、killPackage(String packageName)とkillBackgroundProce sses(String packageName)**、この操作を実行して、現在実行中のタスクを再度検索しようとすると、以前と同じ数のタスクが表示されるため、この問題の解決策は何でしょうか。あなたがこれについていくつかのアイデアを持っている場合は、共有してください。ありがとう –

+2

ここでタスクマネージャーは、彼らはちょうどlistviewからアイテムを削除するアプリを殺すことはありませんトリックを果たし、それはアプリがなくなった!私はちょうどタスクマネージャーを作ったし、他のように動作します。また、それは内部メモリ(RAM)を解放します。その項目を削除する前に 'restartPackage(String packageNname)'を呼び出すことを忘れないでください。 –

+0

ok私は上記のトリックを試し、その結果をあなたに知らせます。もう一度ありがとう... :) –

13

簡潔に言えば、自動タスクキラーは、現在実行中のプロセスと消費しているメモリのリストをOSにポーリングすることによって動作します。その後、インテリジェントなアルゴリズムまたはユーザ入力を使用して、タスクキラーはプロセスを強制終了するようシステムに指示するシステムコールを発行します。あなたがこれを行うことができる2つのapisがあります。

彼らは

  • Process.sendSignal(PID、Process.SIGNAL_KILL)です。
  • ActivityManager.killBackgroundProcesses(PackageNameの)

Process.killProcess PIDは、特定のプロセスの一意の識別子である(INTのPID)を呼び出すことによってこの最初の作品。 AndroidはLinuxと同じようにプロセスを終了させます。ただし、ユーザーは所有しているプロセスのみを強制終了できます。 Androidでは、各アプリは一意のUID、ユーザーIDで実行されます。したがって、このAPIを使用すると、アプリケーションは独自のプロセスのみを強制終了できます。したがって、次のようになります。explanation in the docs for Process.killProcess(int pid):

プロセスを特定のPIDで強制終了します。このAPIでは がPIDに基づいてプロセスを強制終了するように要求していますが、 は実際にはどのPIDにkillできるのかについて標準的な制限を課しています。通常これは、呼び出し元の パッケージ/アプリケーションを実行するプロセスと、そのアプリケーションによって作成された追加のプロセスのみを意味します。 共通のUIDを共有するパッケージは、互いに のプロセスを強制終了することもできます。

このメソッドを呼び出すと、signalsがOSによって生成され、プロセスに設定されます。プロセスがOSから信号を受信するたびに、その信号を処理するか、直ちに終了する必要があります。 SIG_KILLなどの信号は処理できず、受信者プロセスが直ちに終了することになります。 killする権限を持たないプロセス、つまり自分のプロセスではないプロセスをkillするには、sudoを使って特権をエスカレートする必要があります(これには、デバイスのroot権限が必要です)。

第2のAPIは、ActivityManagerに、特定のパッケージに関連付けられたプロセスを強制終了するように指示することによって機能します。 このAPIは、のユーザーにKILL_BACKGROUND_PROCESSES権限を受け入れる必要があるため、UIDがプロセスのUIDと一致する必要性を回避します。この許可は、アプリケーションがユーザーによってタスクキラーとして承認されたことをOSに通知します。タスクキラーがアプリを殺すことを望むとき、それはあなたが所有しているプロセスを殺すことしかできないという問題を回避するようにOSに指示します。

In the Android Docs it says that this API actually uses the first Process.killProcess API

システムはすぐに特定のパッケージに を関連付けられているすべてのバックグラウンド・プロセスを殺してもらいます。これは、カーネルがメモリを再利用するプロセスを終了させるのと同じです。システムは必要に応じて将来これらのプロセスを に再起動します。

希望はそれを助けます。

+1

返信ありがとうMike。でもActivityManager.killBackgroundProcesses(PackageName)**を試してみました。 ** ActivityManager.getRunningTasks(Integer.MAX_VALUE); **を呼び出すと、前回と同じタスク数が返されます。タスクの数が決して変更されないことを意味します。もし何かが間違っていたら –

+0

こんにちはマイク、上記の私の質問には返事がありますか?実際には私はこれでかなり混乱しています.... :( –

6

マニフェストファイルに以下の権限を入力しましたか?

<uses-permission android:name="android.permission.GET_TASKS"/> 
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/> 
関連する問題