Como sair de um aplicativo Android programaticamente?

94

Tenho certeza de que essa pergunta foi feita várias vezes porque li algumas. Meu cliente quer que eu coloque um botão em seu aplicativo onde os usuários possam clicar e sair. Eu li isso e descobri que ligar finish()é o suficiente. Mas terminar é apenas fechar a atividade de corrida atual, certo? Tenho muitas atividades, portanto, neste caso, tenho que passar por cada instância de atividade e concluí-las ou transformar todas as atividades no padrão Singleton.

Também descobri Activity.moveTaskToBack(true)que você pode acessar a tela inicial. OK, isso não é o fechamento, mas o segundo plano do processo. Então, isso é eficaz?

Qual método devo usar para fechar o aplicativo completamente? Qualquer um dos métodos acima descritos ou qualquer outro método / outro uso dos métodos acima?

PeakGen
fonte
por que não usar a barra de ação. clique no ícone do aplicativo e navegue até a tela inicial. clique no botão de fundo para sair
Raghunandan
@Raghunandan: Como mencionei, requisito do cliente :(
PeakGen
Verifique se isso ajuda android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley
1
Possível duplicata de Como sair do aplicativo e mostrar a tela inicial?
derHugo

Respostas:

70

Na verdade, todos estão procurando fechar o aplicativo em um evento onclick, onde quer que haja atividade ....

Então rapazes amigos tentam este código. Coloque este código no evento onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
Fayaz
fonte
8
Na verdade, isso não "fecha o aplicativo completamente" como o PeakGen perguntou, já que o aplicativo ainda está em execução, mas é uma boa alternativa
La masse
2
Acho que não, se uma atividade começou com FLAG ACTIVITY NEW TASK, desta forma não posso sair
fozua
51

O método finishAffinity, lançado na API 16, fecha todas as atividades em andamento e fecha o aplicativo:

this.finishAffinity();

Conclua esta atividade, bem como todas as atividades imediatamente abaixo dela na tarefa atual que tenham a mesma afinidade. Isso normalmente é usado quando um aplicativo pode ser iniciado em outra tarefa (como de um ACTION_VIEW de um tipo de conteúdo que ele entende) e o usuário usou a navegação para cima para sair da tarefa atual e entrar em sua própria tarefa. Nesse caso, se o usuário navegou para baixo em qualquer outra atividade do segundo aplicativo, todas elas devem ser removidas da tarefa original como parte da alternância de tarefas.

Observe que esse acabamento não permite que você forneça resultados para a atividade anterior e uma exceção será lançada se você estiver tentando fazer isso.


Desde a API 21, você pode usar:

finishAndRemoveTask();

Conclui todas as atividades desta tarefa e as remove da lista de tarefas recentes.

Alternativas:

getActivity().finish();
System.exit(0);


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


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

Fonte: Como sair do aplicativo Android de maneira programática


Espero que ajude! Boa sorte!

Shreshth Kharbanda
fonte
2
Não use System.exit (). O Android tentará reiniciar o aplicativo depois de encerrado. Você pode acabar em um loop.
AndroidDev
50

Você pode chamar System.exit (); para sair de todas as atividades.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });
Anchit Mittal
fonte
5
Ele está apenas me levando para a primeira atividade
PeakGen
9
@AnchitMittal System.exit (1) não garante a redefinição da pilha de atividades ou das tarefas (consulte developer.android.com/guide/components/… ). Esta abordagem, portanto, não garante o desligamento adequado do aplicativo (destruindo todas as atividades) no tempo devido.
IgorGanapolsky
Nem toda atividade para sair.
Jitendra
42

Se você deseja sair do seu aplicativo, use este código dentro do evento de botão pressionado:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
Pir Fahim Shah
fonte
24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
Sai Aditya
fonte
4
O que é diferente entre n System.exit (1); e System.exit (0);
Pyae Phyo
System.exit (1) significa que o aplicativo foi encerrado com algum erro, enquanto System.exit (0) significa que o aplicativo foi encerrado sem nenhum erro. É assim que vários comandos linux / unix retornam condições (de erro) ao sair.
iOS-Coder de
17

É muito fácil. UsarSystem.exit(0);

Amon Olimov
fonte
2
Hahahah. Não é muito fácil
TheRealChx101
13

Na verdade, existem duas situações possíveis:

  1. Você pode querer sair da atividade
  2. Ou você deseja sair do aplicativo

Você pode sair da atividade usando o seguinte código:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Mas isso não eliminará as atividades subjacentes no mesmo aplicativo. Isso apenas minimizará o aplicativo.

Se você deseja sair do aplicativo, use o seguinte código para encerrar o processo:

android.os.Process.killProcess(android.os.Process.myPid()); 

para desenvolvimento mono, use

process.KillProcess(Process.MyPid());
Kasun
fonte
Mypid () é o seu método ou algo assim ... então, como você escreveu Mypid ... você tem que escrever com o método ...
Amitsharma
@amitsharma MyPid () é um método da classe Process, que retorna o identificador deste processo, que pode ser usado com killProcess (int) e sendSignal (int, int)
Kasun
Ele interromperia o serviço de segundo plano e os receptores de transmissão também ou apenas fecharia o aplicativo com segurança?
Usman Rana
então, qual é a diferença entre android.os.Process.killProcess(android.os.Process.myPid()); e process.KillProcess(Process.MyPid());?
DysaniazzZ
7

E se this.finishAffinity()

Dos documentos,

Conclua esta atividade, bem como todas as atividades imediatamente abaixo dela na tarefa atual que tenham a mesma afinidade. Isso normalmente é usado quando um aplicativo pode ser iniciado em outra tarefa (como de um ACTION_VIEW de um tipo de conteúdo que ele entende) e o usuário usou a navegação para cima para sair da tarefa atual e entrar em sua própria tarefa. Nesse caso, se o usuário navegou para baixo em qualquer outra atividade do segundo aplicativo, todas elas devem ser removidas da tarefa original como parte da alternância de tarefas. Observe que esse acabamento não permite que você forneça resultados para a atividade anterior e uma exceção será lançada se você estiver tentando fazer isso.

Akeshwar Jha
fonte
6
android.os.Process.killProcess(android.os.Process.myPid());
Katir
fonte
Para o meu caso, isso salvou minha vida. Obrigado!
Lifka de
4

isso limpará a tarefa (pilha de atividades) e iniciará uma nova tarefa

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
Mahmood Ali
fonte
Explique por que você postou este código como uma resposta e o que ele faz também.
M. Adeel Khalid
1
Bem-vindo ao Stack Overflow! Embora você possa ter resolvido o problema desse usuário, as respostas apenas de código não são muito úteis para os usuários que vierem a esta pergunta no futuro. Edite sua resposta para explicar por que seu código resolve o problema original.
Joe C
3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }
azeem khan
fonte
2

coloque este em seu onClic:

moveTaskToBack(true);
    finish()
Stan Malcolm
fonte
o que há de errado com o downvoted. Esta é a resposta. Eu tenho 2 atividades, a primeira é loginactivity e a segunda é mainactivity ... eu queria sair do aplicativo em mainactivity e não quero voltar para loginactivity ... eu insiro esta resposta, e agora posso fechar o aplicativo dentro de mainactivity.
Azizi Musa
se você fizer isso, o aplicativo ainda estará executando em segundo plano
Mohanad Haddadin
Trabalhando bem. Meu caso é: splashActivity execute MainActivity. Quando o usuário pressiona novamente, o aplicativo MainActivity sai conforme o esperado. Todos os outros casos me levam de volta à atividade inicial!
Jviaches
Bem, você deveria ter terminado a atividade de login assim que o login terminar :) E a resposta é claro que não é completamente correta , movewTaskToBacknão termina nada apenas esconde o app, e finishcomo já foi mencionado por qualquer pessoa termina apenas o atual activity. Portanto, ele sai da atividade atual e esconde o resto, se houver algum. De qualquer forma, não deve obter uma votação negativa apenas para este ...
Gato Miau 2012
2

Experimente isso em uma chamada. Às vezes, eu o uso no onClick de um botão.

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Em vez de fechar seu aplicativo, abre o painel de controle para que pareça que seu aplicativo está fechado.

leia esta pergunta para mais clareza android - código do aplicativo de saída

Rishiraj Purohit
fonte
2

Use this.finishAffinity (); nesse botão em vez de terminar (); Se não funcionar, você também pode tentar adicionar android: noHistory = "true" em seu manifesto e, em seguida, terminar sua atividade usando terminar (); ou terminarAffinity ();

Espero que ajude....:)

Yesha Shah
fonte
2

Conquistando no Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
fonte
Esta é uma referência para System.Environment.Exit ou Android.OS.Environment.Exit?
Moffen de
2

Basta chamar essas duas funções

 finish();
 moveTaskToBack(true);
younes
fonte
Sua resposta veio em postagens de qualidade inferior. Forneça algumas explicações, embora seu código seja autoexplicativo.
Harsha Biyani
2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Use este código, é muito útil e você pode sair de todas as atividades.

Abdul Kadir
fonte
Eu fiz isso e, em seguida, joguei o telefone do 5º andar, todas as atividades encerradas, obrigado
Paschalis,
1

atividade fantasma chamada com singletop e finish () em onCreate deve resolver o problema

JesusS
fonte
1

Funciona usando apenas moveTaskToBack(true);

user3856297
fonte
1

Em vez de System.exit (1) Basta usar System.exit (0)

Kaze Tdr
fonte
1

Se alguém ainda está se perguntando, para Xamarin.Android (no meu caso também Monogame rodando nele) o comando FinishAndRemoveTask()on Activityfaz o trabalho muito bem!

Konrad
fonte
1

no fragmento

getActivity (). finishAndRemoveTask ();

na atividade

terminarAndRemoveTask ();

Rodrigo Givisiez
fonte
0

apenas use o código em seu backpress

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
Sayooj
fonte
0

Se você estiver usando EventBus (ou realmente qualquer outra biblioteca pub / sub) em seu aplicativo para se comunicar entre as atividades, você pode enviar a eles um evento explícito:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

A única desvantagem disso é que você precisa que todas as atividades para ouvir este evento sejam próprias finish(). Para isso, você pode criar facilmente classes de atividades de shim por meio de herança, que apenas ouvem esse evento e permitem que as subclasses implementem todo o resto, depois certifique-se de que todas as suas atividades sejam herdadas dessa camada extra. Os ouvintes de morte podem até adicionar alguma funcionalidade extra por meio de substituições, como evitar a morte em certas situações específicas.

Grzegorz Adam Hankiewicz
fonte
0

Basta executar as duas linhas abaixo quando quiser sair do aplicativo

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Hassnain Jamil
fonte
0
finish();
 finishAffinity();
 System.exit(0);

trabalhou para mim

prabhu
fonte
1
Adicione alguma explicação ao seu código. Além disso, parece que outras respostas já abordaram isso - então você também deve explicar o que torna sua solução melhor do que as outras
Nico Haase
0

Apenas chame isso de:

finishAffinity();
Muhammad Naveed
fonte
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
Igor F.
0

Ligue este método ao seu botão sair / sair

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
Sihat Afnan
fonte
-1

Se você usar terminar e sair, seu aplicativo fechará completamente

terminar();

System.exit (0);

Abdullah alkış
fonte