#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); при использовании этого весь текущий процесс будет уничтожен