Как отобразить диалог из службы?
Диалоговое окно оповещения из службы Android
Ответ 1
android-smspopup делает именно это.
Служба получает sms и запускает Activity с помощью:
android:theme="@android:style/Theme.Dialog"
РЕДАКТИРОВАТЬ: Активность диалога запускается здесь с помощью этого кода
private void notifyMessageReceived(SmsMmsMessage message) {
    (...)
    context.startActivity(message.getPopupIntent());
    (...)
}
С объявленным как getPopupIntent() (код здесь):
public Intent getPopupIntent() {
    Intent popup = new Intent(context, SmsPopupActivity.class);
    popup.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    popup.putExtras(toBundle());
    return popup;
    }
 SmsPopupActivity класс явно определяет активность диалога. Его объявлено как указано в AndroidManifest.xml:
    <activity
        android:name=".ui.SmsPopupActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:launchMode="singleTask"
        android:screenOrientation="user"
        android:taskAffinity="net.everythingandroid.smspopup.popup"
        android:theme="@style/DialogTheme" >
    </activity>
Ответ 2
Другой способ без использования активности:
AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setTitle("Title")
                    .setMessage("Are you sure?")
                    .create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
Обратите внимание, что вы должны использовать это разрешение:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Ответ 3
Материал в стиле Dialog из службы
Из сервиса вы можете легко показать диалоговое окно "Дизайн материала", управляющее его типом, атрибутами и LayoutParams.
Прежде чем мы начнем: Библиотека AppCompat
В этом руководстве предполагается использование Android AppCompat libray.
Прежде чем мы начнем: Разрешения
Этот метод нуждается в разрешении  SYSTEM_ALERT_WINDOW.
Обычно служба, которая хочет отобразить диалоговое окно, также имеет некоторые представления, нарисованные поверх пользовательского интерфейса системы (добавляется с помощью метода WindowManager.addView()), поэтому вы могли бы уже объявить это использование разрешений внутри манифеста. Если нет, добавьте эту строку:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
В Android 6.0 Marshmallow пользователь должен явно разрешить вашему приложению "рисовать поверх других приложений". Вы можете программно запускать системные настройки. Активность, которая содержит переключатель:
@Override
protected void onResume() {
    super.onResume();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
        openOverlaySettings();
    }
}
@TargetApi(Build.VERSION_CODES.M)
private void openOverlaySettings() {
    final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                     Uri.parse("package:" + getPackageName()));
    try {
        startActivityForResult(intent, RC_OVERLAY);
    } catch (ActivityNotFoundException e) {
        Log.e(TAG, e.getMessage());
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case RC_OVERLAY:
            final boolean overlayEnabled = Settings.canDrawOverlays(this);
            // Do something...
            break;
    }
}
Создайте свою собственную тему диалога конструктора материалов
Внутри themes.xml создайте эту тему и настройте ее с помощью цветов вашего приложения:
<style name="AppTheme.MaterialDialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/brand_primary</item>
    <item name="colorPrimaryDark">@color/brand_primary_dark</item>
    <item name="colorAccent">@color/brand_accent</item>
    <item name="android:windowBackground">@drawable/dialog_background_light</item>
    <item name="android:textColorPrimary">@color/primary_text_light</item>
    <item name="android:textColorSecondary">@color/secondary_text_light</item>
    <item name="android:textColorTertiary">@color/secondary_text_light</item>
</style>
Запустите диалог
Внутри вашего сервиса:
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this, R.style.AppTheme_MaterialDialogTheme);
dialogBuilder.setTitle(R.string.dialog_title);
dialogBuilder.setMessage(R.string.dialog_message);
dialogBuilder.setNegativeButton(R.string.btn_back,
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        }
);
final AlertDialog dialog = dialogBuilder.create();
final Window dialogWindow = dialog.getWindow();
final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();
// Set fixed width (280dp) and WRAP_CONTENT height
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialogWindowAttributes);
lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics());
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
dialogWindow.setAttributes(lp);
// Set to TYPE_SYSTEM_ALERT so that the Service can display it
dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialogWindowAttributes.windowAnimations = R.style.DialogAnimation;
dialog.show();
Ответ 4
В документации предлагается использовать уведомления. Пересчитайте, почему вам может понадобиться использовать диалоги. Чего вы пытаетесь достичь?
Ответ 5
Прежде всего, вам нужно разыграть свою активность в сервисе, чтобы в вашей активности добавить
public static Activity mactivity;
и в On create добавить это
mactivity = YourActivity.this;
и когда мы перейдем к вашему Сервису, еще объявим:
YourActivity mact;
YourActivity act;
и в сервисе Create это наш кастинг
mact = (YourActivity) act.mactivity;
и диалог оповещения будет выглядеть так:
AlertDialog.Builder builder = new AlertDialog.Builder(mact);
        builder.setMessage(getResources().getString(R.string.string));
        builder.setIcon(R.drawable.chat);
        builder.setTitle(R.string.app_name);
        builder.setPositiveButton(getResources().getString(R.string.Ok), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                // TODO Auto-generated method stub
               your message
            }
        });
 помните, что mact - это класс Cast для использования в Alert Builder... он отлично работает, надеюсь, он мне поможет.
Ответ 6
Ответ 7
Я вызываю ниже, внутри службы, когда мне нужно показать диалог.
public void ShowYesNoDialog() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    //Yes Button Clicked
                    break;
                case DialogInterface.BUTTON_NEGATIVE:
                    //No button clicked
                    break;
            }
        }
    };
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Did the dialog display?")
    .setPositiveButton("Yes", dialogClickListener)
    .setNegativeButton("No", dialogClickListener);
    AlertDialog alertDialog = builder.create();
    alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
    alertDialog.show();
}
Убедитесь, что в манифест добавлено разрешение ниже. android.permission.SYSTEM_ALERT_WINDOW
Я также думаю, что для SDK 23 и выше пользователь должен явно установить разрешение "Нарисуйте другие приложения" из Диспетчера приложений для приложения, которое запускает эту службу.
