2014-09-18 83 views
2

如果我的應用程序處於活動狀態,我希望在收到GCM時在當前活動中顯示彈出窗口。GCM IntentService如何在通知上顯示彈出窗口

我想訪問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的,我想我添加一個對話框與自定義佈局彈出的所有活動延伸:

@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")); 
} 

回答

1

那麼,你可以使用LocalBroadcast。請參閱LocalBroadcast Manager。 關於如何實施,how to use LocalBroadcastManager?有一個很好的例子。

LocalBroadcast Manager是註冊併發送Intents廣播到您的過程中的本地對象的助手。您正在播放的數據不會離開您的應用程序,因此不需要擔心泄露私人數據。'

您的活動註冊了本地廣播。從服務中您發送LocalBroadcastonMessage(說,嘿,我收到一條消息,顯示它的活動)。然後在你的Activity裏面,你可以收聽廣播。這樣,如果活動處於最前沿/活躍狀態,它將接收廣播,否則它不會。因此,無論何時您收到本地廣播,您都可以在活動開放的情況下執行所需的操作。

如果您想爲整個應用程序做的,那麼你可以讓你所有的活動擴展一個抽象的活動。在這個抽象活動類中,你可以註冊這個'LocalBroadcast'。其他方法是在你的所有活動中註冊LocalBroadcast(但是你必須管理你將只顯示一次消息的方式)。

希望它可以幫助你。

+0

看起來不錯我馬上試試 – Labe 2014-09-18 21:34:28

+0

@labe酷。讓我知道事情的後續。 :) – 2014-09-19 03:59:02

+0

它運作良好 我用我的代碼更新問題 謝謝! – Labe 2014-09-19 10:06:10

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是一個常量,您應該定義某處