web-dev-qa-db-ja.com

GCMプッシュ通知の受信時のアクティビティの更新

Update:[〜#〜] gcm [〜#〜] は非推奨です。 [〜を使用してください#〜] fcm [〜#〜]

refreshアクティビティgcmプッシュ通知の受信アプリがの場合開いた。サーバーからのデータで満たされたリストビューを含むアクティビティがあります。 gcmプッシュ通知(データも含まれる)を受信した場合、アクティビティを更新したい(ここでもう1つのアイテムをリストビューに追加) 。

  • 1つの代替方法は、timerを追加することです。これは、定期的にサーバー要求を行い、リストアダプターデータを更新しますが、リソース。
  • broadcast receiverを追加する必要がありますか。gcmPushを受信するとトリガーされ、新しいサーバーデータをさらに要求し、アクティビティUIを更新しますか。

親愛なるコメンテーター、質問を注意深く読んでください、リストを更新するだけです(アプリが開いていて、特定のアクティビティが開いている場合)elseは必要ありません。

50
Amrit Pal Singh

それを理解するために数時間かかった。他の誰かが同じ問題を抱えている場合に備えて、ここに投稿します。

アイデアは、あなたの活動を放送受信機として登録しなければならないということです。これを行う最も簡単な方法は次のとおりです。

//register your activity onResume()
@Override
public void onResume() {
    super.onResume();
    context.registerReceiver(mMessageReceiver, new IntentFilter("unique_name"));
}

//Must unregister onPause()
@Override
protected void onPause() {
    super.onPause();
    context.unregisterReceiver(mMessageReceiver);
}


//This is the handler that will manager to process the broadcast intent
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // Extract data included in the Intent
        String message = intent.getStringExtra("message");

        //do other stuff here
    }
};

上記のコードは、イベントを「リッスン」するアクティビティに含まれています。

さて、この「リスナー」にデータを送信する方法を教えてください。プッシュ通知ハンドラー(またはアクティビティを更新する場所)に移動し、通知を受け取ったらこの関数を呼び出します。

// This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with
static void updateMyActivity(Context context, String message) {

    Intent intent = new Intent("unique_name");

    //put whatever data you want to send, if any
    intent.putExtra("message", message);

    //send broadcast
    context.sendBroadcast(intent);
}

上記の関数を呼び出すと、アクティビティがそれを受け取るはずです。

:ブロードキャストインテントを受信するには、アクティビティが実行中/開いている必要があります

注2:「otto」というライブラリに切り替えました。実際には同じことをしますが、アプリ全体で簡単に「イベントをブロードキャスト」します。ここにリンクがあります http://square.github.io/otto/

140
Arthur

私はあなたのGCMBroadcastReceiverがそれ自身の.Javaファイルにあると仮定していますか?

アクティビティを更新する限り、その質問に対する答えも知りたいと思います。

しかし、特定のアクティビティがアクティブかどうかを知るために、画面上でboolean(「アクティブ」のようなものを呼び出す)を追加し、アクティビティのonResume()trueに設定するだけです。イベント、およびonPause()イベントのfalseへ:

protected void onResume()
{
    super.onResume();

    active = true;;
}

protected void onPause()
{
    super.onPause();

    active = false;
}

active変数は、globalまたはstaticのブール値になります。これにより、特定のアクティビティが「前」にあるかどうかがわかります。

それが少し役立つことを願っています。

3
PaulG

「gcmプッシュ通知の受信時にアクティビティを更新する」の受け入れの答えは確かに正しいです(私もそれを支持しました)。ただし、表示されているListViewのみを更新する場合は、ブロードキャストレシーバーは必要ありません。

GCMリスナーサービスは、直接SQLクエリを挿入するのではなく、ContentProviderを使用してデータベースを更新できます。

その後、ContentResolverの notifyChange メソッドに依存してトリックを実行できます。

登録されたオブザーバーに行が更新されたことを通知します。登録するには、registerContentObserver()を呼び出します。デフォルトでは、CursorAdapterオブジェクトはこの通知を受け取ります。 syncToNetworkがtrueの場合、指定されたuriの権限に登録されている同期アダプターを使用してローカル同期をスケジュールしようとします。アカウントは同期アダプターに渡されないため、一致するすべてのアカウントが同期されます。

2
e4c5

アプリが既に実行されている場合は、onNewIntentメソッドをオーバーライドしてください

1
Amanni

一言で要約すると:アクティビティを更新する場合、broadcast your 通知が到着したときのカスタムイベントおよびregister your activity as broadcast receiverそのイベントの

0
Srneczek

もっと簡単な方法があるようです。 GCMリスナーのOnMessageReceivedメソッドでは、通知を送信する代わりに、そこから更新を行うことができます。通知を処理する場合に使用したのと同じコードを使用できます。リスナーからStartActivityを実行している場合は、ActivityFlags.NewTaskフラグを使用する必要があります。

0
fbs419