順帶一提用系統樣式自帶的是必須設置三個屬性
setContentText()
setContentTitle()
setSmallIcon()
不然會報錯:比如
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的時候
當然是要使用
RemoteViews這個咯,需要注意的是,它的構造方法
new RemoteViews(mAppContext.getPackageName(), R.layout.notification_view);
需要傳入包名和布局,布局中能用的控件是有限的,
搜索了一下說是只能使用
AnalogClock,Button,Chronometer,ImageButton,mageView,ProgressBar,TextView這7種,
布局中的寬,必須為0,wrap_content,或match_parent
因為從別的地方拷貝的布局。里面用的居然是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");
}
,然后之所以使用自定義布局,就是想通知欄顯示好友頭像,而不是固定的資源文件而已,所以加載圖片的時候可能需注意。一般是先下載圖片在設置Notification,比如我用Glide下載,需要注意Glide要求into()方法必須在主線程執行,所以用了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);
}
});
}
});
其實最后發現,自定義的RemoteViews會遇到適配的麻煩。不同的ROM拉下來的通知欄是不一樣的。比如我android 4.4的模擬器是黑色的,而魅族flyme6.0的系統通知拉下來的背景是灰色的
圖片發自簡書App
,而我一加手機3T的通知又是白色的,
圖片發自簡書App
你在布局里面寫背景色吧會和系統的不協調,不寫吧又會導致在不同的背景下字體顏色起沖突。還是系統自帶的比較好用哈哈。
不同定制的ROM默認的通知欄是不一樣的布局的,比如:在一加3T的largeIcon會被放到右邊,魅族上不顯示。不過好歹是還算和系統協調了。最終折騰了半天還是選擇了用系統的。畢竟我看QQ微信神馬的似乎也是用的自帶的通知。