關(guān)于Android 通知

什么是通知渠道

每條通知都要屬于一個對應(yīng)的渠道逆趋。每個App都可以自由地創(chuàng)建當(dāng)前App擁有哪些通知渠道,但是這些通知渠道的控制權(quán)都是掌握在用戶手上的狭瞎。用戶可以自由地選擇這些通知渠道的重要程度今瀑,是否響鈴、是否振動拗引、或者是否要關(guān)閉這個渠道的通知借宵。Google這次對于8.0系統(tǒng)通知渠道的推廣態(tài)度還是比較強(qiáng)硬的,targetSdkVersion在26以上如果不使用通知渠道的話矾削,那么App的通知將完全無法彈出壤玫。

創(chuàng)建通知渠道

上代碼

    String channelId = "message";
        String channelName = "消息提示";
        int importance = NotificationManager.IMPORTANCE_HIGH;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }

這里創(chuàng)建了一個叫消息提示的的通知渠道,重要程度為NotificationManager.IMPORTANCE_HIGH 緊急哼凯。

創(chuàng)建通知渠道的這部分代碼欲间,你可以寫在Activity中,也可以寫在Application中断部,實(shí)際上可以寫在程序的任何位置猎贴,只需要保證在通知彈出之前調(diào)用就可以了。并且創(chuàng)建通知渠道的代碼只在第一次執(zhí)行的時候才會創(chuàng)建蝴光,以后每次執(zhí)行創(chuàng)建代碼系統(tǒng)會檢測到該通知渠道已經(jīng)存在了她渴,因此不會重復(fù)創(chuàng)建,也并不會影響任何效率虱疏。

顯示通知

    NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        Notification notification = new NotificationCompat.Builder(this, channelId)
                //標(biāo)題
                .setContentTitle("收到一條聊天消息")
                //內(nèi)容
                .setContentText("今天中午吃什么")
                //設(shè)置發(fā)送的時間
                .setWhen(System.currentTimeMillis())
                //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
                .setSmallIcon(R.drawable.icon_done)
                //設(shè)置右側(cè)大圖標(biāo)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //設(shè)置點(diǎn)擊通知后自動刪除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .build();
        notificationManager.notify(1, notification);


        //似乎只有設(shè)置了setContentIntent惹骂,AutoCancel才能生效
image.png

多行文字通知

  
        NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        String title = "多行文字標(biāo)題";
        String content =
                "多行文字內(nèi)容,多行文字內(nèi)容做瞪,多行文字內(nèi)容对粪,多行文字內(nèi)容,多行文字內(nèi)容装蓬,多行文字內(nèi)容著拭,多行文字內(nèi)容,多行文字內(nèi)容牍帚,多行文字內(nèi)容儡遮,多行文字內(nèi)容,多行文字內(nèi)容";


        //創(chuàng)建多文字樣式
        NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle()
                .setBigContentTitle(title)
                .bigText(content);
        Notification notification = new NotificationCompat.Builder(this, channelId)
                //標(biāo)題
                .setContentTitle("你有一條新消息")
                //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
                .setSmallIcon(R.drawable.icon_done)
                //設(shè)置右側(cè)大圖標(biāo)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //設(shè)置發(fā)送的時間
                .setWhen(System.currentTimeMillis())
                //設(shè)置點(diǎn)擊通知后自動刪除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setStyle(bigTextStyle)
                .build();
        notificationManager.notify(1, notification);

        //這里設(shè)置setContentText 也不會生效暗赶,會直接顯示bigTextStyle里的內(nèi)容鄙币,下拉之后不會顯示setContentTitle肃叶,直接顯示bigText

彈出樣式
image.png

微信消息樣式

NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        String title = "冰冰";
        ArrayList<String> messageList = new ArrayList<String>();
        messageList.add("今晚有空嗎?");
        messageList.add("晚上跟我一起去玩吧?");
        messageList.add("怎么不回復(fù)我十嘿?因惭?我生氣了!绩衷!");
        messageList.add("我真生氣了1哪А!?妊唷N鹁觥!你聽見了嗎!");
        messageList.add("別不理我U忻ぁ5退酢!");
        String content = "[" + messageList.size() + "條]" + title + ": " + messageList.get(0);


        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
        for (String msg : messageList) {
            inboxStyle.addLine(msg);
        }
        inboxStyle.setSummaryText("[" + messageList.size() + "條]" + title);


        Notification notification = new NotificationCompat.Builder(this, channelId)
                //標(biāo)題
                .setContentTitle(title)
                //內(nèi)容
                .setContentText(content)
                //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
                .setSmallIcon(R.drawable.icon_done)
                //設(shè)置右側(cè)大圖標(biāo)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //設(shè)置發(fā)送的時間
                .setWhen(System.currentTimeMillis())
                //設(shè)置點(diǎn)擊通知后自動刪除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setStyle(inboxStyle)
                .build();
        notificationManager.notify(1, notification);
image.png
image.png

