如果我的应用打开,接收gcm推送通知的刷新活动。我有一个活动,其中包含从服务器填充数据的列表视图。我想刷新我的活动( 这里再添加一个项目到listview ),如果我收到gcm推送通知(其中也包含一些数据)。
亲爱的评论员,请仔细阅读问题,我只需刷新列表(如果应用已打开且特定活动已开启)其他不需要相同
答案 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
变量将是global
或static
的布尔值。通过这种方式,您可以了解特定活动是否位于" 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);