在接收gcm推送通知时刷新活动
如果我的应用程序处于打开状态,如何刷新 接收gcm推送通知的活动。 我有一个活动,其中包含从服务器填充数据的列表视图。 如果我收到gcm推送通知(也包含一些数据),我想刷新我的活动( 这里再添加一个项目到列表视图 )。
- 一种替代方法是添加定时器 ,定期做服务器请求和更新列表适配器数据,但我不想要这些,因为它会花费很多资源。
- 我是否需要添加广播接收器 ,这将触发接收gcm推进哪些进一步请求更新的服务器数据和更新我的活动用户界面?
亲爱的评论者,请仔细阅读这个问题,我只需要刷新列表 (如果应用程序是打开的,特定的活动是开放的), 否则不需要相同的 。
花了我几个小时弄清楚。 在这里发帖,以防其他人有同样的问题。
这个想法是,你必须注册你的活动作为广播接收器。 最简单的方法是这样的:
//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”的库。 它实际上是相同的事情,但更容易,“广播事件”,尽pipe应用程序。 这是一个链接http://square.github.io/otto/
我假设你的GCMBroadcastReceiver
是在它自己的.java文件中?
就清新活动而言,我也想知道这个问题的答案。
但是为了知道一个特定的活动是否活动,屏幕上的含义只需添加一个boolean
(称之为“活动”),并在您的活动的onResume()
事件中将其设置为true
,并在onPause()
事件中将其设置为false
:
protected void onResume() { super.onResume(); active = true;; } protected void onPause() { super.onPause(); active = false; }
你的active
variables是一个global
或static
的布尔值。 这样你就知道某个活动是否在“前台”。
希望有点帮助。
接受的答案确实是正确的“刷新活动接收gcm推送通知”(我也赞成)。 但是,如果您只想更新正在显示的ListView,则不需要广播接收器。
您的GCM侦听器服务可以使用ContentProvider更新数据库,而不是插入直接的SQL查询。
然后,您可以依靠ContentResolver上的notifyChange方法来执行此操作。
通知注册观察员一行已更新。 要注册,请调用registerContentObserver()。 默认情况下,CursorAdapter对象会得到这个通知。 如果syncToNetwork为true,则会尝试使用为所提供的uri的权限注册的同步适配器来安排本地同步。 没有帐户将被传递到同步适配器,所以所有匹配的帐户将被同步。
如果您的应用程序已经在运行,则尝试覆盖onNewIntent
方法
似乎有一个更简单的方法。 在GCM Listener的OnMessageReceived方法中,您可以从那里执行更新,而不是发送通知。 您可以使用您在处理通知时使用的相同代码。 如果您从侦听器执行StartActivity,则必须使用ActivityFlags.NewTask标志。
总结一句:如果你想刷新活动, 当通知到达时 广播你的自定义事件,并注册你的活动作为该事件的广播接收器
Intent notificationIntent = new Intent(context, MainActivity.class); notificationIntent.setAction(Long.toString(System.currentTimeMillis())); PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);