0

2 つのボタンを持つ「A」というアクティビティがあります。各ボタンは他の新しいアクティビティ「B」と「C」を開き、アクティビティ「A」は onPause 状態にあります。アクティビティ「C」には、3 ページのビューページャーがあります

このアプリは通知を受け取ることができます。

受信した通知をクリックして、アクティビティ「C」を開きます。

これは次のように正しく機能します。

//...
    NotificationManager notificationManager =(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); 
...
Intent intent =new Intent(getApplicationContext(), activityC.class);
        intent.putExtra("hello", notificationData);

これは私の問題です:

受信した通知をクリックしたときに、アプリケーションがアクティビティ「A」または「B」を表示している場合、またはアプリケーションがバックグラウンドにある場合は、アクティビティ「C」を閉じて開く必要があります

アプリケーションがアクティビティ「C」を表示している場合、ViewPager のページにつながります ( pager.setCurrentItem (2);)

私が読んでいる数日、android:launchMode="singleTop"定義を使用していくつかの方法を試しましFLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP and FLAG_ACTIVITY_SINGLE_TOPた...しかし、常に成功しません

私はこれで夢中になります...

誰かが私を助けることができますか?

前もって感謝します!

4

2 に答える 2

0

あなたがする必要があるのは、最後にどこにいたかを定義することです。これが私がこれを処理する方法です:

クラスを作成し、アプリケーションクラスから拡張します

ここで変数を定義します。ブール値、列挙型、int などにすることができます。これらのアクティビティのいずれかを入力するときに、そのパラメーターを変更します。

各アクティビティの OnDestroy で、その特定の変数をデフォルト値にリセットします。

意図を作る前のサービスでは、最終的にどのような状態であったかを確認し、それに基づいて意図を作ります。

public class MY_APPLCIATION extends Application {
    public static Boolean ActivityAIsRunning=false;
    public static Boolean ActivityBIsRunning=false;
}

両方のアクティビティの onResume と onDestroy をオーバーライドします。

public class ActivityA extends AppCompatActivity {
    // ......
    @Override
    protected void onDestroy() {
        super.onDestroy();
        MY_APPLCIATION.ActivityAIsRunning=false;
    }

    @Override
    protected void onResume() {
        super.onResume();
        MY_APPLCIATION.ActivityAIsRunning=true;
    }
}

アクティビティ B :

public class ActivityB extends AppCompatActivity {
    // ......
    @Override
    protected void onDestroy() {
        super.onDestroy();
        MY_APPLCIATION.ActivityBIsRunning=false;
    }

    @Override
    protected void onResume() {
        super.onResume();
        MY_APPLCIATION.ActivityBIsRunning=true;
    }
}

ここで、注意を払うべき重要な注意事項があります。

通知を作成するときにインテントを定義する必要があります。

別のアクティビティが必要です (それを MY_NOTIFICATION_ACTIVITY と呼びましょう)。通知は常にこのアクティビティに送られる必要があります。そのアクティビティで、どのブール値が設定されているかを確認し、目的のアクティビティ (ActivityA または ActivityB または ActivityC) を呼び出します。マニフェストで ActivityB も singleTop にする必要があることを忘れないでください!!!

*** 別の簡単な方法

もう 1 つの簡単な方法は、各アクティビティの OnResume で通知を更新することです。各活動を入力することで、意図を目的の活動に変更し、同じ通知を行い、最後の通知を更新します。

于 2016-06-05T04:06:44.900 に答える
0

C からアクティビティを起動するのではなく、アクティビティ A が受信する通知がクリックされたときにブロードキャストを送信し、次に A がアクティビティ C を起動します。

アクティビティ C に FLAG_ACTIVITY_SINGLE_TOP を設定して、C が既に top にある場合にインテントを受け取るようにすることができます。

于 2013-07-30T08:31:01.183 に答える