戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
07

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アクティビティ、アプリの終了方法

アクティビティ、または、アプリを終了させるには複数の方法が存在します。

この記事を書くにあたり、てくめも様の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);
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。