問題
Serviceにアラートダイアログの記述をしたところアラートダイアログが表示されませんでした。
MyService.java
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
//Context (this)がServiceなのでActivityじゃなきゃ表示されない
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("title");
alertBuilder.setMessage("message");
alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alertBuilder.create().show();
}
ServiceのContextをビルダークラスのコンストラクタの引数に渡しても表示されないようです。
解決方法
アラートダイアログ表示用のActivityを作成する。
CallDialogActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String message = getIntent().getStringExtra(MESSAGE);
setContentView(R.layout.activity_call_dialog);
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("title");
alertBuilder.setMessage("message");
alertBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
CallDialogActivity.this.finish();//選択をしたら自信のActivityを終了させる
}
});
alertBuilder.create().show();
}
AndroidManifestにthemeとlanchModeの記述を追加
themeはTranslucentにすることでActivityを透明にし、NoTitleBarでタイトルバーを消します。
lanchModeはsingleInstanceにすることでこのActivityがTaskに一つしか存在しなくなります
AndroidManifest.xml
<activity
android:name=".CallDialogActivity"
android:label="@string/title_activity_call_dialog"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:launchMode="singleInstance">
</activity>
Serviceからアラートダイアログ用のActivityを起動する
MyService.java
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
Intent intent = new Intent(this, CallDialogActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);//新規起動の記述
startActivity(intent);
}
以上でServiceからアラートダイアログを表示する事が出来る。
もしかすると表示したいActivityのContextをServiceに渡してあげれば起動できるのかな?(試してません)