FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Android »【Android】【Java】別スレッドから Activity を終了する

【Android】【Java】別スレッドから Activity を終了する  


 Activity をコードで終了させるには、Activity.finish() を使えば良いのだが、このメソッドはメインスレッドから呼ばないと、正常にライフサイクルが呼ばれないっぽい。他のスレッドから使うと、Actiivty は終了しても、呼び出したスレッド自身は残るようで(よって、そのスレッドが再び Activity を呼び出そうとすると NullPointerException が発生する)、いまいち動作が良くない。

 というわけで、別スレッドからメッセージにより、Activity 自身を呼び出して、メインスレッドから終了処理を実行する方法にしたら、上手くライフサイクルもまわるようになった。その簡略的なコード。

public class MainActivity extends Activity implements Handler.Callback {
//別スレッドからのメッセージ受信用 ハンドラ
final Handler msgHandler = new Handler(this);

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

@Override
protected void onResume() {
super.onResume();
//※スレッド開始処理
}

@Override
protected void onPause() {
super.onPause();
//※スレッド停止処理
}

//終了用のメッセージを送信する
public void exit() {
Message msg = new Message();
msg.obj = "exit"; //終了用のメッセージ(何でも良い)
msgHandler.sendMessage(msg); //MainActivity に送信
}

//メッセージ受信用 コールバックメソッド
@Override
public boolean handleMessage(Message msg) {
if (msg.obj.equals("exit")) { //ここでメッセージを分岐
finish(); //Activity 終了。onPause(), onDestoty() も実行される
}
return false;
}
}

 色々なサンプルを調べてみたが、スレッドのコードまで書くと複雑に見えるので割愛した。あくまで要点のみを抜き出したコードなので、自由に自分のコードに置き換えて欲しい。これだけで十分だろう。

 メインの MainActivity には exit() というメソッドを加えたが、名前は何でも良い。内容的には別スレッドからこの exit() を実行し、MainActivity 自身の Handler に、Message を送信する。そしてこの MainActivity には Handler.Callback を implements してあるので、コールバックメソッド handleMessage() で受信できるようになっている。メッセージの内容は String 型の "exit" としてあるが、自分でわかれば何でも良い。こうすると別スレッドから exit() を使用してもそこで処理はせず、一旦メッセージが送られた後で、MainActivity はメッセージを受信し、その後コールバックメソッド handleMessage() 内で finish() して Activity を終了する。ちょっと面倒だが、こうするとメインスレッド主導で実行できるので、エラーなども出にくい。

 この方法はスレッド間通信みたいなもので、メッセージ内容で処理を分岐すれば、色々なことができると思う。Service から使うのも良いかもね。いずれにしても別のスレッドからメインスレッドの機能を使いたいときには有用だろう。


関連記事
スポンサーサイト



category: Android

thread: プログラミング

janre: コンピュータ

tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/144-9e58f208
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR