1

我想說明一個通知像在我的應用程序下面的卡扣:如何顯示GCM推送通知的自定義用戶界面?

Push Notification

我已經通過this問題this Github上的問題了。它說你必須將你的數據作爲消息中的有效載荷發送到GCM服務器,並且當用戶點擊通知時,你可以通過意圖在應用中訪問這些數據。

我發送的信息是:

body: {"to":"\/topics\/global","data":{"LOL":"abc","LOL1":"xyz"},"notification":{"icon":"icon","title":"App Notification Title","body":"qwerty","click_action":"notification_click_action","sound":"default"}}

這是我的GCM監聽服務的代碼:

public class MyGcmListenerService extends GcmListenerService { 

    VolleySingleton mVolleySingleton; 
    ImageLoader mImageLoader; 
    Bitmap bitmap; 

    /** 
    * Called when message is received. 
    * 
    * @param from SenderID of the sender. 
    * @param data Data bundle containing message data as key/value pairs. 
    *    For Set of keys use data.keySet(). 
    */ 
    // [START receive_message] 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 

     Log.e("Message Received: ", from); 

     String title = data.getString("title"); 
     System.out.println("Title "+ data.toString()); 
     String subTitle = data.getString("subTitle"); 
     String expandTitle = data.getString("expandTitle"); 
     String imageUrl = data.getString("imageUrl"); 
     String action = data.getString("action"); 
     String offerAction = data.getString("offerAction"); 
     String offerImageUrl = data.getString("offerImageUrl"); 
     System.out.println(bundleToString(data)); 

     sendNotification(data); 
    } 

    @Override 
    public void onDeletedMessages() { 
//  sendNotification("Deleted messages on server"); 
    } 

    @Override 
    public void onMessageSent(String msgId) { 
//  sendNotification("Upstream message sent. Id=" + msgId); 
    } 

    @Override 
    public void onSendError(String msgId, String error) { 
//  sendNotification("Upstream message send error. Id=" + msgId + ", error" + error); 
    } 

    private void sendNotification(final Bundle data) { 

     if(data.getString("imageUrl") == null){ 
      sendNotification(data,null); 
     } else { 
      mVolleySingleton = VolleySingleton.getInstance(); 

      Handler uiHandler = new Handler(Looper.getMainLooper()); 
      uiHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        mImageLoader = mVolleySingleton.getImageLoader(); 
        mImageLoader.get(data.getString("imageUrl"), new ImageLoader.ImageListener() { 
         @Override 
         public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 

          if (response.getBitmap() != null) { 
           bitmap = response.getBitmap(); 
           sendNotification(data, bitmap); 
          } 
         } 

         @Override 
         public void onErrorResponse(VolleyError error) { 
          bitmap = null;/*BitmapFactory.decodeResource(getApplicationContext().getResources(), 
          R.mipmap.logo);*/ 
         } 
        }); 
       } 
      }); 

     } 
    } 

    private void sendNotification(Bundle data,Bitmap bitmap){ 

     String title = data.getString("title"); 
     String subTitle = data.getString("subTitle"); 
     String expandTitle = data.getString("expandTitle"); 
     String imageUrl = data.getString("imageUrl"); 
     String action = data.getString("action"); 
     String offerAction = data.getString("offerAction"); 
     String offerImageUrl = data.getString("offerImageUrl"); 
     long defaultId = Long.parseLong(data.getString("Id")); 
     long defaulttitleId = Long.parseLong(data.getString("titleId")); 
     long defaultTagId = Long.parseLong(data.getString("tagId")); 

     Log.d("Test321", "in MyGcmListenerService Id = " + defaultId + " PtitleId = " + 
       defaulttitleId + " TagId = " + defaultTagId); 

     int smallIconDrawable; 
     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 
      smallIconDrawable = R.mipmap.logo; 
     } else { 
      smallIconDrawable = R.mipmap.logo; 
     } 
     Intent intent; 
     Bundle bundle = new Bundle(); 

     if(defaultId != 0 && defaulttitleId != 0){ 
      Log.d("Test123","Push to 2page"); 
      intent = new Intent(this, DetailActivity.class); 
      bundle.putLong(KEY_ID,defaultId); 
      bundle.putLong(KEY_TITLE_ID, defaulttitleId); 
      bundle.putLong(KEY_TAGID, defaultTagId); 
      bundle.putLong("pushnotification",1); 
      intent.putExtras(bundle); 
     } else { 
      Log.d("Test123","push to mainactivity"); 
      intent = new Intent(this, MainActivity.class); 
     } 
     intent.putExtra("pushnotification",action); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
       PendingIntent.FLAG_ONE_SHOT); 
     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(smallIconDrawable) 
       .setLargeIcon(BitmapFactory.decodeResource(getApplication().getResources(),R.mipmap.logo)) 
       .setContentTitle(title) 
       .setContentText(subTitle) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 
     if(bitmap != null){ 
      notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap)); 
     }else{ 
      notificationBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(expandTitle)); 
     } 
     NotificationManager notificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

    } 

    public static String bundleToString(Bundle bundle) { 
     if (bundle == null) { 
      return null; 
     } 
     String string = "Bundle{"; 
     for (String key : bundle.keySet()) { 
      string += " " + key + " => " + bundle.get(key) + ";"; 
     } 
     string += " }Bundle"; 
     return string; 
    } 
} 

成功接收的消息,通知顯示,但不正是我想要的因爲onMessageReceived()未被調用。只有當用戶單擊我的活動中由GCM發送的默認通知時,我纔可以獲取作爲鍵值對傳遞的數據。我看到很多應用程序顯示自定義通知。那麼,必須有某種方式來實現這種通知?任何幫助表示讚賞。

+0

創建自己的通知,請按照下列[鏈接1](http://stackoverflow.com/questions/12803557/display-alert-when-push-arrives )和[link2](http://stackoverflow.com/questions/18307967/to-show-push-notification-content-into-the-alert-dialog-when-application-is-eith)。這些將幫助你 – Masum

+0

感謝您的這些。那麼,我不想彈出警報。我只想在通知區域中進行自定義通知。這兩個鏈接都描述瞭如何在通知到達時彈出警報。 – brainbreaker

回答

4

onMessageReceived不會被調用,因爲您的負載中有notification標記。

如果你想擁有自己的通知,你需要刪除它並只在有效載荷中發送數據。當你這樣做時,onMessageReceived將被調用,然後你將不得不使用Notification.Builder類來創建自己的通知。

如果你想要的東西超越了生成器,你可以通過閱讀​​3210