天天看點

安卓8.0系統通知NotificationManager

開始

從Android 8.0開始,使用系統通知Notification需要再設定下Channel,這就導緻了版本相容問題.為了解決這個,抽空寫了個工具類,實作8.0系統上下都可實作正常通知功能.

原型

以今日頭條為例,每次打開應用時,通知欄都會顯示今天比較火的新聞,并且會顯示一張隐藏的圖檔,具體效果如下2張:

安卓8.0系統通知NotificationManager

通知合并時

安卓8.0系統通知NotificationManager

通知展開時

實作

我覺得還是直接上代碼比較好,沒有使用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原生系統上的兩張顯示效果:

安卓8.0系統通知NotificationManager

通知合并時

安卓8.0系統通知NotificationManager

通知展開時

題外話

發現竟然有很多同學不知道怎麼制作通知欄圖示,實際上AS提供了很完善的一套圖示制作工具Image Asset用來制作App的各種圖示.怎麼用?在任何一個drawable檔案夾上右鍵New->Image Asset彈出如下提示框:

安卓8.0系統通知NotificationManager

通知欄圖示制作

根據你的需求你可以制作出任何你想要的并且符合app規範的圖檔.

項目位址:

https://github.com/afterschoolkido/Android_Notification_Compatible

推薦閱讀

1-AOSP源碼Gallery2和Launcher3導入Android Studio

2-5分鐘适配Android P和Android 8.0劉海屏,可能全網最全總結

繼續閱讀