アクティビティ、または、アプリを終了させるには複数の方法が存在します。
この記事を書くにあたり、てくめも様のSystem.exit() を使ってはいけない理由と、終了方法のまとめを参考にさせて頂きました。
①Activity#finish()
アクティビティをライフサイクルに沿って正しく終了させる唯一の方法。
起動アクティビティの場合は、アプリを終了する(※)。
終了と書いてあるが、Android OSに対して終了通知を送るだけで、呼び出された直後に終了するわけではない。
そのため、finish()以降に処理が記述されていれば記述された処理は実行されてしまう。
なお、Android端末の戻るボタン押下時にも呼ばれている。
※ここでのアプリ終了はアクティビティが全て閉じられた状態であり、プロセスを完全に終了させるわけではない。プロセス終了のタイミングはAndroidのOSに依存する。
②Activity#moveTaskToBack(boolean nonRoot)
アプリをバックグラウンドへ移動させる。
アプリ自体は生きており、再度アプリを実行すれば前回終了したところから始まる。
Android端末のホームボタンを押下した時と同じ状態?
③(android.os.)Process#killProcess(int pid)
引数に強制終了させたいプロセスIDを指定する。
実行中のプロセスを対象にすると、呼び出し元のアクティビティのみを閉じる。
ライフサイクルを無視して終了するため推奨されていない。
④System#exit(int)
バーチャルマシンの実行を停止してプログラムを終了する。
Process#killProcess()と概ね同じ動作となる。
やっぱり推奨されていない。
⑤ActivityManager#killBackgroundProcesses(String packageName)
Android2.2から実装されたメソッド。
バックグラウンドにある指定したアプリを終了する。
自分自身はバックグラウンドではないため終了させることが出来ない。
このメソッドを呼ぶにはパーミッションに android.permission.KILL_BACKGROUND_PROCESSES を追加する必要がある。
⑥ActivityManager#restartPackage(String packageName)
Android2.1以前で呼び出すと指定したアプリを終了する。
複数のアクティビティが起動されていても、全て閉じてくれる。
ただし、2.2以降は#killBackgroundProcesses()がラップされており、そちらが実行されてしまう。
このメソッドを呼ぶにはパーミッションに android.permission.RESTART_PACKAGES を追加する必要がある(2.1以前のみ)
⑦Intent#setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) (2012/04/26追加)
Activity#startActivity(Intent intent) でアクティビティを開始させる際に Intent に FLAG_ACTIVITY_CLEAR_TOP を設定することでタスクに積まれたアクティビティを再開させることができる(タスクに積まれていなければ新しく開始される)。
このとき、再開されたアクティビティより上に詰まれた(新しい)アクティビティはすべてが破棄される。
つまり、アプリ実行時に最初に起動されるアクティビティを呼び出すことで最初の状態に戻すことができる。
【関連記事】タスク管理 - インテントフラグ:Intent#setFlags
タイトルの終了方法とは若干異なる内容ですが、アプリ終了として使える手法なので追加しました。
記述方法(Activityクラスでの記述を前提にしています)
この記事を書くにあたり、てくめも様のSystem.exit() を使ってはいけない理由と、終了方法のまとめを参考にさせて頂きました。
①Activity#finish()
アクティビティをライフサイクルに沿って正しく終了させる唯一の方法。
起動アクティビティの場合は、アプリを終了する(※)。
終了と書いてあるが、Android OSに対して終了通知を送るだけで、呼び出された直後に終了するわけではない。
そのため、finish()以降に処理が記述されていれば記述された処理は実行されてしまう。
なお、Android端末の戻るボタン押下時にも呼ばれている。
※ここでのアプリ終了はアクティビティが全て閉じられた状態であり、プロセスを完全に終了させるわけではない。プロセス終了のタイミングはAndroidのOSに依存する。
②Activity#moveTaskToBack(boolean nonRoot)
アプリをバックグラウンドへ移動させる。
アプリ自体は生きており、再度アプリを実行すれば前回終了したところから始まる。
Android端末のホームボタンを押下した時と同じ状態?
③(android.os.)Process#killProcess(int pid)
引数に強制終了させたいプロセスIDを指定する。
実行中のプロセスを対象にすると、呼び出し元のアクティビティのみを閉じる。
ライフサイクルを無視して終了するため推奨されていない。
④System#exit(int)
バーチャルマシンの実行を停止してプログラムを終了する。
Process#killProcess()と概ね同じ動作となる。
やっぱり推奨されていない。
⑤ActivityManager#killBackgroundProcesses(String packageName)
Android2.2から実装されたメソッド。
バックグラウンドにある指定したアプリを終了する。
自分自身はバックグラウンドではないため終了させることが出来ない。
このメソッドを呼ぶにはパーミッションに android.permission.KILL_BACKGROUND_PROCESSES を追加する必要がある。
⑥ActivityManager#restartPackage(String packageName)
Android2.1以前で呼び出すと指定したアプリを終了する。
複数のアクティビティが起動されていても、全て閉じてくれる。
ただし、2.2以降は#killBackgroundProcesses()がラップされており、そちらが実行されてしまう。
このメソッドを呼ぶにはパーミッションに android.permission.RESTART_PACKAGES を追加する必要がある(2.1以前のみ)
⑦Intent#setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) (2012/04/26追加)
Activity#startActivity(Intent intent) でアクティビティを開始させる際に Intent に FLAG_ACTIVITY_CLEAR_TOP を設定することでタスクに積まれたアクティビティを再開させることができる(タスクに積まれていなければ新しく開始される)。
このとき、再開されたアクティビティより上に詰まれた(新しい)アクティビティはすべてが破棄される。
つまり、アプリ実行時に最初に起動されるアクティビティを呼び出すことで最初の状態に戻すことができる。
【関連記事】タスク管理 - インテントフラグ:Intent#setFlags
タイトルの終了方法とは若干異なる内容ですが、アプリ終了として使える手法なので追加しました。
記述方法(Activityクラスでの記述を前提にしています)
// ①アクティビティを正しく終了する
finish();
// ②アクティビティをバックグラウンドに移動する
moveTaskToBack(true);
// ③指定したアクティビティのプロセスを殺す
// Process.myPid() で自身のプロセスIDを取得
Process.killProcess(Process.myPid());
// ④システムを終了する
System.exit(0);
// ⑤バックグラウンドのアプリを終了する(2.2以降)
// getPackageName() で自身のパッケージ名を取得
ActivityManager manager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(getPackageName());
// ⑥アプリを終了する(2.1以前)
ActivityManager manager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
// ⑦アクティビティを再開させる
Intent intent = new Intent(this, StartActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
スポンサーサイト
お久しぶりです。とむです。
お久しぶりといっても1週間ほどですが。
今回更新が止まった理由の1つには、暑くてPCに向かっていられない!
というのもありますが一番の理由はネット回線のトラブルでした。
あまりに暑かった所為か、回線不調(10分程度繋ぐとで回線が落ちる)に陥る状態になっていました。
原因はルーターで、一部が焼けてしまった様子(顔を近づけると微かに焦げ臭いにおいがする)
とりあえずルーターを外すだけで回線復帰したので、これから更新開始します。
(原因究明やら暑さで記事にできるようなことをしていませんでした…)
Androidに関してまだ触りの部分すら書ききれておらず、書くことは沢山あるので当分ネタ切れにはならなさそうです。
とはいえ、基礎的な部分ばかりじゃつまらないので合間合間に応用的な使い方とか色々かけたらなーと思っています。
拙い記事ですが、今後も読んでいただければ幸いです。
お久しぶりといっても1週間ほどですが。
今回更新が止まった理由の1つには、暑くてPCに向かっていられない!
というのもありますが一番の理由はネット回線のトラブルでした。
あまりに暑かった所為か、回線不調(10分程度繋ぐとで回線が落ちる)に陥る状態になっていました。
原因はルーターで、一部が焼けてしまった様子(顔を近づけると微かに焦げ臭いにおいがする)
とりあえずルーターを外すだけで回線復帰したので、これから更新開始します。
(原因究明やら暑さで記事にできるようなことをしていませんでした…)
Androidに関してまだ触りの部分すら書ききれておらず、書くことは沢山あるので当分ネタ切れにはならなさそうです。
とはいえ、基礎的な部分ばかりじゃつまらないので合間合間に応用的な使い方とか色々かけたらなーと思っています。
拙い記事ですが、今後も読んでいただければ幸いです。