自定義系統(tǒng)樣式Notification

起因

很久之前接到一個需求斑匪,需要在通知欄常駐一個notification,title和subtitle都比較短锋勺,在末尾加一個類似數(shù)據(jù)狀態(tài)的提示秤标。常駐notification很簡單,通過service發(fā)送一個前臺服務(wù)就可以了宙刘,自定義RemoteViews也很簡單苍姜,寫好對應(yīng)的layout就好了,大體樣式可以做的跟系統(tǒng)的notification差不多悬包。

但是發(fā)現(xiàn)做完之后衙猪,在各種手機上的performance相差很多,特別是小米的布近,簡直奇丑無比垫释,除非把整個色塊全都上色,類似360那種撑瞧。出于強迫癥棵譬,十分想把這個notification做的跟系統(tǒng)一個樣式,這樣可以適配各大手機预伺。于是開始對系統(tǒng)源碼以及hierarchyViewer進行分析订咸。

分析

  1. 通過hierarchyViewer,理清楚SystemUI中notification item的視圖結(jié)構(gòu)酬诀;查找源碼了解到對應(yīng)layout的布局情況脏嚷。
  2. 如果可以保留notification原本的layout,然后整體添加到新的layout中瞒御,即可保留系統(tǒng)樣式父叙,
  3. 然后往新的layout中添加顯示數(shù)據(jù)狀態(tài)的view。

hierarchyViewer

system_ui_notification_item_desc.jpg

找到了notification布局中Notification item layout中肴裙,RemoteViews的contentView的id為“status_bar_latest_event_content”

代碼實現(xiàn)

public static void senNotification(Context context) {
    ...
        //通過反射找到對應(yīng)parent的id
        int id = Resources.getSystem().getIdentifier("status_bar_latest_event_content", "id", "android");
        Notification notification;
        //如果找到了id則自定義notification趾唱,否則照常
        if (id != 0) {
            //new一個notification,通過setXXX設(shè)置好action蜻懦,然后build出來
            notification = new NotificationCompat.Builder(context).setContentTitle("這是一個自定義的notifications")
                    .setContentText("能保留系統(tǒng)Notification中title和subtitle的style").setContentIntent(pendingIntent)
                    .setAutoCancel(true).setSmallIcon(R.mipmap.ic_launcher).setShowWhen(false).build();
            //把系統(tǒng)樣式的RemoteViews 克隆一份
            RemoteViews contentView = notification.contentView.clone();
            //接著把parent的child全部清除甜癞,等待添加自定義的RemoteViews
            notification.contentView.removeAllViews(id);
            //自定義的parent,將被添加到notification.contentView
            RemoteViews customParentView = new RemoteViews(context.getPackageName(),
                    R.layout.layout_custom_notification);
            //把系統(tǒng)樣式的RemoteView添加到自定義Parent中
            customParentView.addView(R.id.custom_notification_item_parent, contentView);
            //把現(xiàn)實數(shù)據(jù)狀態(tài)的view添加到自定義Parent中
            RemoteViews customChildView = new RemoteViews(context.getPackageName(),
                    R.layout.layout_custom_notification_child);
            customChildView.setTextViewText(R.id.child, "Child");
            customParentView.addView(R.id.custom_notification_item_parent, customChildView);
            //把自定義Parent添加到contentView中
            notification.contentView.addView(id, customParentView);
        } else {
            //正常發(fā)送notification
            ...
        }
        //常駐notification需要在service中通過發(fā)送前臺服務(wù)實現(xiàn)阻肩,此處不贅述带欢,就簡單發(fā)送一個通知
        notificationManager.notify(1, notification);
    }

custom_notification_item_parent.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_notification_item_parent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_vertical">

</RelativeLayout>

layout_custom_notification_child.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/child"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_centerVertical="true"
    android:layout_alignParentRight="true"
    android:layout_marginRight="8dp"
    android:gravity="center"
    android:background="@color/theme_white"
    android:textColor="@color/theme_black"
    android:textSize="14sp" />

這樣运授,一個風格適配系統(tǒng)的自定義notification就完成了,不過目前有一個弊端還無法解決乔煞,就是title和subtitle太長吁朦,就會被自定義的child遮擋,不過就之前的需求而言渡贾,目前的實現(xiàn)足夠滿足了逗宜。

代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市空骚,隨后出現(xiàn)的幾起案子纺讲,更是在濱河造成了極大的恐慌,老刑警劉巖囤屹,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬甚,死亡現(xiàn)場離奇詭異,居然都是意外死亡肋坚,警方通過查閱死者的電腦和手機乡括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來智厌,“玉大人诲泌,你說我怎么就攤上這事∠撑簦” “怎么了敷扫?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诚卸。 經(jīng)常有香客問我葵第,道長,這世上最難降的妖魔是什么惨险? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任羹幸,我火速辦了婚禮脊髓,結(jié)果婚禮上辫愉,老公的妹妹穿的比我還像新娘。我一直安慰自己将硝,他們只是感情好恭朗,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著依疼,像睡著了一般痰腮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上律罢,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天膀值,我揣著相機與錄音棍丐,去河邊找鬼。 笑死沧踏,一個胖子當著我的面吹牛歌逢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翘狱,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秘案,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了潦匈?” 一聲冷哼從身側(cè)響起阱高,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茬缩,沒想到半個月后赤惊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凰锡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年荐捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寡夹。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡处面,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菩掏,到底是詐尸還是另有隱情魂角,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布智绸,位于F島的核電站野揪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞧栗。R本人自食惡果不足惜斯稳,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迹恐。 院中可真熱鬧挣惰,春花似錦、人聲如沸殴边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锤岸。三九已至竖幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間是偷,已是汗流浹背拳氢。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工募逞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馋评。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓凡辱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栗恩。 傳聞我的和親對象是個殘疾皇子透乾,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文出處: http://www.androidchina.net/6174.html Notification在...
    木木00閱讀 12,326評論 3 32
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,126評論 25 707
  • 哈佛凌晨四點半,這本暢銷書的書名或許可以帶來更多的啟示磕秤。天賦異稟的哈佛學(xué)子在凌晨四點半進入圖書館學(xué)習(xí)乳乌,如此勤奮,如...
    不忘心安閱讀 1,268評論 0 1
  • 瀏覽網(wǎng)頁市咆,不知道在哪里看到華成英老師說了這樣一句話汉操,學(xué)習(xí)新知識時如果可以將新事物與舊事物類比著學(xué)習(xí),將會事半功倍蒙兰。...
    glorythesky閱讀 171評論 0 0
  • 電梯緩緩上升 鐵網(wǎng)后的黑面 卸下偽裝的斗篷 揭開記憶的密碼 華盛頓的陽光下 奔走在時代廣場 他肩上有傷 臉寫著毅然...
    秋未完閱讀 236評論 0 2