android 8.0 notification通知適配踩坑
老專案通知這塊要適配8.0, 所以按照老套路 開啟百度 深入andoid notificion 8.0 ctrl c and ctrl+v 一頓熟悉的操作, 然後測試執行專案 ! 尼瑪, 不行!! 在8.0上不行 ,心裡一頓的問候, 然後開始網上各種解決辦法對比,自己的程式碼跟別人說的一樣啊 加一個channel就可以了啊 為什麼就是不行呢, 然後對比官網的api做法也是一樣啊, 查了好久就是沒有找到原因,尼瑪 心態崩潰有木有! 對於我這種自卑心態的人讓我一度懷疑人生!
心裡想不行! 不能被這點問題打敗,收拾下心情,再搜下官方demo吧,把demo拿來用用 ,於是拿來demo 一執行竟然可以,! 程式碼什麼的 我寫的和官網一樣啊 為什麼我的不行 沒天理啊 有木有! 以下是官網程式碼:
class NotificationHelper extends ContextWrapper { private NotificationManager manager; public static final String PRIMARY_CHANNEL = "default"; public static final String SECONDARY_CHANNEL = "second"; @RequiresApi(api = Build.VERSION_CODES.O) public NotificationHelper(Context ctx) { super(ctx); NotificationChannel chan1 = new NotificationChannel(PRIMARY_CHANNEL, "ff", NotificationManager.IMPORTANCE_DEFAULT); chan1.setLightColor(Color.GREEN); chan1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); getManager().createNotificationChannel(chan1); } @RequiresApi(api = Build.VERSION_CODES.O) public Notification.Builder getNotification1(String title, String body) { return new Notification.Builder(getApplicationContext(), PRIMARY_CHANNEL) .setContentTitle(title) .setContentText(body) .setSmallIcon(getSmallIcon()) .setAutoCancel(true); } public Notification.Builder getNotification2(String title, String body) { return new Notification.Builder(getApplicationContext(), SECONDARY_CHANNEL) .setContentTitle(title) .setContentText(body) .setSmallIcon(getSmallIcon()) .setAutoCancel(true); } public void notify(int id, Notification.Builder notification) { getManager().notify(id, notification.build()); } private int getSmallIcon() { return android.R.drawable.stat_notify_chat; } private NotificationManager getManager() { if (manager == null) { manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } return manager; } }
我的程式碼:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { createNotifactionChannel(); } Intent it = new Intent(this, TestNoticon1.class); // Notification.Builder notifaction = createNotifaction("fuck title", "this is the fuck the message f", null); Notification.Builder notification1 = getNotification1("fuck", "dfadfasdfadsfadf"); getNotiManger().notify(1, notification1.build()); private void createNotifactionChannel() { NotificationChannel channel = new NotificationChannel("p9", "chanel2", NotificationManager.IMPORTANCE_DEFAULT); channel.setLightColor(Color.RED); channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); getNotiManger().createNotificationChannel(channel); Log.e("zyh", "------createChannel---"); } @RequiresApi(api = Build.VERSION_CODES.O) private Notification.Builder createNotifaction(String title, String content, Intent it) { Notification.Builder builder = new Notification.Builder(getApplicationContext(), "fss") .setContentTitle(title) .setContentText(content) .setSmallIcon(android.R.drawable.stat_notify_chat) .setAutoCancel(true); if (it != null) { PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, it, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); } return builder; }
程式碼基本是複製的, 什麼 “基本”!! 本著嚴謹的科學態度, 我決定一行程式碼一行程式碼的去對比,,,,
經過對比發現 在new Notification.Build(string id, string channelid)時, 當channele為 “deafult" 和”second‘時 在8.0可以成功釋出通知!!! 為什麼為什麼!!! 難道就只能用這兩個固定了,這也太違揹人道主義精神了吧!! 然後去看api文件, 但是官方文件都沒有明確說明必須用這兩個作為channel啊 !!! 問題出在哪裡呢 ::
冷靜一下, 然後想到 設定channel的時候,指定了一個id,這個id 和builder建構函式中的id, 需要一樣,才可以!!!!
問題就出在這裡, new NotificationChannel(channel_id,chanel_name,improtance)
new Notification.Builder(context,channel_id) 這兩個id 需要保持一致!!!!! 我tm真是笨啊!! Google文件也沒說要保持一樣啊!!!! 。。。。。。。。
Notification.Builder.(context,id)在8.0下 會報錯, 要做相容處理,或者使用NoticationCompat.Builer (context,id)處理相容問題