2010-06-23 4 views
45

Можно создать дубликат:
Quitting an application - is that frowned upon?Как убить приложение со всеми его действиями?

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

Как только пользователь хочет выйти, пароль в SharedPreferences должен быть протер, и, конечно, все действия приложения должны быть закрыты (нет смысла запускать их без известного пароля - они будут разбиваться).

Как я могу это сделать?

System.exit(0) и finish() только выход из текущей деятельности - бесполезно. Я знаю, что есть приложение taskmanager. Как это делается? Он способен убить все приложение ...

ответ

3

Мое понимание рамок приложений для Android заключается в том, что это специально не разрешено. Приложение закрывается автоматически, когда оно не содержит больше текущих действий. Попытка создать кнопку «убить», по-видимому, противоречит предполагаемому дизайну системы приложений.

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

7

, который хранится в SharesPreferences до тех пор, как приложение нуждается.

Почему?

Как только пользователь хочет выйти, на пароль в SharedPreferences должны быть истреблены и, конечно, все деятельность приложения должны быть закрыты (это не имеет смысла запускать их без известных пароль - они сбой).

Еще лучше: не вводите пароль в SharedPreferences. Удерживайте его в статическом элементе данных. Данные, естественно, исчезнут, когда все действия в приложении будут завершены (например, кнопка BACK) или иным образом уничтожены (например, выгнали из ОЗУ, чтобы освободить место для других действий после того, как пользователь нажал HOME).

Если вы хотите какой-то проактивный «пароль для флеша», просто установите статический член данных на null, и ваши действия проведут проверку этого члена и предпримут соответствующие действия, когда он равен null.

+0

Спасибо. Это сработало, но как только произойдет сбой в любом действии, и он будет NULL, даже другие действия будут все еще там. Ну ладно ... Я думаю, это нормально – Nils

6

Использование onBackPressed() метода:

@Override 
public void onBackPressed() {  
    android.os.Process.killProcess(android.os.Process.myPid()); 
} 

или использовать метод finish(), у меня есть что-то вроде

//Password Error, I call function 
    Quit();    


    protected void Quit() { 
     super.finish(); 
    } 

С super.finish() вы закрываете деятельность супер класса.

+0

TNX для этого <но ho.w убить иностранный процесс? например: «org.mozilla.firefox» «org.mozilla.firefox.App» – Criss

32

Вы правы: вызов finish() приведет только к выходу из текущей активности, а не к цели всего приложения. однако есть обходное решение для этого:

Каждый раз, когда вы начинаете действие, запустите его, используя startActivityForResult(...). Если вы хотите, чтобы закрыть все приложения, вы можете сделать что-то вроде этого:

setResult(RESULT_CLOSE_ALL); 
finish(); 

Затем определяют каждый вид деятельности в onActivityResult(...) обратного вызова так, когда активность возвращается со значением RESULT_CLOSE_ALL, он также называет finish():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch(resultCode) 
    { 
    case RESULT_CLOSE_ALL: 
     setResult(RESULT_CLOSE_ALL); 
     finish(); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

Это приведет к каскадному эффекту, закрывающему все действия.

Кроме того, я поддерживаю CommonsWare в его предположении: храните пароль в переменной, чтобы он был уничтожен, когда приложение закрыто.

+0

Это очень помогло мне @mtmurdock. Большое вам спасибо за это решение. – praveenb

+0

RESULT_CLOSE_ALL не может быть разрешен переменной – hamish

+0

Я googled вокруг и нашел пару людей, использующих нуль public final static int RESULT_CLOSE_ALL = 0; – hamish

12

Когда пользователь хочет выйти из всех открытых действий, они должны нажать кнопку, которая загружает первое действие, которое запускается при запуске приложения, в моем случае «LoginActivity».

Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("EXIT", true); 
startActivity(intent); 

Приведенный выше код очищает все действия, кроме LoginActivity. LoginActivity - это первое действие, которое возникает, когда пользователь запускает программу. Затем поместите этот код внутри onCreate LoginActivity, чтобы сигнализировать, когда он должен сам разрушаться, когда передается сообщение «Выход».

if (getIntent().getBooleanExtra("EXIT", false)) { 
     finish(); 
    } 

Ответ вы получите на этот вопрос с Android платформы: «Не сделать кнопку выхода деятельности Глянец пользователь больше не хочет, и менеджер активность очистит их, как он считает нужным.. "

+0

хорошее решение, но разве это не накладные расходы, чтобы начать новую активность ... – aProgrammer

+3

Да, но помните, андроид очень старался не дать программистам возможность создать кнопку «выхода» для своих приложений. Таким образом, вы должны обмануть язык, чтобы вы могли выйти из приложения, медленно продвигаясь по нему, заставляя его думать, что вы хотите остановить несколько действий, а затем подкрасться к финальной команде, позволив последнему завершить работу. Это вроде как пройти мимо охранника, отвлекая его, а затем бежать, когда он не смотрит. –

84

Когда вы используете метод finish(), он не закрывает процесс полностью, он работает STILL в фоновом режиме.

Пожалуйста, используйте этот код в главной деятельности (Пожалуйста, не используйте в каждой деятельности или субпикселей деятельности):

@Override 
public void onBackPressed() { 

    android.os.Process.killProcess(android.os.Process.myPid()); 
    // This above line close correctly 
} 
+1

WoW, вправо направление !!! Спасибо – Ponmalar

+13

Это убьет процесс, но это не обязательно приведет к уничтожению задачи в памяти. Поэтому, когда приложение перезагружается, стек активности (задача) будет просто восстановлен заново. –

+4

Да, мне совсем не нравится это решение. Убивание процесса устраняет любую возможность, которую вам, возможно, пришлось сохранить данные или завершить любые ожидающие решения задачи. Это похоже на самый тупой, пещерный способ закрыть приложение, и его следует избегать любой ценой. – mtmurdock

Смежные вопросы