アプリケーションを終了してホーム画面を表示するにはどうすればよいですか?


196

ホームページにアプリケーションをナビゲートするためのボタンがあるアプリケーションがあります。

そのページには、「EXIT」ボタンがあります。このボタンをクリックすると、ユーザーはアプリケーションアイコンがある電話のホーム画面に移動します。

どうやってやるの?

回答:


327

Androidの設計では、アプリケーションを選択して終了するのではなく、OSがアプリケーションを管理します。対応するインテントによってHomeアプリケーションを起動できます。

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

25
あなたも使用できます.. "moveTaskToBack(true);"
hemanth kumar

17
すべてのリソースを解放しますか?この方法でアプリを終了すると、しばらくしてからもう一度アプリのアイコンをクリックします。それは私が去ったところから始まります。つまり、アプリはまだバックグラウンドで実行されていました。
アディルマリク

12
Activity.finish();
hB0 2013年

11
これにより、アプリがバックグラウンドで維持されるため、アプリが終了しません。
ハーマンシェーンフェルト2013年

3
この答えは、ホーム画面を表示するだけで、OPが望むようにアプリケーションを完全に終了/閉じることはありません。
Basher51 2014

74

あなたはこのようなものを試すことができるかもしれません

アプリケーションで、いくつかのアクティビティ(たとえば10)があり、このアクティビティを直接終了する必要があるとします。私たちができることは、インテントを作成してルートアクティビティに移動し、インテントに次のようにフラグを設定することです。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

また、ブール値のような余分なものをインテントに追加します

intent.putExtra("EXIT", true);

次に、ルートアクティビティでの値を確認し、booleanその呼び出しに応じてonCreate()、ルートアクティビティの

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

1
onCreateで何もしないで、finishを呼び出します。
キャプター2013年

2
私の場合もオーバーライドする必要onNewIntentがありました。intnet.getExtras()がnullのままだったからです。
zznq 2013年

そして、このメソッドはRootActivityスタックから再開するのではなく、再起動します。このstackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

おそらくあなたが探しているものです。アプリケーション全体を閉じて、ホーム画面に移動します。


1
それは小文字の出口である必要がありますか?
キャロル

1
System.exit(0)である必要があります。しかし、それはとにかくあまり役​​に立ちません。
superarts.org 2012

7
System.exit(0)は、コアAndroidチームの助言に従って使用しないでください。
Dinesh Venkata

2
これは例外的な状況に最適なアプローチだと思います。インターネットを必要とするアプリの場合は、接続によっていくつかのアクティビティがアプリに分割されます。警告ダイアログを表示できます(ボタンなし)。再入には再度ログイン/初期化が必要なので、[戻る]ボタンはアプリ全体を終了する必要があります。System.exitは、私が見つけた合理的に機能する唯一のものです。@ user1699548コメントについては不明です。
ハーマンシェーンフェルト2013年

1
これにより、そのアプリに関連するすべてのサービスも強制終了されますか?
bsara 2013

25

これは私にはうまくいきます。
次のように、以前のすべてのアクティビティを閉じます。

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

次にMainActivity onCreate()メソッドでこれを追加してMainActivityを終了します

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

これは私にはうまくいきません。私のアプリには何も表示されませんが、なんらかの方法で実行されています。スレッドがぶら下がっていて、実際には何もしないデバッガで待機しているのがわかります。
スティーブンM-ストライキ

23

最初にメソッドを使用してアプリケーションを終了します finish();

そして、力を取り除くためにonDestroyに以下の行を追加します

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

3
リソースを解放する機会がないため、これを使用しないでください
ジャッキー

1
-1は、戻るキーが押されたときだけでなく、アクティビティを終了するたびにonDestroyが実行されるためです。
Hamzeh Soboh

5
@Jacky:プロセスを終了してもシステムリソースが解放されないのはなぜですか。
ハーマンシェーンフェルト2013年

1
なぜsuper.onDestroy()killProcess()ですか?この線に到達するでしょうか?
2016

これもあなたのすべてのサービスを殺しませんか?
Irshu 2017年

20

