1. 程式人生 > >android 8.0 notification通知適配踩坑

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)處理相容問題