接收gcm推送通知时刷新活动

时间:2014-03-07 13:56:46

标签: android listview android-activity google-cloud-messaging

  

更新: GCM已弃用,请使用FCM

如果我的应用打开接收gcm推送通知刷新活动。我有一个活动,其中包含从服务器填充数据的列表视图。我想刷新我的活动( 这里再添加一个项目到listview ),如果我收到gcm推送通知(其中也包含一些数据)。

  • 另一种方法是添加 计时器 ,定期执行服务器请求并更新列表适配器数据,但我不想要这些,因为它需要很多资源。
  • 我是否需要添加 广播接收器 ,这会在接收gcm push时触发,这会进一步请求更新的服务器数据并更新我的活动用户界面?

亲爱的评论员,请仔细阅读问题,我只需刷新列表(如果应用已打开且特定活动已开启)其他不需要相同

7 个答案:

答案 0 :(得分:140)

花了我几个小时来搞清楚。发布此处以防任何其他人遇到同样的问题。

您的想法是您必须将您的活动注册为广播接收器。最简单的方法是:

//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);
}

当您调用上述功能时,您的活动应该会收到它。

注意:您的活动必须正在运行/打开才能接收广播意图

Note2 :我切换到名为“otto”的库。实际上它确实是同样的事情,但更容易,“广播事件”在整个应用程序。这是一个链接http://square.github.io/otto/

答案 1 :(得分:3)

我假设您的GCMBroadcastReceiver在其自己的.java文件中?

就清新活动而言,我也想知道这个问题的答案。

但是,要了解特定活动是否有效,请在屏幕上添加boolean(称之为"有效")并将其设置为true in您的活动的onResume()活动以及false活动中的onPause()

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

    active = true;;
}

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

    active = false;
}

您的active变量将是globalstatic的布尔值。通过这种方式,您可以了解特定活动是否位于" front"。

希望有所帮助。

答案 2 :(得分:2)

对于接收gcm推送通知的"刷新活动,接受答案确实是正确的" (我也赞成过它)。但是,如果您只想更新正在显示的ListView,则不需要广播接收器。

您的GCM侦听器服务可以使用ContentProvider更新数据库,而不是插入直接的SQL查询。

然后你可以依靠ContentResolver上的notifyChange方法来实现这一目的。

  

通知已注册的观察员一行已更新。要注册,请致电   registerContentObserver()。默认情况下,CursorAdapter对象将获得   这个通知。如果syncToNetwork为true,则会尝试   使用已注册的同步适配器安排本地同步   所提供的uri的权威。没有帐户会传递给同步   适配器,因此所有匹配的帐户都将同步。

答案 3 :(得分:1)

如果您的应用已在运行,请尝试覆盖onNewIntent方法

答案 4 :(得分:0)

似乎有一种更简单的方法。在GCM侦听器的OnMessageReceived方法中,您可以从那里进行更新,而不是发送通知。您可以使用在处理通知时使用的相同代码。如果您从侦听器执行StartActivity,则必须使用ActivityFlags.NewTask标志。

答案 5 :(得分:0)

用一句话概括: 如果您想刷新活动,广播您的自定义事件,当通知到达注册您的活动 该事件的广播接收器

答案 6 :(得分:-4)

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));
PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);