2009-06-22 5 views
9

다른 스레드에서 메시지를 받았지만 대화 상자가 작업에 의존하지 않아야한다는 팝업 창이 필요합니다. 즉, 화면 포커스가있는 곳이면 대화 상자가 표시되어야합니다.PopUp 대화 상자 배경 스레드에서 안드로이드

할 수 있습니까? 대화 상자는 작업별로 처리되기 때문에 서비스를 사용할 생각 이었지만 다시 한 번 더 스레드가 추가 될 것이므로이를 피하고 싶습니다.

다른 옵션도 있습니까?

+0

나는 그가 다음과 같은 질문을 시도하고 있다고 생각합니다. 어떻게 별도의 스레드에서 실행중인 서비스로부터 대화를 시작할 수 있습니까? 실행중인 활동은 다양 할 수 있습니다. 대화 상자를 표시하려면 현재 활동을 지정해야합니다. –

+0

가능한 솔루션은 활동을 사용하는 것입니다 http://stackoverflow.com/posts/3912748/revisions –

+0

https://stackoverflow.com/a/29804684/2149195 – RBK

답변

17

활동이 사용자의 전화 활동에 집중되지 않은 경우 대화 상자를 표시하는 방법을 묻는 경우 알림을 대신 사용해보십시오. 다른 응용 프로그램을 통해 대화 상자를 표시하면 사용자가 다른 작업을 수행 할 때 인터럽트됩니다. Android UI guidelines에서 :

사용 알림 시스템 - 에 통지

당신의 배경 서비스가 필요한 경우 대신하지 사용 대화 상자 표준 알림 시스템을 사용하여, 사용자에게 통지 - 대화 또는 토스트를 사용하여 알림을 보내지 마십시오. 대화 상자 나 토스트는 즉시 초점을 사용자를 방해, 초점을 복용 멀리 그들이 무엇을하고 있는지부터 것 : 사용자가 텍스트를 입력하는 순간 대화 나타납니다의 중간에있을 수있는 실수 온 역할을 할 수 대화. 사용자는 알림이있는 을 처리하는 데 익숙하며 메시지에 응답하려면 편의에 따라 알림 창을 풀다운하면됩니다.

알림을 만들 수있는 가이드는 여기에 있습니다 : http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

인사를 난은 항상 응용 프로그램 대리인이 전화로 UI 변경 사항을 듣고 안드로이드에서 비슷한 점이 있습니까? – Sam97305421562

+0

Facebook Messenger (Bubbles)는이 규칙을 따르지 않습니다. . . – sospedra

+0

@Bursos 나는 당신의 요점이 무엇인지 모르겠습니다. Facebook은 종종 Android UI 가이드 라인을 따르지 않습니다. 또한 거품이 대화 상자처럼 사용자 입력을 처리하지 않습니다. – Intrications

1

대체 솔루션 :

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(); 
+1

그래서 백그라운드 스레드에서 mInputView를 얻을 수 있다고 생각합니까? ;) – Janusz

+0

(new AlertDialog.Builder (myAppContext)). create()가 나에게 java.lang.RuntimeException을 준다 : Looper.prepare()를 호출하지 않은 쓰레드 내에서 핸들러를 생성 할 수 없다. –

+0

당신은 응용 컨텍스트가 아닌 활동 컨텍스트를 사용해야합니다. – Sulby

1

내가 제대로 이해하면 당신은 당신의 모든 활동에 대한 기본 클래스를 사용할 수

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(..) 대화 상자를 표시하지만이 방법은 작동하지 않습니다. 상단에 대화 상자를 표시하려면 대상 장치의 모든 동작이입니다.

관련 문제