Как завершить процесс?

#android #process

#Android #процесс

Вопрос:

У меня есть два действия, первое действие запускается программой запуска, второе запускается первым. Когда я убиваю процесс из первой активности, процесс завершается. Но когда я завершаю его из второго действия, система немедленно запускает новый процесс и первое действие. (Изменен PID процесса.) Как я могу сделать это чисто?

Я попробовал 3 разных способа остановить процесс: System.exit (0), android.os.Process.KillProcess (pid) и непрограммно с панели устройств Eclipse.

Ниже приведены два самых простых действия в мире, с которыми я столкнулся. Они оба являются внешними классами в своих соответствующих файлах.

 public class FirstActivity extends Activity  {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ((Button)findViewById(R.id.button)).setOnClickListener(
            new OnClickListener() {
                public void onClick(View v) {
                    startActivity(new Intent(FirstActivity.this, 
                        SecondActivity.class));
        }});
    }
}

public class SecondActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_2);
        ((Button)findViewById(R.id.button)).setOnClickListener( 
            new OnClickListener() {
                public void onClick(View v) {
                    // Method 1
                    int pid = android.os.Process.myPid();
                    android.os.Process.killProcess(pid);
                    // Method 2
                    System.exit(0);
        }});
    }
}
  

(Я знаю, люди говорят, что никогда не следует предоставлять пользовательский интерфейс для выхода из программы. Но это по соображениям безопасности. У пользователя должен быть способ выйти из программы и закрыть файл, чтобы его информация не просочилась.)

Комментарии:

1. рассмотрите возможность запуска второго действия с помощью startActivityForResult, затем передайте сообщение от второго действия обратно первому, используя SetResult и finish(). Затем запишите сообщение в onActivityResult. Включить сообщение и вызвать finish? при необходимости при первом выполнении.

Ответ №1:

Вы можете попробовать это.finish()

Другие варианты завершают процесс без уведомления системы Android, которая предполагает, что что-то, что пользователь хотел сделать, завершилось сбоем, и перезапускает его.

Но ваши предположения о закрытии действия, предотвращающего утечку данных, ошибочны. Если вы хотите предоставить кнопку выхода из системы, сделайте это, и пусть она отменит все токены доступа / ключи, которые использовались для получения доступа.

Также подумайте о том, что произойдет, если какое-либо другое действие выйдет на передний план без выхода пользователя из вашего — например, что, если он получит телефонный звонок?

Комментарии:

1. спасибо за ответ. Я думал об использовании finish (), но еще не пробовал. Но в моем случае использование finish() перед запуском второго действия не является решением — он может захотеть вернуться. Итак, единственный способ: прямо перед завершением 2-го действия мне нужно очистить историю системы, если это вообще возможно. (Выход из системы означает, что он больше не хочет (и не может) использовать программное обеспечение, тогда зачем беспокоиться о том, чтобы оставлять бесполезный для него процесс в системе? Вот почему я хочу убить его раз и навсегда. В приложении есть таймер для завершения процесса, когда он работает в фоновом режиме или неактивен в FG.)

2. Это зависит от Android, а не от вас, чтобы решить, убить ваш процесс — вот как это работает, и, как вы обнаружили, борьба с этим не работает

Ответ №2:

Просто моя идея, После запуска второго действия (эта строка),

 startActivity(new Intent(FirstActivity.this,SecondActivity.class));
  

Вы можете завершить первое действие. Через,

 int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
  

итак, теперь первое действие не появилось.

Другой способ,

Вы можете получить идентификатор процесса первого действия и отправить идентификатор процесса второму действию через bundle.

Сначала завершите первый процесс Activity, затем вы можете завершить второй процесс Activity.

итак, теперь первое действие не появилось.

Ответ №3:

у меня возникла эта проблема, когда я был новее в Android. я создал два действия и переключился с одного макета на другой макет, но когда я завершу процесс второго действия, первым действием будет resume (); и первый макет будет показан на дисплее.

ответ на ваш вопрос таков: при первом возобновлении действия вы должны вызвать метод finish(); в методе onResume().

Ответ №4:

System.exit(0); при использовании этого весь текущий процесс будет уничтожен