如果我的应用程序处于活动状态,我希望在收到GCM时在当前活动中显示一个弹出窗口。

我想在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"));
}

最佳答案

好吧,您可以使用LocalBroadcast。请参见LocalBroadcast Manager
关于如何实现,在how to use LocalBroadcastManager?上有一个很好的例子。


  LocalBroadcast Manager是一个助手,用于注册Intent广播并将其发送到流程中的本地对象。您正在广播的数据不会离开您的应用程序,因此无需担心泄漏私人数据。


您的活动注册了此本地广播。从服务中,您从LocalBroadcast内部发送一个onMessage(说,嘿,我收到了一条消息。显示它的活动)。然后在您的Activity中,您可以收听广播。这样,如果活动处于最前列/处于活动状态,它将接收广播,否则不会接收。因此,每当收到该本地广播时,如果活动处于打开状态,则可以执行所需的操作。

如果您想为整个应用程序做,则可以使所有活动扩展为抽象活动。在这个抽象活动类中,您可以为“ LocalBroadcast”注册它。另一种方法是在所有活动中注册LocalBroadcast(但随后您将不得不管理如何只显示一次消息)。

希望对您有帮助。

10-08 15:24