2012-01-11 2 views
15

나는 android에서 작업 킬러 유형의 응용 프로그램을 만들려고합니다. ActivityManager을 사용하여 현재 실행중인 작업 목록을 표시 할 수 있지만 작업을 종료하는 데 문제가 있습니다. 여기 android에서 현재 실행중인 작업을 죽이는 방법

내가 현재 실행중인 작업의 목록을 얻기 위해 무엇을하고 무엇을 :

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 사용하여 작업을 죽이려하고 같이

am.killBackgroundProcesses(package name); 

을 그것은 작동하지 않았다 . 또한 killBackgroundProcesses 메서드는 API 레벨 2.2에서 사용할 수 있습니다. 그런 다음 이전의 API 레벨 (예 : 1.6)에서 동일한 작업을 수행하려면 어떻게해야합니까?

현재 사용중인 앱을 표시하고 종료 할 수있는 다른 방법이 있습니까?

도와주세요.

고마워요.

+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

나는 프로세스가 아닌 작업을 종료해야합니다. 현재 실행중인 하나의 태스크 또는 모든 태스크가 될 수 있습니다. –

+0

30 시간 이상 기다린 후에도 답장을받지 못했습니다 ...... ( –

답변

21

아무도 안드로이드 OS 자체를 제외하고 프로세스를 죽일 수 없습니다.

그들은 단지 과정을 다시 시작 응용 프로그램을 죽이지 않는 안드로이드 시장에서 태스크 킬러의 대부분

이 방법은 활동 즉시

라는 운영 체제에 의해 호출 될 때

public void restartPackage (String packageName) 

를 사용하여

savedInstanceState 그리고 죽이려는 활동의 상태를 저장하십시오. 이제이 과정은

가 메모리에서 제거하고 OS는 다음에 사용자가이

가 살해 된 곳에서 또는 다른 말로 시작하는 활동을 다시 시작을 시작할 때 state.Now 저장. 어느 누구도 그렇게 할 수 없으므로

작업 관리자에서 프로세스를 죽이지 않는지 확인할 수 있습니다. 이 방법은 ICS에서

에서도 작동합니다.

위의 방법은 here에서 볼 수 있습니다. 내가 아는 한 killBackgroundProcesses (String packageName)은 API 8 이상을 대상으로합니다.

+1

존 정보를 주셔서 감사합니다하지만 당신은 할 수있는 한 좀 더 많은 정보를 줄 수 있습니까? 현재 진행중인 작업 목록을 보여줍니다 (처리 안 함). 그러나 이제는 많은 응용 프로그램들이 그렇게하고있는 것처럼 (예 : 사전 작업 킬러) 그들을 죽이기 위해 무엇을해야합니까? 또한 ** restartPackage (String packageName)와 killBackgroundProce sses (String packageName) **,하지만이 작업을 수행하고 다시 현재 실행중인 작업을 찾으려고하면 이전과 동일한 수의 작업을 표시하므로 ......이 문제의 해결 방법은 무엇입니까? 이 문제에 대해 몇 가지 생각이 있다면 공유하십시오. 덕분에 –

+2

여기 작업 관리자는 그들이 단지 listview에서 항목을 제거하는 애플 리케이션을 죽이지 않는 속임수를 연주하고 그 애플 리케이션이 사라 졌어요! 방금 작업 관리자를 만들었고 다른 사람처럼 작동합니다. 또한 내부 메모리 (RAM)를 비울 수 있습니다. 해당 항목을 삭제하기 전에'restartPackage (String packageNname)'를 호출하는 것을 잊지 마십시오. –

+0

ok 위의 트릭을 시도하고 그 결과를 알려 드리겠습니다. 다시 고마워 ... :) –

13

간단히 말해서, Automatic Task Killers는 현재 실행중인 프로세스 및 사용중인 메모리의 목록을 OS에 폴링하여 작동합니다. 그런 다음 인텔리전트 알고리즘 또는 사용자 입력을 사용하여 작업 킬러가 시스템에 프로세스 호출을 요청하여 프로세스를 종료합니다. 당신이 할 수있는 두 가지 api가 있습니다.

그들은

  • Process.sendSignal (PID, Process.SIGNAL_KILL)이고;
  • ActivityManager.killBackgroundProcesses (에 PackageName)

Process.killProcess PID는 특정 프로세스에 대한 고유 식별자 (INT의 PID)를 호출하여이 제 작품. 안드로이드는 리눅스와 같은 방식으로 프로세스를 죽인다. 그러나 사용자는 자신이 소유 한 프로세스 만 죽일 수 있습니다. Android에서는 각 앱이 고유 한 UID 인 사용자 ID로 실행됩니다. 따라서이 API를 사용하면 앱은 자체 프로세스 만 죽일 수 있으므로 다음과 같이 처리하십시오. explanation in the docs for Process.killProcess(int pid):

주어진 PID로 프로세스를 종료하십시오. 이 API를 사용하면 이 PID를 기반으로 프로세스를 종료하도록 요청할 수 있지만 커널은 실제로 이 죽일 수있는 PID에 대해 표준 제한을 적용합니다. 일반적으로 이는 호출자의 패키지/응용 프로그램과 해당 응용 프로그램에서 생성 된 추가 프로세스를 실행하는 프로세스만을 의미합니다. 공용 UID를 공유하는 패키지는 서로의 프로세스를 종료 할 수도 있습니다.

이 메서드를 호출하면 signals이 OS에서 생성되고 해당 프로세스로 설정됩니다. 프로세스가 OS로부터 신호를 수신 할 때마다 해당 신호를 처리하거나 즉시 죽어야합니다. SIG_KILL과 같은 신호는 처리 할 수 ​​없으므로 수신자 프로세스가 즉시 종료됩니다. kill 권한이없는 프로세스 (프로세스가 아닌 프로세스)를 죽이려면 sudo를 사용하여 권한을 상승시켜야합니다 (장치에 대한 루트 권한이 필요합니다).

두 번째 API는 ActivityManager에게 특정 패키지와 관련된 프로세스를 중지 할 것을 알리는 기능을합니다. 사용자가 KILL_BACKGROUND_PROCESSES 권한을 허용해야하기 때문에이 API는 프로세스의 UID와 일치하도록 사용자 UID의 필요성을 해결합니다. 이 권한은 사용자가 작업 킬러로 승인 한 앱을 OS에 알려줍니다. 작업 킬러가 앱을 죽이려고 할 때 OS는 자신이 소유 한 프로세스 만 죽일 수 있다는 문제를 해결할 것을 알립니다.

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

시스템이 즉시 주어진 패키지와 를 관련된 모든 백그라운드 프로세스를 중단하게한다. 이것은 메모리를 되찾기 위해 커널을 죽이는 것과 동일합니다. 시스템은 필요에 따라 앞으로이 프로세스들을 재시작 할 것입니다.

희망이 도움이됩니다.

+1

답장을 보내 주셔서 감사합니다.) ** 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"/> 
관련 문제