順帶一提用系統(tǒng)樣式自帶的是必須設(shè)置三個(gè)屬性
setContentText()
setContentTitle()
setSmallIcon()
不然會(huì)報(bào)錯(cuò):比如
java.lang.IllegalArgumentException:
Invalid notification (no valid small icon):
Notification(pri=0 contentView=com.grandmagic.readingmate/0x7f04008c headsUpContentView=null bigContentView=null vibrate=null sound=null tick defaults=0x0 flags=0x10 color=0x00000000 vis=PRIVATE)
at android.app.NotificationManager.notify(NotificationManager.java:225)
at android.app.NotificationManager.notify(NotificationManager.java:197)
想要使用自定義的Notification的時(shí)候
當(dāng)然是要使用
RemoteViews這個(gè)咯,需要注意的是刁愿,它的構(gòu)造方法
new RemoteViews(mAppContext.getPackageName(), R.layout.notification_view);
需要傳入包名和布局栏尚,布局中能用的控件是有限的,
搜索了一下說(shuō)是只能使用
AnalogClock用狱,Button,Chronometer拼弃,ImageButton夏伊,mageView,ProgressBar吻氧,TextView這7種溺忧,
布局中的寬咏连,必須為0,wrap_content鲁森,或match_parent
因?yàn)閺膭e的地方拷貝的布局祟滴。里面用的居然是fill_parent。果斷拋出異常歌溉,源碼中是這樣的
if (layoutWidth != 0 && layoutWidth != ViewGroup.LayoutParams.MATCH_PARENT
&& layoutWidth != ViewGroup.LayoutParams.WRAP_CONTENT) {
throw new IllegalArgumentException("Only supports 0, WRAP_CONTENT and MATCH_PARENT");
}
垄懂,然后之所以使用自定義布局,就是想通知欄顯示好友頭像研底,而不是固定的資源文件而已埠偿,所以加載圖片的時(shí)候可能需注意。一般是先下載圖片在設(shè)置Notification榜晦,比如我用Glide下載冠蒋,需要注意Glide要求into()方法必須在主線程執(zhí)行,所以用了Rxjava切換線程乾胶,畢竟不是Activity的context不能runOnUithread()抖剿;
Observable
.just(Environment.BASEULR_PRODUCTION+mUserInfo.getAvatar_url().getMid())
.flatMap(new Func1<String, Observable<BitmapTypeRequest<String>>>() {
@Override
public Observable<BitmapTypeRequest<String>> call(String mS) {
BitmapTypeRequest<String> mStringBitmapTypeRequest = Glide.with(mAppContext).load(mS).asBitmap();
return Observable.just(mStringBitmapTypeRequest);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<BitmapTypeRequest<String>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
showNotification(mUserInfo,mNotifytxt,mMessage,null);
}
@Override
public void onNext(BitmapTypeRequest<String> mStringBitmapTypeRequest) {
mStringBitmapTypeRequest.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
showNotification(mUserInfo,mNotifytxt,mMessage,resource);
}
});
}
});
其實(shí)最后發(fā)現(xiàn),自定義的RemoteViews會(huì)遇到適配的麻煩识窿。不同的ROM拉下來(lái)的通知欄是不一樣的斩郎。比如我android 4.4的模擬器是黑色的,而魅族flyme6.0的系統(tǒng)通知拉下來(lái)的背景是灰色的
喻频,而我一加手機(jī)3T的通知又是白色的缩宜,
你在布局里面寫背景色吧會(huì)和系統(tǒng)的不協(xié)調(diào),不寫吧又會(huì)導(dǎo)致在不同的背景下字體顏色起沖突甥温。還是系統(tǒng)自帶的比較好用哈哈锻煌。
不同定制的ROM默認(rèn)的通知欄是不一樣的布局的,比如:在一加3T的largeIcon會(huì)被放到右邊姻蚓,魅族上不顯示宋梧。不過好歹是還算和系統(tǒng)協(xié)調(diào)了。最終折騰了半天還是選擇了用系統(tǒng)的狰挡。畢竟我看QQ微信神馬的似乎也是用的自帶的通知捂龄。