6

Android MediaRouter(API 16) およびPresentation(API 17) クラスを使用して、セカンダリ ディスプレイを生成および管理しています。ApiDemosの例に従って、独自のミラーリングされていない出力を作成しましたが、これまでのところ正常に動作します (HDMI ケーブル経由で HDTV に接続された Nexus 10 でテスト)。

ここで、別の を呼び出したActivity Xとしても、 で作成されたプレゼンテーション オブジェクトをセカンダリ ディスプレイで引き続き実行したい状況があります。この状況では、はまだスタックにありますが、現在はスタックの一番上にあります。Activity XActivity YActivity XActivity Y

問題は、Activity Y起動時に物理セカンダリ ディスプレイがミラーリングに戻ることです。を終了すると、PresentationActivity Yの内容Activity X'sが戻ります (呼び出しdismiss()たことがないため)。

問題は、下位のアクティビティがローカル デバイスで実行されている場合でも、そのディスプレイで実行されているセカンダリ ディスプレイに接続されたプレゼンテーションを維持するにはどうすればよいかということです。

更新:Presentationこれを行う方法の 1 つは、バックグラウンド スレッドからオブジェクトをインスタンス化することです。その後、別のものを作成Activityしても、バックグラウンド スレッドによってそのPresentationオブジェクトに書き込まれているコンテンツに干渉してはなりません。しかし、バックグラウンド スレッドから UI を更新することは通常許可されていないため、これが機能するかどうかはわかりません。

Activityもう 1 つの方法は、可能であれば、下位の によるセカンダリ ディスプレイの使用を無効にすることです。これにより、新しいディスプレイActivityがアクティブになったときにセカンダリ ディスプレイがミラーリングに戻らないようにします。しかし、私はこれを行う方法も見つけていません。ご提案いただきありがとうございます。

4

2 に答える 2

2

@CommonsWare によって提案されたアプローチの 1 つを実装しました (そして、彼のブログでの私の質問への回答として Mark Allison によって独立して)。ご提案いただきありがとうございます。

振り返ってみると、問題はActivity、ローカル デバイスでの呼び出しにまたがって、バックグラウンドでセカンド スクリーン プレゼンテーションを実行し続けることができなかったことです。これは、Presentationクラスが のサブクラスとして実装され、インスタンスDialogに関連付けられているためです。Activityそのため、新しいActivity画面が起動すると、2 番目の画面はミラーリングに戻りました (専用に生成した他のコンテンツを表示する代わりに)。

解決策は、すべての「下位」ActivitiesFragments元のActivity画面 (つまり、2 番目の画面を起動した画面) にリファクタリングすることでした。次に、 を呼び出す代わりに、を使用しstartActivity()て新しいものを開始/停止します。最終的な効果は、プレゼンテーションを開始したアクティビティがまだ実行されているため、新しいアクティビティが開始されてもセカンダリ ディスプレイが中断されなくなります。FragmentsFragmentTransactions

Activity私のケースは、トップレベル(2 番目の画面を開始する) が実際にはandSherlockFragmentActivityを使用する であるという事実によってさらに複雑になりました。また、タブ、メニュー項目、およびホーム アイコンを明示的に管理する必要がありました。ViewPagerFragmentStatePagerAdapterFragmentActionBar

全体的に、コードの透明性が少し低いと思います...しかし、機能します!

注: Google がセカンダリ スクリーン インターフェースを実装しているのは良いことです。しかし、なぜ彼らがそうしたのかはわかりません。Presentationクラスを に押し込むのではなく、バックグラウンドで簡単に実行できる、つまりデバイスDialogのフォアグラウンドに関係なく、より一般的なソリューションを提供できればよかったでしょう。Activitiesこのようなソリューションがあれば、前述のように、多くのコード リファクタリングから解放されたはずです。

于 2013-03-01T15:50:14.500 に答える
1

この質問を死からよみがえらせ、いつか同じ問題を抱えている人を助けたいと思っています。

私は最近、はるかに深い、しかし同様の問題に陥りました。システムのどこにでもプレゼンテーションを表示する必要があり(私は組み込みのアンドロイドで作業しています)、メイン画面では任意のアプリを使用できました。

最初に考えたのは、プレゼンテーションの表示を管理し、アプリケーションの起動時に初期化されるサービスを作成することでした。しかし、問題は、あなたが言及したように、ダイアログから継承し、ダイアログを構築するときにgetApplicationContext()を呼び出すときに発生するのと同じ問題が発生したため、プレゼンテーションを表示できなかったことです。

私の解決策は次のとおりです。Low Batteryアラートダイアログのようなアラートを表示するために使用されるTYPE_SYSTEM_ALERTと呼ばれるWindowManager.LayoutParamがあります。このプロパティを使用すると、サービスからダイアログを作成して適切に表示できます。プレゼンテーション クラスはダイアログの子であるため、このプロパティを設定するだけで機能します。

ここで魔法が起こります:

 WindowManager.LayoutParams l = mPresentation.getWindow()
                    .getAttributes();
 l.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
 mPresentation.show();

これを実現するには、アプリケーション XML に SYSTEM_ALERT_WINDOW 権限が必要です。

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

これで問題も解決すると思いますが、少しデリケートであり、必要に応じてすぐにプレゼンテーションを停止するための適切な治療が必要です.

于 2015-10-21T20:14:36.153 に答える