2015-02-02 2 views
0

Мое приложение проверяет, работает ли приложение, показывает его ПИД и стремится убить его нажатием кнопки. Я использую android.os.Process.killProcess();, но это просто происходит. Когда я проверяю его в разделе Running Applications в настройках, я все еще нахожу его работающим. Есть ли другой способ добиться того, чего я хочу?
Невозможно принудительно остановить приложение программно

import java.util.List; 
import android.app.Activity; 
import android.app.ActivityManager; 
import android.app.ActivityManager.RunningAppProcessInfo; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

int pid; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button B = (Button) findViewById(R.id.button); 
    TextView PI = (TextView) findViewById(R.id.tV); 

    if (isAppRunning("com.whatsapp")) { 
     Toast.makeText(this, "Running", Toast.LENGTH_SHORT).show(); 
     PI.setText(Integer.toString(getPid("com.whatsapp"))); 
     B.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       android.os.Process.killProcess(getPid("com.whatsapp")); 
       Toast.makeText(MainActivity.this, "Killed", Toast.LENGTH_SHORT).show(); 

      } 
     }); 

    }else 
     Toast.makeText(this, "Not Running", Toast.LENGTH_SHORT).show(); 
} 


public boolean isAppRunning (String aApplicationPackageName) 
{ 
      ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
       if (activityManager == null) 
        { 
         return false; 
        } 
        List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); 
        for(int idx = 0; idx < procInfos.size(); idx++) 
         { 

          if(procInfos.get(idx).processName.equals(aApplicationPackageName)) 
          { 
            return true; 
          } 
         } 
           return false; 
} 

public int getPid (String packageName){ 
    ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses(); 
    int processid = 0; 
    for(int i = 0; i < pids.size(); i++) { 
     ActivityManager.RunningAppProcessInfo info = pids.get(i); 

     Log.i("PID",pids.get(i) + ""); 
     Log.i("PID Package",info.processName); 

     if(info.processName.equalsIgnoreCase(packageName)){ 
      processid = info.pid; 
      return processid; 
     } 
    } 
    return -1; 
} 
} 

ответ

1

Это не допускается; вы можете прекратить действие приложения, имеющего тот же идентификатор пользователя, что и тот, который пытается завершить. См. Здесь для получения дополнительной информации: Kill another application on Android?

+0

Я не хочу убивать свое приложение! Вместо стороннего приложения. Посмотрите мой код. –

+4

Вы не понимаете. Это невозможно сделать без root. В любом случае, почему вы хотите? – Simon

0

Возможно, вы пытаетесь убить другое приложение. Ну, это невозможно.

Вы можете убить только тот процесс, который имеет тот же самый идентификатор пользователя, что и тот, который совершает убийство. Если вы пытаетесь убить свой собственный процесс, он должен работать. В противном случае вы не сможете это сделать (если у вас нет корневого устройства, а ваше приложение имеет привилегии root).

С Android 2.2 вы можете убивать только фоновые процессы других приложений, вы не сможете убить их действия.

Если ваше приложение ориентации Android < 2.2, вы можете использовать android.permission.RESTART_PACKAGE.

Если вы хотите, чтобы правильно работать на 2,2 и выше, использовать android.permission.KILL_BACKGROUND_PROCESSES, но это убивает только фоновые службы и может «испортить» другое приложение, а не делать что-то хорошее.

С правом доступа, вы можете сделать следующее:

private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
am.restartPackage("com.whatsapp"); 

EDIT После того, как вы получите корень привилегированный (how to do it?), вы можете использовать такие команды, как pm disable com.my.app.package, который будет убивать его. Затем используйте pm enable com.my.app.package, чтобы вы могли запустить его снова.

+0

Как это сделать, если я собираю права root? –

+0

См. Этот http://stackoverflow.com/questions/4905743/android-how-to-gain-root-access-in-and-android-application – Rohit5k2

+0

Я знаю, как получить привилегии root. Я хотел знать, как убить стороннее приложение, когда у меня есть root? –