6

別のアプリ 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);

アプリ A (バックグラウンドにあるアプリ) 内から。

しかし、それを行うと、バックスタックの元のアプリ A アクティビティとアプリ B アクティビティのにダイアログが挿入されます。

4

3 に答える 3

9

ダイアログ アクティビティを別のアプリケーションの上に表示するには、いくつかの操作を行う必要があります。

  • ダイアログ アクティビティには、他のアプリケーションが背後に表示されるように、半透明のテーマが必要です ( を参照@android:style/Theme.Translucent.NoTitleBar) 。
  • 同じ理由で、ダイアログ アクティビティが画面いっぱいにならないようにする必要があります ( を参照Window.setLayout) 。
  • ダイアログ アクティビティは、ベース アクティビティとは別のタスクの一部である必要があります。これにより、ダイアログ アクティビティが他のアプリケーションの上に表示されたときに、ベース アクティビティを他のアプリケーションの上にも引っ張ることがありません ( を参照FLAG_ACTIVITY_NEW_TASK) 。
  • ダイアログ アクティビティは、起動元のアクティビティがバックグラウンドで実行されている場合でも表示されるように、前面に移動する必要があります (「 」を参照FLAG_ACTIVITY_REORDER_TO_FRONT) 。
  • ダイアログ アクティビティは、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下のアクティビティが透けて見えます。

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

ダイアログ アクティビティ自体については、画面全体に表示されないようにウィンドウを調整する必要がある場合があります。

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

同様に、ダイアログ アクティビティのレイアウト XML では、次のことも必要になる場合があります。

android:layout_width="fill_parent"
android:layout_height="wrap_content"

ダイアログ自体については、多くのことができますが、1 つの解決策は、Dialogクラスを拡張することです。

class DialogActivity extends Dialog { ... }

アクティビティからダイアログを表示するには、Dialog の新しいインスタンスを作成し、そのshow()メソッドを呼び出します。

于 2016-09-25T20:10:27.877 に答える
-1

はい、可能です。カスタム アクションとブロードキャスト レシーバーを実装して、カスタム イベントを登録するために必要なもの。

アプリ A がカスタム アクションをトリガーし、アプリ B に記述され、そのアクションに登録されているブロードキャスト レシーバーがイベントを検出できます。次に、レシーバーにダイアログを表示する必要があります。

それは難しいかもしれません。幸運を

于 2016-09-13T21:53:55.667 に答える