Как заставить окно AlertDialog отображаться вне приложения?

@Override
public void run() {
    //Create thread that can alter the UI
    AlarmPage.this.runOnUiThread(new Runnable() {
        public void run() {
            cal = Calendar.getInstance();
            //See if current time matches set alarm time
            if((cal.get(Calendar.HOUR_OF_DAY) == alarmTime.getCurrentHour()) 
                    && (cal.get(Calendar.MINUTE) == alarmTime.getCurrentMinute())){
                //If the sound is playing, stop it and rewind
                if(sound.isPlaying()){
                    ShowDialog();
                    alarmTimer.cancel();
                    alarmTask.cancel();
                    alarmTask = new PlaySoundTask();
                    alarmTimer = new Timer();
                    alarmTimer.schedule(alarmTask, sound.getDuration(), sound.getDuration());
                }
                sound.start();
            }       
        }
    });
}

public void ShowDialog() {
    final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

    alertDialog.setTitle("REMINDER!");
    alertDialog.setMessage("Turn off alarm by pressing off");

    alertDialog.setNegativeButton("Off", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getApplicationContext(), "OFF", Toast.LENGTH_SHORT);
        }
    });

    alertDialog.show();
}

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

Ответ 1

Добавьте строку как:

public void ShowDialog() {
    final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

    alertDialog.setTitle("REMINDER!");
    alertDialog.setMessage("Turn off alarm by pressing off");

    alertDialog.setNegativeButton("Off", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getApplicationContext(), "OFF", Toast.LENGTH_SHORT).show();
        }
    });

    alertDialog.show();
    // line you have to add
    alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
}

сейчас.

Ответ 2

Создайте Activity без ContentView или View, связанных с ним, и вызовите ваш метод alertDialog в onCreate, также не забудьте установить фон Activity на Transparent, используя ColourDrawable

И эта деятельность будет выглядеть как диалог или будет соответствовать вашим предпочтениям, вы также можете вернуться к Theme, чтобы вы могли установить Activity как Dialog и относиться к нему как к Dialog, также используйте DialogFragment

Ответ 3

Не принимайте ответы, если они не затрагивают ваш вопрос, это вводит в заблуждение.

Принятый ответ неверен, поскольку он никогда не будет работать вне вашего приложения.

Причина:

  • Для этого требуется контекст действия, а не контекст приложения.

  • Если вы предоставите контекст приложения, ваше приложение выйдет из строя с помощью IllegalArgumentException - вам нужно использовать Theme.AppCompat или их десятичные имена...

Если вам нужна функциональность, как указано в вопросе, вы должны иметь отдельную деятельность в виде диалога, например

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