アクティビティを終了したい場合は、を呼び出すだけfinish()です。ただし、画面に終了ボタンを配置することはお勧めできません。


2
「このアプリを最新バージョンに更新する必要があります」に使用していますが、今後も使用してほしくありません。まだ悪い習慣...?
beetree

@beetreeはい。他の悪い習慣と同様に、それが唯一の選択肢である場合があり、他のことをしようとすると無意味になるため、それを使用します。違法な構文とは対照的に、それが悪い習慣であるという点は、それがそれらのいくつかのケースで利用可能であるということですが、あなたはそれを行うためのより良い方法を見つけるためにあなたの最愛の人を試すべきです。あなたの場合、それはありません。
モニカの訴訟に資金

17

一部のアクティビティでは、スプラッシュスクリーンアクティビティ、ウェルカムスクリーンアクティビティ、確認ウィンドウなどの戻るボタンが押されたときに、再度開きたくない場合があります。実際には、これはアクティビティスタックでは必要ありません。=> open manifest.xmlファイルを使用してこれを実行し、属性を追加できます

android:noHistory = "true"

これらの活動に。

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

または

場合によっては、特定の戻るボタンを押してアプリケーション全体を閉じる必要があります。ここでのベストプラクティスは、アプリケーションを終了する代わりにホームウィンドウを開くことです。そのためには、onBackPressed()メソッドをオーバーライドする必要があります。通常、このメソッドはスタックの最上位のアクティビティを開きます。

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

または

戻るボタンが押された場合、そのアクティビティを終了する必要があります。また、これをアクティビティスタックに追加する必要もありません。onBackPressed()メソッド内でfinish()メソッドを呼び出します。アプリケーション全体を閉じるわけではありません。スタック内の前のアクティビティに進みます。

@Override
public void onBackPressed() {
  finish();
}

16

Androidアプリケーションを終了することはお勧めしません。詳細については、この質問を参照してください。

ユーザーは、ホームボタンを使用して、または最初のアクティビティで[戻る]ボタンを使用して、いつでもアプリを終了できます。


3
@janusz:ホームボタンを押すとAndroidアプリケーションが終了せず、代わりにバックグラウンドで実行されます...
Jayesh

5

(私は以前の答えを試しましたが、いくつかの点で欠けています。たとえばreturn;、アクティビティの終了後に操作を行わないと、残りのアクティビティコードが実行されます。また、onCreateをreturnで編集する必要があります。super.onCreate()を実行しない場合ランタイムエラーが発生します)

あなたが持っているMainActivityと言うとChildActivity

ChildActivityの内部にこれを追加します。

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

MainActivityのonCreate内にこれを追加します。

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}


3

uがfinishを呼び出すと、そのアクティビティのonDestroy()が呼び出され、アクティビティスタック内の前のアクティビティに戻ります。


3

これが私がしたことです:

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

基本的には、スタックからすべてのアクティビティをクリアして起動しQuitAppActivity、タスクを終了します。


良いアプローチ。Intentを介して値を渡す必要はありません。
user3144836

0

の後finish();に次の行を追加しますonDestroy()

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

0

次のコードスニペットを使用してアプリケーションを終了しようとしましたが、これは私にとってはうまくいきました。これがお役に立てば幸いです。2つのアクティビティで小さなデモを行いました

最初の活動

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

あなたの他の活動

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

オブザーバーモードでやった。

オブザーバーインターフェイス

public interface Observer {
public void update(Subject subject);
}

基本主題

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

子サブジェクトはexitメソッドを実装します

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

アプリケーションが拡張するMyApplication

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

基本活動

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

それをテストしましょう

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

アプリケーションを終了する場合は、このコードを関数の下に配置してください

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100%は正常に動作します。これはアプリを終了するためのコードですonClick(メソッド)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

アプリケーションを最小化するにmoveTaskToBack(true)は、exitボタンを追加するだけonClickedListenerです。

それが役に立てば幸い。


0

多分私のコードはhepls(Main_Activity.java)できます:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

アプリケーションを終了する場合。次に、ボタンが押されたイベント内でこのコードを使用します。 お気に入り:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.