1

我爲GCM推送通知編寫了IntentService。 我收到消息,但顯示我的通知給用戶時出現了問題。 這裏是我的代碼:Android通知未顯示

import com.google.android.gms.gcm.GoogleCloudMessaging; 
import android.app.IntentService; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.app.TaskStackBuilder; 
import android.util.Log; 

public class GcmIntentService extends IntentService { 
    public static final int NOTIFICATION_ID = 1; 


    public GcmIntentService() { 
     super("GcmIntentService"); 
    } 

    public static final String TAG = "GCM test"; 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     String messageType = gcm.getMessageType(intent); 
     if (!intent.getExtras().isEmpty()) { // has effect of unparcelling Bundle 
      if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       sendNotification("Send error: " + intent.getExtras().toString()); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
       sendNotification("Deleted messages on server: " + intent.getExtras().toString()); 
       // If it's a regular GCM message, do some work. 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
       // Post notification of received message. 
       sendNotification("message:\n" + intent.getStringExtra("message")); 
       Log.i(TAG, "Received: " + intent.getExtras().toString()); 
      } 
     } 
     // Release the wake lock provided by the WakefulBroadcastReceiver. 
     GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    private void sendNotification(String msg) { 
     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.ic_notif) 
         .setContentTitle("My notification") 
         .setContentText(msg); 
     Intent resultIntent = new Intent(this, PopupMessageActivity.class); 
     TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
     stackBuilder.addParentStack(PopupMessageActivity.class); 
     stackBuilder.addNextIntent(resultIntent); 
     PendingIntent resultPendingIntent = 
       stackBuilder.getPendingIntent(
         0, 
         PendingIntent.FLAG_UPDATE_CURRENT 
       ); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager mNotificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
    } 
} 

我沒有看到這個錯誤。我的意思是,我複製了Androids developer guide的代碼。

此代碼所做的唯一事情就是在手機的通知欄中顯示小圖標(本例中爲「ic_notif」)。 但是沒有彈出給用戶的文本或通知。

我使用android-studio。 我的調試設備是一個帶有android 4.0.3(API 15)的huawai u8666e。 至少我想這個API級別是我的這個應用程序的最低要求。

+0

如果您拖動通知欄,該怎麼辦?文字是否顯示在那裏? 「不......通知......彈出」是什麼意思? –

+1

當我向下拖動通知欄時,文本正在顯示。這是一個正常的行爲爲Android?對不起,我是一名iPhone用戶,並且是android開發人員的新手。我認爲,如果你與建設者建立一個消息,就像在iOS屏幕上的彈出窗口... – user4878754

+0

是的,這是正常的和正確的。我會建議儘快閱讀更多有關Android UI設計模式的文章。這兩個系統之間有很多不同之處,Android用戶不想看到iOS設計模式(反之亦然)。我已經在下面解釋了一些。 –

回答

1

你看到的是正常設計的Android行爲在棒棒糖之前的版本。

設計邏輯是這種方法創建一個更乾淨的界面,並且不會通過在他們面前放置彈出框來中斷用戶的當前操作。 (有很多關於哪種方法更好的爭論 - iOS彈出窗口與Android通知)。

當創建Notification時,棒棒糖通過在設備窗口頂部創建一個小的彈出窗口來稍微改變這一點。


如果你真的想強制顯示一個彈出對話框,你應該看看設計一個「全屏」通知。

看到Android開發者文檔:

使用這種方法,你可以創建一個新Activity你想要的任何自定義佈局,並推出,與其把通知中狀態欄。

(全面實施的全屏通知將超出這篇文章的範圍)


我會建議不要強迫除了在極少數情況下,如鬧鐘全屏通知,或電話應用程序。相反,我會建議你堅持Android設計和操作系統的方式。

+1

感謝這個有用的答案。 – user4878754