自定義Notification樣式遇到的坑

順帶一提用系統樣式自帶的是必須設置三個屬性

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微信神馬的似乎也是用的自帶的通知。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容