20

分割画面の使用中に、ユーザーが通知をクリックしたときに現在アクティブなウィンドウでAndroid N起動したいのですが、通知をクリックして起動すると、 Android Nは常に2 番目のウィンドウで起動します。activityactivity

NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.notification)
                        .setAutoCancel(false)
                        .setContentTitle("Demo Title")
                        .setContentText("Demo");

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("myIntent", "test");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pendingIntent);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Notification notification = mBuilder.build();

notification.flags = Notification.FLAG_NO_CLEAR;

mNotificationManager.notify(156, notification);

getintentより launch activity.

 Intent in = new Intent(MainActivity.this, SecondActivity.class);
 startActivity(in);

例 -最初のウィンドウに Chrome ブラウザ、2 番目のウィンドウに Facebookのようにフォアグラウンドに 2 つのアプリがあり、Chromeブラウザで何かを検索しているときに、この時点で の通知を受け取りGmailます。Facebookを置き換えて2番目のウィンドウでGmailアプリを開くよりもGmail通知をクリックすると、最初のウィンドウでアプリ通知がChrome(ユーザーとやり取りする人)を置き換えることを望みます。

4

3 に答える 3

5

それはいけません

Intentアプリが含まれていないタスク (他のアプリのマルチウィンドウ ウィンドウを含む) でアクティビティを開始するには、 で指定します。

考えられるシナリオがいくつかあります。

  1. 別のアクティビティからアクティビティを開始すると、前のアクティビティのタスク (およびウィンドウ) で開始されます。
  2. 別のウィンドウでアクティビティを開始するフラグをIntent.FLAG_ACTIVITY_LAUNCH_ADJACENT使用して、インテントにフラグを含めることができます。Intent.FLAG_ACTIVITY_NEW_TASKこれは、システムが既にマルチウィンドウ モードであり、保証されていない場合にのみ機能します。システムがフリーフォーム モード (分割画面ではなく) の場合、別のフリー フローティング ウィンドウでアクティビティを開始するように要求し、.setLaunchBounds()でサイズを指定することもできます。
  3. サービスはタスク内に存在できないため、サービスからアクティビティを開始します。Intent.FLAG_ACTIVITY_NEW_TASKフラグを指定する必要があり、システムはアクティビティの新しいタスクを開始します。
  4. 次のように、通知 (PendingIntent) からアクティビティを開始します。
    • すでに開始されているアクティビティにIntent移動して、その中でやりたいことを何でもできます。たとえば、 を使用して別のウィンドウでアクティビティを開始しますIntent.FLAG_ACTIVITY_LAUNCH_ADJACENT
    • アクティビティにタスク/ウィンドウがない場合、システムがアクティビティを開始する場所を選択しますが、それを制御することはできません。を使用してフリーフォーム モードでアクティビティを開始する場所を制御できます.setLaunchBounds()が、やりたいように別のアプリのウィンドウをハイジャックすることはできません。

つまり、新しいウィンドウを作成するか、既存のウィンドウを変更できます。他のアプリからウィンドウを取得することはできません。

でも主張するなら

分割画面マルチウィンドウで新しいアクティビティが画面のどちら側を占有するかを制御するには、新しいダミー アクティビティを作成します。開始する代わりにSecondActivity、ダミーのアクティビティを開始します。その中で、画面のどちら側で開始されたかを確認します。今考えられる 1 つの方法は、.getGlobalVisibleRect()を呼び出しViewて、値が画面全体のサイズとどのように比較されるかを確認することです。次の方法で画面サイズを取得できます。

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

キーボード サイズを検出するこのソリューションを適応させて、ウィンドウの位置を検出することもできます。しかし、それはさらにハッキーです。

目的の画面側にいる場合は、SecondActivity通常どおり起動しfinish()、ダミーを起動します。間違った側にいる場合は、Intent.FLAG_ACTIVITY_LAUNCH_ADJACENTフラグも使用すると、アクティビティは希望する側で開始され、ダミーのアクティビティは消えます。

これは汚いハックです。アクティビティを開始する場所をシステムに選択させることをお勧めします。

開いているブラウザを常に置き換えたい場合

次に、ブラウザでアプリを開くと、そのタスク(およびウィンドウ)が占有されます。これを行うにIntentは、ブラウザーが処理する でリンクを開き、そこからアプリを開くリンクにリダイレクトします。その方法の詳細については、アプリ リンクの処理ディープ リンクの有効化を参照してください。それはうまくいくはずです。

于 2016-09-22T14:59:37.783 に答える
1

この機能にはアクティビティを使用できません...

解決策は、アクティビティの代わりにフラグメントを使用することです...

必要なときにいつでもフラグメントを置き換えるだけです

于 2016-09-28T04:11:04.297 に答える