進(jìn)度條樣式

NotificationManager notificationManager =
        (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

Intent intent = new Intent(getContext(), NotificationActivity.class);
PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

Notification notification = new NotificationCompat.Builder(this, channelId)
        //標(biāo)題
        .setContentTitle("正在下載")
        //內(nèi)容
        .setContentText("50%")
        //設(shè)置發(fā)送的時間
        .setWhen(System.currentTimeMillis())
        //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
        .setSmallIcon(R.drawable.icon_done)
        //設(shè)置右側(cè)大圖標(biāo)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_2))
        //設(shè)置點(diǎn)擊通知后自動刪除通知
        .setAutoCancel(true)
        .setContentIntent(pi)
        //主要是這句
        .setProgress(100, 50, false)
        .build();
notificationManager.notify(1, notification);

//setProgress(100, 50, false)
image.png

大圖樣式

NotificationManager notificationManager =
        (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

Intent intent = new Intent(getContext(), NotificationActivity.class);
PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);


NotificationCompat.BigPictureStyle bigPictureStyle =
        new NotificationCompat.BigPictureStyle()
        .bigPicture(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_5))
        .setBigContentTitle("圖片標(biāo)題");


Notification notification = new NotificationCompat.Builder(this, channelId)
        //標(biāo)題
        .setContentTitle("你有一條新消息")
        .setContentText("圖片")
        //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
        .setSmallIcon(R.drawable.icon_done)
        //設(shè)置右側(cè)大圖標(biāo)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_2))
        //設(shè)置發(fā)送的時間
        .setWhen(System.currentTimeMillis())
        //設(shè)置點(diǎn)擊通知后自動刪除通知
        .setAutoCancel(true)
        .setContentIntent(pi)
        .setStyle(bigPictureStyle)
        .build();
notificationManager.notify(1, notification);
image.png
image.png

自定義通知欄view

RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_view_layout);
        // 設(shè)置點(diǎn)擊事件
        remoteViews.setOnClickPendingIntent(R.id.iv_play_or_pause, getActivityPendingIntent(1));
        remoteViews.setOnClickPendingIntent(R.id.iv_next, getActivityPendingIntent(2));
        remoteViews.setOnClickPendingIntent(R.id.iv_cancel, getActivityPendingIntent(3));

        remoteViews.setTextViewText(R.id.tv_title, "標(biāo)題");
        remoteViews.setTextViewText(R.id.tv_summery, "藝術(shù)家");

NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        Notification notification = new NotificationCompat.Builder(this, channelId)
                //設(shè)置發(fā)送的時間
                .setWhen(System.currentTimeMillis())
                //設(shè)置小圖標(biāo)(通知欄沒有下拉的圖標(biāo))
                .setSmallIcon(R.drawable.icon_done)
                //設(shè)置右側(cè)大圖標(biāo)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //設(shè)置點(diǎn)擊通知后自動刪除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setContent(remoteViews)
                .build();
        notificationManager.notify(1, notification);
image.png

關(guān)于通知欄塊是很混亂的宪肖,Android系統(tǒng)大版本更新的時候經(jīng)常有變動表制。國內(nèi)廠商修改很嚴(yán)重,我手上有小米和vivo的測試機(jī)控乾,以上的代碼在不同的手機(jī)上表現(xiàn)也各不相同么介。如果有用到復(fù)雜視圖的通知欄,最好是自定義通知欄view蜕衡。

傳送門

資料

Android通知欄微技巧壤短,8.0系統(tǒng)中通知欄的適配
NotifyUtil
NotificationDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慨仿,隨后出現(xiàn)的幾起案子久脯,更是在濱河造成了極大的恐慌,老刑警劉巖镰吆,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帘撰,死亡現(xiàn)場離奇詭異,居然都是意外死亡万皿,警方通過查閱死者的電腦和手機(jī)摧找,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牢硅,“玉大人蹬耘,你說我怎么就攤上這事〖跤啵” “怎么了综苔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我如筛,道長堡牡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任妙黍,我火速辦了婚禮悴侵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拭嫁。我一直安慰自己,他們只是感情好抓于,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布做粤。 她就那樣靜靜地躺著,像睡著了一般捉撮。 火紅的嫁衣襯著肌膚如雪怕品。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天巾遭,我揣著相機(jī)與錄音肉康,去河邊找鬼。 笑死灼舍,一個胖子當(dāng)著我的面吹牛吼和,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骑素,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼炫乓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了献丑?” 一聲冷哼從身側(cè)響起末捣,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎创橄,沒想到半個月后箩做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妥畏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年邦邦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖熟。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡圃酵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馍管,到底是詐尸還是另有隱情郭赐,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站捌锭,受9級特大地震影響俘陷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观谦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一拉盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豁状,春花似錦捉偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谊路,卻和暖如春讹躯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缠劝。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工潮梯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惨恭。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓秉馏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喉恋。 傳聞我的和親對象是個殘疾皇子沃饶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345