Androidでサービスからダイアログを表示する方法をメモ

AlertDialogでサービスからは、アクティビティから呼び出すような呼び方でダイアログを表示することはできない。実行するとエラーとなる。
例えば、GCMのプッシュ処理でプッシュをキャッチするのはAndroidのサービスになる。このときにユーザにキャッチした事を知らせるダイアログを表示する時など、サービスからダイアログを表示する用途は多々ある。
サービスから実行できないのはAndroidの仕様で、ダイアログを表示する場合にはActivityのContextを使用しなければいけない。なので、呼び方に工夫が必要となる。
サービスからActivityを呼び出し、呼び出されたActivity内でダイアログを表示する作りとすれば解決する。

ダイアログ表示用のActivityを用意する

まずはダイアログを呼び出すActivityを作成する


import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;

public class CallDialogActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Title").setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {
						dialog.cancel();
						finish();
					}
				});
		AlertDialog alert = builder.create();
		alert.show();
	}
}

マニフェストへActivityを設定

マニフェストファイルへActivityを設定する。このときlaunchModeはsingleInstanceとしておくと良い。
これはActivityがバックで動作している場合(ホームボタン押下してアプリをバックにした)に、ダイアログを呼び出した場合、現在バックで保持されているActivityが表示され、その上にダイアログが表示される状態になる。挙動としてダイアログのみを表示したい場合にはsingleInstanceとしておく。

      	<activity
  		android:name="CallDialogActivity"
  		android:theme="@android:style/Theme.Translucent.NoTitleBar"
  		android:launchMode="singleInstance">
	</activity>

サービスからActivityを呼ぶ

あとはサービス内からActivityを呼び出す事で完了。
intentにはFLAG_ACTIVITY_NEW_TASK、Intent.FLAG_ACTIVITY_CLEAR_TOPを付加しておく。
FLAG_ACTIVITY_NEW_TASK:タスクがスタックに存在しても新しいタスクとして起動
FLAG_ACTIVITY_CLEAR_TOP:スタックをクリアしてからActivityを起動

参考:http://it-trick-java.appspot.com/android/c9001/page7151.html

例)今回はGCMのonMessage(サーバからpush実行時に呼び出し)で処理を実行する。

    @Override
    protected void onMessage(Context context, Intent intent) {    
        // ポップアップダイアログ表示(pushキャッチ時)
        Intent i = new Intent(context,CallDialogActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(i); 
    }

ちょっと面倒だけど、これでダイアログがサービスから呼び出す事が可能

その他おすすめの備忘録

Tagged with:
 

One Response to [Android]サービスからダイアログを表示する方法

  1. yamanetoshi より:

    “i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);”

コメントを残す