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?


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


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); 

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!


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);

                }
            });

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);
}

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();
    }

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


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());

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.


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

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);

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);
    }

2

coloque este em seu onClic:

moveTaskToBack(true);
    finish()

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


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....:)


2

Conquistando no Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

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);

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.


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



1

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


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!


1

no fragmento

getActivity (). finishAndRemoveTask ();

na atividade

terminarAndRemoveTask ();


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);

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.


0

Basta executar as duas linhas abaixo quando quiser sair do aplicativo

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

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

trabalhou para mim


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();

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();
        }
    }

-1

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

terminar();

System.exit (0);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.