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)