【威哥說(shuō)】官方文檔是比較準(zhǔn)確的昙篙,但是他并一定完全是符合我們實(shí)際的應(yīng)用的。所以诱咏,自然的就會(huì)讓初學(xué)者墜入一些“陷阱”苔可,今天我們就一起看看官方文檔里面為初學(xué)者埋了多少“坑”。
我們知道自定義notification要使用RemoteViews袋狞,相信做過(guò)自定義notification的都很清楚焚辅,這是一個(gè)在其它進(jìn)程中顯示的View」堆欤可以改變RemoteViews里面的子View的值同蜻。但是這樣會(huì)有一些坑,本文就來(lái)帶大家總結(jié)下有哪些坑倔毙。
public void musicNotificationClick(View v){
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setOngoing(true);//設(shè)置 通知為常駐通知
RemoteViews view = new RemoteViews(getPackageName(),R.layout.custom_layout);
view.setTextViewText(R.id.textView_songName,"我是一匹孤獨(dú)的狼");
view.setImageViewBitmap(R.id.imageView,BitmapFactory.decodeResource(getResources(),android.R.drawable.ic_media_play));
// ? ? ? ?view.setOnClickPendingIntent(); //設(shè)置 按鈕的事件
builder.setContent(view);
Notification n = builder.build();
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NID_4,n);
}
設(shè)置不同區(qū)域的點(diǎn)擊PendingIntent
默認(rèn)的Notification只能通過(guò)setContentIntent設(shè)置整體的點(diǎn)擊事件埃仪。不過(guò)通過(guò)RemoteViews我們可以設(shè)置不同地方不同的點(diǎn)擊事件,當(dāng)然這里的事件指的是PendingIntent陕赃。如下卵蛉,設(shè)置了點(diǎn)擊R.id.notice_view_type_0打開(kāi)一個(gè)Activity,而點(diǎn)擊R.id.close_iv會(huì)發(fā)出一個(gè)廣播么库,可以通過(guò)這個(gè)廣播的廣播接收器來(lái)做一些事情傻丝,如這里是關(guān)閉當(dāng)前的Notification。另外還可以打開(kāi)一個(gè)Service诉儒。
PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.notice_view_type_0, pendingIntent); int requestCode1 = (int) SystemClock.uptimeMillis(); Intent intent1 = new Intent(ACTION_CLOSE_NOTICE); intent1.putExtra(NOTICE_ID_KEY, NOTICE_ID_TYPE_0); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, requestCode1, intent1, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.close_iv, pendingIntent1);
設(shè)置通知的自定義View
以上我們得到了自定義的RemoteViews葡缰。通過(guò)下面這段代碼就能生成自定義View的Notification,注意這里使用了setContent()方法忱反。這是網(wǎng)上自定義Notification都會(huì)使用的方法泛释。
Notification notification = new NotificationCompat.Builder(context).setContent(remoteViews).build();
但是它會(huì)有一個(gè)問(wèn)題。
通過(guò)setContent()方法獲得的Notification是定高的温算。如果View的高度比默認(rèn)高度要大的話怜校,就有一部分顯示不出來(lái)。
默認(rèn)情況下通知高度為64dp注竿,當(dāng)然Rom不同可能會(huì)有些區(qū)別茄茁。一般文字在小于兩行的情況下都是可以顯示。
使用如下方法巩割,可以適配內(nèi)容的大小
NotificationCompat.Builder builder = new NotificationCompat.Builder(context); if(android.os.Build.VERSION.SDK_INT >= 16) { notification = builder.build(); notification.bigContentView = remoteViews; } notification.contentView = remoteViews;
注意:
這里我們需要明確一個(gè)我們很容易忽略的問(wèn)題裙顽,那就是通知是可以展開(kāi)和收起的。
在上面的代碼中我們分別設(shè)置了bigContentView 這是展開(kāi)的自定義視圖宣谈,而contentView則是收起時(shí)的視圖愈犹。
bigContentView是在sdk16時(shí)引入的,所以需要判斷一下闻丑。如果小于sdk16則只能定高了甘萧。
bigContentView 的最大高度是100dp萝嘁。
bigContentView和contentView的設(shè)置不能調(diào)轉(zhuǎn)順序,親測(cè)這樣會(huì)讓contentView不顯示扬卷。
.
【更多精彩內(nèi)容】