2016-09-13 14 views
0

(예 : 기존 앱)이 아닌 인 다른 앱 B (예 :지도)를 여는 앱 A가 있다고합시다. 이제 앱 A가 백그라운드에 있습니다. 이벤트가 발생하고 A가 앱 B의 UI 위에 떠 다니는 대화 상자를 표시하려고한다고 가정하면 (앱 B의 활동은 그 뒤에 표시됩니다). 이것이 가능한가?백그라운드에서 다른 앱에 대한 대화 활동 표시

(이에 대한 일반적인 대답은 알림을 표시하는 것입니다, 그러나 이것은 대중 시장 응용 프로그램이 아니며, 우리는 매우 직접적으로 사용자의 관심을 얻기 위해 노력하고 있습니다.)

현재, 나는 일을하려고했다 다음과 같이 입력하십시오.

// This code runs in a class other than app A's main activity, 
// and the "activity" variable used here is a reference to that activity. 
Intent intent = new Intent(activity, NotificationDialogActivity.class); 
// EDIT: I'm not exactly sure whether NEW_TASK helps here or not 
// so I removed it, but the REORDER_TO_FRONT would ideally cause 
// app A's dialog activity to be moved to the front of the back stack? 
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
// The "msg" variable here is just some data being passed to the dialog activity 
// I included it here only so it is clear that there is a purpose. 
intent.putExtra(NotificationDialogActivity.EXTRA_MSG, msg); 
activity.startActivity(intent); 

app A (배경에있는 것)에서.

하지만 그렇게하면 대화 상자에 사이에 이 삽입되고 다시 스택의 앱 B 작업이 수행됩니다.

답변

2

는 몇 가지가 수행해야합니다 :

  • 대화 활동, 반투명 테마가 있어야 다른 응용 프로그램이 뒤에 표시 할 수 있도록 동일한 이유로, 대화 활동 화면을 작성하지 않아야
  • (@android:style/Theme.Translucent.NoTitleBar 참조)가 그 위에 표시된 경우되도록
  • 대화 활동베이스 활동에서 별도의 태스크의 일부이어야 (Window.setLayout 참조) 다른 응용 프로그램은 위의 기본 활동을 끌어 오지 않습니다. THER 응용 프로그램뿐만 아니라 여전히 표시되도록 백그라운드에서 실행에서 실행되고있는 활동 (FLAG_ACTIVITY_REORDER_TO_FRONT 참조) 경우
  • 대화 활동이
  • , 전면에 대화 활동을 가져와야합니다 (FLAG_ACTIVITY_NEW_TASK 참조) 어떻게 든 대화 상자를 보여줘야합니다. 대화 활동을 시작하는 코드의 Dialog 클래스 직접

를 확장하는 클래스 생성하여 : 상기에서

Intent intent = new Intent(baseActivity, DialogActivity.class); 
// NEW_TASK allows the new dialog activity to be separate from the existing activity. 
// REORDER_TO_FRONT causes the dialog activity to be moved to the front, 
// if it's already running. 
// Without the NEW_TASK flag, the existing "base" activity 
// would be moved to the front as well. 
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.putExtra(DialogActivity.EXTRA_SOME_PARAM, someParamValue); 
// The activity must be started from the application context. 
// I'm not sure why exactly. 
baseActivity.getApplicationContext().startActivity(intent); 

baseActivity 응용 프로그램의 주요 활동에 대한 참조이다.

launchModesingleInstance 인 대화 활동을 제공하여 작업에 다른 활동이 누적되지 않도록하는 데 도움이 될 수 있지만 이는 불필요 할 수 있습니다. @android:style/Theme.Translucent.NoTitleBar 테마를 사용하면 아래의 활동을 표시 할 수 있습니다.그것은 대화 활동의 레이아웃 XML에서, 마찬가지로

getWindow().setLayout(
    ViewGroup.LayoutParams.MATCH_PARENT, 
    ViewGroup.LayoutParams.WRAP_CONTENT 
); 

:

<activity 
    android:name=".DialogActivity" 
    android:launchMode="singleInstance" 
    android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
</activity> 

대화 활동 자체를 들어, 전체 화면을 채울하지 않도록하기 위해 창을 조정해야 할 수도 있습니다

대화 자체에 대한
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 

, 당신은 많은 것들을 할 수 있지만 하나 개의 솔루션은 Dialog 클래스 확장하는 것입니다 : 필요할 수도

class DialogActivity extends Dialog { ... } 

활동의 대화 상자를 표시하려면 대화 상자의 새 인스턴스를 만들고 해당 show() 메서드를 호출하십시오.

0

예 가능합니다. 사용자 지정 이벤트를 등록하기 위해 사용자 지정 동작과 브로드 캐스트 수신기를 구현하는 데 필요한 것.

앱 A가 맞춤 작업을 실행하고 앱 B에 작성되고 해당 작업에 등록 된 브로드 캐스트 리시버가 이벤트를 감지 할 수 있습니다. 그러면 수신기에 대화 상자를 표시해야합니다.

다소 까다 롭습니다. 다른 응용 프로그램을 통해 표시되는 대화 활동을하기 위해 행운을 빌어

+0

나는 단지 내 게시물을 분명히 해명했다.이 상황에서 앱 B는 내가 쓰고있는 앱이 아니다. 실제로 기기에 이미 존재하는 앱입니다. –

+0

그래서 질문이 대화 상자를 표시하는 방법 인 경우 이미 정답을 제공했습니다. Facebook 메신저처럼 부동 뷰를 사용해야합니다. 메신저 키워드로 플로팅 헤드를 작성하여 웹에서 자습서를 찾을 수 있습니다. –

+0

앱 B에서 앱 A (전체 화면이 아닌 것이 가장 이상적)에서 활동을 표시하여이를 수행 할 수있는 방법이 있습니까? 페이스 북처럼 floating-view-using-the-window-manager 방식을 사용하는 대신에? 기본적으로, 앱 B 활동을 통해 앱 A 활동을 가져올 수 있습니다. 이는 가장 간단한 방법입니다. 그러나 그것이 가능한지 확실하지 않습니다. –