Android - Как отобразить диалог на родном экране? - PullRequest
17 голосов
/ 27 января 2010

Мне было интересно, если кто-нибудь может сказать, как вывести диалоговое окно поверх родного экрана Android?

В настоящее время у меня есть приложение, которое перехватывает исходящий вызов и останавливает его, затем я хочу открыть диалоговое окно, которое заменит экран дозвона, и предупредить пользователя о том, что попытка вызова заблокирована, и разрешить ему новые опции из диалога.

Я знаю, что некоторые люди скажут, что я должен вместо этого использовать уведомления, но я знаю об этом, и это не так, как это должно работать, мне нужно иметь возможность открывать диалоговое окно, когда вызов попадает в ловушку.

Пока это мой код диалога

  AlertDialog LDialog = new AlertDialog.Builder(context)
     .setTitle("Call Blocked")
     .setMessage("Call Blocked, reroute call?")
     .setPositiveButton("ok", null).create();
      LDialog.show();

Полагаю, мне нужно каким-то образом получить контекст для экрана набора номера?

Может ли кто-нибудь предложить какую-либо помощь и содействие или ссылки на учебники?

Заранее спасибо

Ответы [ 2 ]

59 голосов
/ 27 января 2010

Для своего приложения я использовал действие с темой Dialog. Вы можете объявить тему в файле манифеста:

<activity android:name="PopupActivity"
  android:launchMode="singleInstance" android:excludeFromRecents="true"
  android:taskAffinity="" android:theme="@android:style/Theme.Dialog" />
  • используйте launcheMode="singleInstance" и taskAffinity="", если ваше всплывающее окно отключено от основного приложения. В противном случае пользователь может нажать кнопку «Назад» и вернуться к предыдущей активности вашего приложения.
  • excludeFromRecents="true", чтобы всплывающее окно не появлялось в последних задачах (долгое нажатие дома)
  • theme="@android:style/Theme.Dialog" для установки темы диалога.
4 голосов
/ 19 июля 2013

Как получить эквивалент launchMode = singleTask в коде

Я не видел четкого объяснения того, как установить эти флаги программно, поэтому я приведу свои результаты здесь. tldr: вам нужно установить FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_MULTIPLE_TASK.

Если вы запустите это прямо из своего приложения, ваш диалог появится в верхней части последней активности вашего приложения. Но если вы используете трансляцию PendingIntent от AlarmManager для запуска своего «диалога», у вас есть время переключиться на другое приложение, чтобы вы могли видеть, что ваш «диалог» будет отображаться поверх этого другого приложения, если стиль установлен соответствующим образом, чтобы показать, что за этим стоит.

Очевидно, что вы должны нести ответственность за то, когда уместно отображать диалоговое окно поверх других приложений.

public class MyReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

// you have to set these flags here where you receive the broadcast
// NOT in the code where you created your pendingIntent
    Intent scheduledIntent = new Intent(context, AlertAlarmActivity.class);
    scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    context.startActivity(scheduledIntent);
...