Android 5.0通知遇到的問題及原因
來自: http://blog.csdn.net/qq_17766199/article/details/49778339
首先是發送普通通知的一段代碼。
public void send(String string) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("標題");// 設置通知欄標題
mBuilder.setSmallIcon(R.drawable.ic_launcher);// 設置通知小ICON
mBuilder.setContentText(string + "點擊查看。");
mBuilder.setTicker(string); // 通知首次出現在通知欄,帶上升動畫效果的
mBuilder.setWhen(System.currentTimeMillis());// 通知產生的時間,會在通知信息里顯示,一般是系統獲取到的時間
Notification notification = mBuilder.build();//API 16
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationManager.notify(1, notification);
}</pre> <br />
在Android 5.0以下版本,icon可以正常顯示,但是在5.0以上版本中,icon顯示為白塊。
隨后百度這個問題找到一個網址:點擊打開鏈接
大體意思是在5.0中,對于設計風格有了統一的要求。
引用原文:簡單的說就是5.0后Android官方建議不要為通知的圖標添加任何額外的透明度,漸變色,不要企圖用顏色將通知圖標與其他應用,比如系統應用,應用的通知圖標只能是在透明的背景上有白色的圖案。至于原因,文檔并沒有細說,只是提到5.0系統將會在底層處理圖標,想知怎么處理的可以參考Android SDK API level 21后的Notificaiton源碼,里面寫的較詳細。可以參考:點擊打開鏈接

知道了問題的解決方法后,做了修改。如下(終極版):
public void send(String string) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,intent, 0);
mBuilder.setContentIntent(pendingIntent);// 設置通知欄點擊意圖
mBuilder.setContentTitle("標題");// 設置通知欄標題
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//懸掛式Notification,5.0后顯示
mBuilder.setContentText(string + "點擊查看。").setFullScreenIntent(pendingIntent, true);
mBuilder.setCategory(NotificationCompat.CATEGORY_MESSAGE);
mBuilder.setSmallIcon(R.drawable.jingbao1);// 設置通知小ICON(5.0必須采用白色透明圖片)
}else{
mBuilder.setSmallIcon(R.drawable.ic_launcher);// 設置通知小ICON
mBuilder.setContentText(string );
}
mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.jing_6));// 設置通知大ICON
mBuilder.setTicker(string + "有警報!"); // 通知首次出現在通知欄,帶上升動畫效果的
mBuilder.setWhen(System.currentTimeMillis());// 通知產生的時間,會在通知信息里顯示,一般是系統獲取到的時間
mBuilder.setPriority(NotificationCompat.PRIORITY_MAX); // 設置該通知優先級
mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);//在任何情況下都顯示,不受鎖屏影響。
mBuilder.setAutoCancel(true);// 設置這個標志當用戶單擊面板就可以讓通知將自動取消
mBuilder.setOngoing(false);// ture,設置他為一個正在進行的通知。他們通常是用來表示一個后臺任務,用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設備(如一個文件下載,同步操作,主動網絡連接)
// 向通知添加聲音、閃燈和振動效果的最簡單、最一致的方式是使用當前的用戶默認設置,使用NotificationCompat.DEFAULT_ALL屬性,可以組合
mBuilder.setVibrate(new long[] { 0, 100, 500, 100 });//振動效果需要振動權限
mBuilder.setSound(Uri.parse("android.resource://" + getPackageName()//聲音
+ "/" + R.raw.notification_alarm));
mBuilder.setDefaults(NotificationCompat.DEFAULT_LIGHTS);//閃燈
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//Notification notification = mBuilder.getNotification();//API 11
Notification notification = mBuilder.build();//API 16
mNotificationManager.notify(1, notification);
}</pre> <br />
以上列舉了常用的通知設置介紹。
如果你按照上面的進行了修改,結果成功,那么恭喜你!,如果你發現沒有效果,那么只能說點背(我就是)。
問題出在了哪里?
其實代碼方面沒有任何問題,只是現在國產手機都有自己的定制化UI,在我的手上有兩款手機,一款是華為的EMUI,一款是樂視的
EUI。這兩個對于通知都有自己的管理,基本的管理有優先級、是否允許、是否懸浮顯示通知。如下圖:

所以在上面的代碼中,設置通知優先級、懸浮、顯示的權限(不受鎖屏限制)等這些設置會無效。
這些的實現需要用戶自己在設置里進行管理設置。
甚至在樂視的手機上,設置的小圖,大圖都會失效。最后發現樂視的EUI會對常用的app(qq,微信等)進行適配在UI中提供小圖。
(例如美團在華為的顯示正常,但是樂視就。。)
最后再說說小圖的尺寸:
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
xxhdpi @ 24.00dp = 72.00px