我希望在收到GCM后,如果我的应用处于有效状态,则会在当前活动中显示一个Popup。
我想在GcmIntentService中访问我当前的活动,但我不认为这是可能的或继续进行的好方法......
任何人都可以帮助我吗?
解决方案
在我的GcmIntentService.java中:
@Override
protected void onHandleIntent(Intent intent) {
...
Intent broadCastIntent = new Intent("client_notifications_broadcast");
broadCastIntent.putExtra("data", extras.getString("other"));
LocalBroadcastManager.getInstance(this).sendBroadcast(broadCastIntent);
...
}
在我想要弹出窗口的所有活动扩展的MainActivity中,我添加了一个带有自定义布局的Dialog:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String dataString = intent.getStringExtra("data");
final Dialog dialog = new Dialog(ClientMainActivity.this);
dialog.setContentView(R.layout.custom_dialog_popup);
dialog.setTitle("Title...");
// set the custom dialog components - text, image and button
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Android custom dialog example!");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.ic_launcher);
TextView dialogButton = (TextView) dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
Log.d("receiver", "Got message: " + dataString);
}
};
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("client_notifications_broadcast"));
}
答案 0 :(得分:1)
好吧,你可以使用LocalBroadcast
。见LocalBroadcast Manager。
关于如何实现,how to use LocalBroadcastManager?有一个很好的例子。
LocalBroadcast Manager是一个帮助程序,用于注册和发送Intent广播到进程中的本地对象。您播放的数据不会离开您的应用,因此不必担心泄露私人数据。
您的活动会注册此本地广播。从服务中,您从LocalBroadcast
内发送onMessage
(说嘿,我收到了一条消息。显示它的活动)。然后在Activity
内,您可以收听广播。这样,如果活动处于最前面/处于活动状态,它将接收广播,否则它将赢得。因此,每当您收到本地广播时,如果活动开放,您可以执行所需的操作。
如果您想为整个应用程序做,那么您可以使所有活动扩展为抽象活动。在这个抽象活动课程中,你可以为这个' LocalBroadcast'注册它。其他方式是在您的所有活动中注册LocalBroadcast(但是您必须管理您只会如何显示消息一次)。
希望它对你有所帮助。
答案 1 :(得分:1)
我有这样的事情:
在您的GCM广播接收器中
Intent intent = new Intent(NOTIFICATION_ACTION);
intent.putExtra(EXTRA_PARAMETER, "something you want to pass as an extra");
context.sendBroadcast(intent);
在您的BaseActivity(由您想要显示弹出窗口的所有活动扩展的活动)
private BroadcastReceiver notificationBroadcastReceiver = new NotificationBroadcastReceiver();
@Override
protected void onStart() {
super.onStart();
IntentFilter intentFilter = new IntentFilter(NOTIFICATION_ACTION);
registerReceiver(notificationBroadcastReceiver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(notificationBroadcastReceiver);
}
private class NotificationBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Show popup
}
}
NOTIFICATION_ACTION是你应该在某处定义的常量