RemoteViews的理解和應用

RemoteViews的介紹:

RemoteViews是一種遠程View, 可以在其他進程中顯示,可以跨進程更新界面;RemoteViews不能支持所有的View類型,也不能支持自定義View, 只支持如下類型:

layout:

FrameLayout? LinearLayout? RelativeLayout? GridLayout

View:

AnalogClock, button, Chronometer, ImageButton, ImageView ,ProgressBar ,TextView, ?ViewFlipper ListView , GridView ,StackVie,AdapterViewFlipper,ViewStub;

RemoteViews沒有提供findViewById方法;不能直接訪問里面View的元素,必須要通過RemoteViews提供的set方法進行完成;


RemoteViews的set方法

對于點擊事件 ,RemoteViews中只支持PendingIntent ,不支持onClicklistener

RemoteViews在Android中的使用場所有兩種:通知欄桌面小部件


RemoteViews在通知欄上的應用:

定義Notification,會使用默認的布局,如果要使用自定的布局,需要給notification.contentView = remoteView指定remoteview,然后通過remoteView去更新界面

系統自帶的布局:

// 創建通知消息對象

NotificationCompat.Builder builder = new NotificationCompat.Builder(YouRen.getContext());

builder.setTicker("您有一條新消息。");// 彈出的提示

builder.setContentTitle(appName);// 通知消息的標題

builder.setContentText(content);// 通知消息的內容

builder.setSmallIcon(smallIcon1);

builder.setLargeIcon(appIcon);

builder.setDefaults(Notification.DEFAULT_ALL);

builder.setWhen(System.currentTimeMillis());

builder.setAutoCancel(true); //注意不要設置setAutoCancel為true,否則監聽器接收不到。

PendingIntent contentIntent = PendingIntent.getBroadcast(this, NOTIFY_REQUEST_CODE, intent_bro, PendingIntent.FLAG_UPDATE_CURRENT);//第一個參數是當前的類 , 第二個參數默認是0,第三個是intent ,可以用于手動清除通知時發送廣播 , 第四個pendingIntent的屬性

//顯示通知

NotificationManager manger = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);

manger.notify((int) System.currentTimeMillis(), builder.build());

自定義布局:


自定義的消息通知欄


RemoteViews在桌面小部件的應用:

AppWidgetProvider 是Android用來實現桌面小部件的類;本質就是一個BroadcastReceiver, 實現功能需要繼承AppWidgetProvider類,并重寫onUpdate方法。AppWidgetProvider還有onEnabled,onDisabled,onDeleted以及onReceive ,而onReceive可以自動根據廣播的Action來調用其余的幾個方法。桌面小部件的更新也需要用到RemoteViews,更新方法主要是調用AppWidgetManager的updateAppWidget方法,傳入appWidgetId跟RemoteViews。桌面小部件實現步驟如下:

1定義小部件界面:


layout下的布局

2、定義小部件配置信息:


xml文件夾下的配置信息

3、定義小部件的實現類:


上述方法可以進行刪除,替換等操作
結合onreceive()

4、在AndroidManifest.xml中聲明小部件:


兩個action是自定義的

第一個action用于識別小部件的單擊行為;

第二個action作為小部件的標識必須存在,這是系統的規范。


PendingIntent的四個屬性:

FLAG_ONE_SHOT:

在當前的pendingIntent中只能被調用一次 , 然后它就會被自動cencel , 如果后續還有相同的pendingIntent , 那么它們的send方法就會調用失敗。如果用了這個屬性 , 那么同類的通知欄只能使用一次 , 后續的通知欄單擊后將無法打開。

FLAG_NO_CREATE:

如果當前系統中不存在相同的PendingIntent對象,系統將不會創建該PendingIntent對象而是直接返回null。(我沒用過)

FLAG_CANCEL_CURRENT:

在當前的pendingIntent中如果已經存在 , 那么它們都會被cencel, 然后系統會創建一個新的pendingIntent 。對于通知欄中,那些被cencel的消息將無法打開。使用這個屬性時你會發現,當你點擊消息1時,沒反應,當你點擊第2條時就可以點擊。

FLAG_UPDATE_CURRENT:(用的比較多)

在當前的pendingIntent中,如果已經存在那么它們都會被更新,即它們的intent中的extras會被替換成最新的;使用這個熟悉的時候 , 可以根據不同的變量來進行辯論,例如好友請求,判斷是不是字段為“張三”,如果為張三,那么通知欄只會顯示一條,否則會顯示多條;

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

推薦閱讀更多精彩內容