GCM IntentService如何在通知接收时显示弹出窗口

时间:2014-09-18 20:42:36

标签: android popup google-cloud-messaging

我希望在收到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"));
}

2 个答案:

答案 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是你应该在某处定义的常量