開始
從Android 8.0開始,使用系統通知Notification需要再設定下Channel,這就導緻了版本相容問題.為了解決這個,抽空寫了個工具類,實作8.0系統上下都可實作正常通知功能.
原型
以今日頭條為例,每次打開應用時,通知欄都會顯示今天比較火的新聞,并且會顯示一張隐藏的圖檔,具體效果如下2張:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9kleOhXQ65EMNRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwAzN4QTNwUTM0ETMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
通知合并時
通知展開時
實作
我覺得還是直接上代碼比較好,沒有使用markdown,看着比較亂,複制到AS中格式化一波
下面是工具類NotificationUtil:
public class NotificationUtil extends ContextWrapper {
private NotificationManager mManager;
public static final String sID = "channel_1";
public static final String sName = "channel_name_1";
public NotificationUtil(Context context) {
super(context);
}
public void sendNotification(String title, String content) {
if (Build.VERSION.SDK_INT >= 26) {
createNotificationChannel();
Notification notification = getNotification_26(title, content).build();
getmManager().notify(1, notification);
} else {
Notification notification = getNotification_25(title, content).build();
getmManager().notify(1, notification);
}
}
private NotificationManager getmManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
return mManager;
}
@RequiresApi(api = Build.VERSION_CODES.O)
public void createNotificationChannel() {
NotificationChannel channel = new NotificationChannel(sID, sName, NotificationManager.IMPORTANCE_HIGH);
getmManager().createNotificationChannel(channel);
}
public NotificationCompat.Builder getNotification_25(String title, String content) {
// 以下是展示大圖的通知
android.support.v4.app.NotificationCompat.BigPictureStyle style = new android.support.v4.app.NotificationCompat.BigPictureStyle();
style.setBigContentTitle("BigContentTitle");
style.setSummaryText("SummaryText");
style.bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.pic));
// 以下是展示多文本通知
android.support.v4.app.NotificationCompat.BigTextStyle style1 = new android.support.v4.app.NotificationCompat.BigTextStyle();
style1.setBigContentTitle(title);
style1.bigText(content);
return new NotificationCompat.Builder(getApplicationContext())
.setContentTitle(title)
.setContentText(content)
.setSmallIcon(R.drawable.ic_notification)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round))
.setStyle(style)
.setAutoCancel(true);
}
@RequiresApi(api = Build.VERSION_CODES.O)
public Notification.Builder getNotification_26(String title, String content) {
return new Notification.Builder(getApplicationContext(), sID)
.setContentTitle(title)
.setContentText(content)
.setSmallIcon(R.drawable.ic_notification)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round))
.setStyle(new Notification.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.pic)))
.setNumber(1)
.setAutoCancel(true);
}
}
使用方法:
NotificationUtil notificationUtils =new NotificationUtil(this);
notificationUtils.sendNotification(getString(R.string.title), getString(R.string.content));
效果
下面是在Android8.0原生系統上的兩張顯示效果:
通知合并時
通知展開時
題外話
發現竟然有很多同學不知道怎麼制作通知欄圖示,實際上AS提供了很完善的一套圖示制作工具Image Asset用來制作App的各種圖示.怎麼用?在任何一個drawable檔案夾上右鍵New->Image Asset彈出如下提示框:
通知欄圖示制作
根據你的需求你可以制作出任何你想要的并且符合app規範的圖檔.
項目位址:
https://github.com/afterschoolkido/Android_Notification_Compatible
推薦閱讀
1-AOSP源碼Gallery2和Launcher3導入Android Studio
2-5分鐘适配Android P和Android 8.0劉海屏,可能全網最全總結