19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidのServiceからアラートダイアログを表示する方法

Last updated at Posted at 2014-11-19

問題

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に渡してあげれば起動できるのかな?(試してません)

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?