1. 程式人生 > >Android通知欄(Notification)介紹及使用

Android通知欄(Notification)介紹及使用

在使用手機時,我們常常會碰到各種通知,例如微信,頭條,UC等,天天不厭其煩的給你各種推送,當然了我們今天不講推送,我們講講通知欄的構建和使用,以及自定義通知欄的佈局和使用方法

構建一個通知欄一般分為這幾個步驟:

1.建立通知欄管理工具
2.構建通知欄構造器
3.給構造器設定引數
4.傳送請求

具體程式碼如下:

       /**
         *  建立通知欄管理工具
         */

        NotificationManager notificationManager = (NotificationManager) getSystemService
                (NOTIFICATION_SERVICE);

        /**
         *  例項化通知欄構造器
         */
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); /** * 設定Builder */ //設定標題 mBuilder.setContentTitle("我是標題") //設定內容 .setContentText("我是內容") //設定大圖示 .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) //設定小圖示
.setSmallIcon(R.mipmap.ic_launcher_round) //設定通知時間 .setWhen(System.currentTimeMillis()) //首次進入時顯示效果 .setTicker("我是測試內容") //設定通知方式,聲音,震動,呼吸燈等效果,這裡通知方式為聲音 .setDefaults(Notification.DEFAULT_SOUND); //傳送通知請求
notificationManager.notify(10, mBuilder.build());

因為我在程式碼中註釋的比較清楚,這裡就不一一贅述了

華為手機
小米手機
顯然直接使用原生的通知欄會在不通順手機上顯示不同效果,無法形成統一性,也不是特別美觀,所以我們需要自定義通知欄

自定義通知欄和使用原生的通知欄區別不大,最主要就是增加了自定義的佈局,使用RemoteViews承接,並放入構造器中顯示,具體程式碼如下

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
        RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_notification);
        NotificationManager notificationManager = (NotificationManager) getSystemService
                (NOTIFICATION_SERVICE);
        mBuilder.setSmallIcon(R.mipmap.timg);
        mBuilder.setContent(remoteViews);
        if (progress == 1) {
            mBuilder.setDefaults(Notification.DEFAULT_SOUND);
        }
        remoteViews.setImageViewResource(R.id.image, R.mipmap.timg);
        remoteViews.setTextViewText(R.id.title, "我是標題");
        remoteViews.setTextViewText(R.id.content, "我是內容");
        remoteViews.setProgressBar(R.id.pBar, 10, progress, false);
        remoteViews.setTextViewText(R.id.proNum, progress + "/10");
        notificationManager.notify(10, mBuilder.build());

自定義標題欄

點選跳轉到其他頁面:

   Intent intent = new Intent(this, SecondeActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        mBuilder.setContentIntent(pendingIntent);

到此,具體工作就已經完成的差不多了,你會用了嗎,當然還有很多知識點,想學更多的還有可以去看具體原始碼

遇到的問題:
(1)
在Android O及以上版本報Developer warning for package “”
Failed to post notification on channel “null”
see log for more details 錯誤,錯誤原因是因為在8.0以上需要增加渠道名稱和渠道ID,具體程式碼如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(id, name, NotificationManager
                    .IMPORTANCE_DEFAULT);
            mBuilder.setChannelId(id);
            notificationManager.createNotificationChannel(channel);

            mBuilder.setSmallIcon(R.mipmap.timg);
            mBuilder.setContent(remoteViews);
            if (progress == 1) {
                mBuilder.setDefaults(Notification.DEFAULT_SOUND);
            }
            remoteViews.setImageViewResource(R.id.image, R.mipmap.timg);
            remoteViews.setTextViewText(R.id.title, "我是標題");
            remoteViews.setTextViewText(R.id.content, "我是內容");
            remoteViews.setProgressBar(R.id.pBar, 10, progress, false);
            remoteViews.setTextViewText(R.id.proNum, progress + "/10");
            notificationManager.notify(10, mBuilder.build());
        }

(2)mBuilder.setSmallIcon()是必須要加上的,這個是顯示在頂部狀態列中的小圖示,如果未加這個圖示程式將會閃退,並報以下錯誤
java.lang.IllegalArgumentException: Invalid notification (no valid small icon): Notification(pri=0 contentView=cm.cui.testnotification/0x7f09001d vibrate=null sound=default defaults=0x1 flags=0x0 color=0x00000000 vis=PRIVATE)