Всплывающее диалоговое окно Android из фоновой темы - PullRequest
9 голосов
/ 22 июня 2009

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

Можно ли это сделать? Поскольку диалог обрабатывается в соответствии с Activity, я подумал об использовании службы, но опять-таки это был бы еще один добавленный поток, и я хочу избежать этого.

Есть ли другие варианты?

Ответы [ 3 ]

17 голосов
/ 22 июня 2009

Если вы пытаетесь спросить, как показать диалоговое окно, когда ваша деятельность не является сфокусированной деятельностью на телефоне пользователя, попробуйте вместо этого использовать Уведомления. Открытие диалогового окна над другим приложением прерывает пользователя, когда он может делать что-то еще. Из рекомендаций для пользовательского интерфейса Android :

Используйте систему уведомлений - не использовать диалоговые окна вместо уведомления

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

Руководство по созданию уведомлений находится здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

1 голос
/ 09 февраля 2013

если я вас правильно понимаю, вы можете использовать базовый класс для всех ваших действий

public abstract class BaseActivity extends Activity{
    protected static BaseActivity current_context = null;

    @override
    protected void onPause(){
        current_context = null;
        super.onPause();
    }

    @override
    protected void onResume(){
        current_context = this;
        super.onResume();
    }

    public static void showDialog(/*your parameters*/){
        //show nothing, if no activity has focus
        if(current_context == null)return;
        current_context.runOnUiThread(new Runnable() {
            @override
            public void run(){
                AlertDialog.Builder builder = 
                    new AlertDialog.Builder(current_context);
                //your dialog initialization
                builder.show();
            }
        });
    }
}

в вашей теме показывает ваш диалог с BaseActivity.showDialog(..) Но этот подход не работает, если вы хотите, чтобы ваш диалог отображался поверх любой активности целевого устройства.

1 голос
/ 25 ноября 2010

Альтернативное решение:

AlertDialog dialog;
//add this to your code
    dialog = builder.create();
    Window window = dialog.getWindow(); 
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.token = mInputView.getWindowToken();
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
    window.setAttributes(lp);
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//end addons
alert.show();
...