首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >收到gcm推送通知时刷新活动

收到gcm推送通知时刷新活动
EN

Stack Overflow用户
提问于 2014-03-07 21:56:46
回答 7查看 36.7K关注 0票数 52

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

How to refresh activity on receiving gcm push notification if my app is .我有一个包含列表视图的活动,其中填充了来自服务器的数据。如果我收到gcm推送通知(也包含一些数据),我想刷新我的活动(在这里向listview添加另一个项目)。

  • 一种替代方法是添加timer,它定期执行服务器请求并更新列表适配器数据,但我不需要这些,因为它将占用大量资源。
  • 我是否需要添加broadcast receiver,它将在接收到gcm推送时触发,从而进一步请求更新服务器数据并更新我的活动UI?

亲爱的评论员,请仔细阅读问题,我只需要刷新列表(如果应用程序是打开的,并且该特定活动是打开的),否则不需要相同的

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-04-23 02:59:53

我花了几个小时才弄明白。在这里发帖,以防其他人也有同样的问题。

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

代码语言:javascript
复制
//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
    }
};

上面的代码放在你想要“监听”事件的活动中。

现在,我们如何向这个“监听器”发送数据呢?转到您的推送通知处理程序(或从您想要更新活动的位置),当您收到通知时,调用此函数:

代码语言:javascript
复制
// 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/

票数 142
EN

Stack Overflow用户

发布于 2014-03-12 21:54:21

我假设你的GCMBroadcastReceiver在它自己的.java文件中?

至于刷新活动,我也想知道这个问题的答案。

但是要知道某个特定的活动是否处于活动状态,这意味着在屏幕上只需添加一个boolean (类似于" active "),并在活动的onResume()事件中将其设置为true,在onPause()事件中将其设置为false

代码语言:javascript
复制
protected void onResume()
{
    super.onResume();

    active = true;;
}

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

    active = false;
}

您的active变量将是一个布尔值,即globalstatic。这样你就可以知道某个特定的活动是否在“前面”。

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2015-10-09 19:03:02

对于“接收gcm推送通知时的刷新活动”,accept答案确实是正确的(我也对其进行了提升)。但是,如果您只想更新正在显示的ListView,则不需要广播接收器。

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

然后,您可以依靠ContentResolver上的notifyChange方法来完成此任务。

通知已注册的观察者一行已更新。要注册,请调用registerContentObserver()。默认情况下,CursorAdapter对象将收到此通知。如果syncToNetwork为true,这将尝试使用为所提供的uri的授权注册的同步适配器来安排本地同步。不会将任何帐户传递到同步适配器,因此将同步所有匹配的帐户。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22252065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档