Android進(jìn)階(5)| 理解RemoteViews

本節(jié)目錄

一.RemoteViews的應(yīng)用

RemoteViews的概念:RemoteViews就是一種在其他進(jìn)程中顯示的View丢间,在實際開發(fā)中它主要是用在通知欄和桌面小部件的開發(fā)過程中临扮。

1.RemoteViews在通知欄上的應(yīng)用

當(dāng)我們需要正在通知欄中自定義通知時获枝,我們可以先提供一個布局文件冒黑,然后通過RemoteViews來加載這個布局文件即可改變通知的樣式:

Notification notification = new Notification();
notification.icon = R.drawable.ic_launcher;
notifaication.tickerText = "hello world";
notification.when = System.currentTimeMillis();
notification.flags = Notification.FLAG_AUTO_CANCLE;
Intent intent = new Intent(this,Activity1.class);
PendingIntent pendingIntent = PentdingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews remoteViews = new RemoteViews(getPackgeName(),R.layout.Layout_notification);
remoteViews.setTextiewText(R.id.msg,"chapter_5");  //設(shè)置文字
remoteViews.setImageViewResource(R.id.icon,R.drawable.icon1);  //設(shè)置圖標(biāo)
PendingIntent openActivity2PendingIntent = PendingIntent.getActivity(this,0,new Intent(this,Activity2.class),PendingIntent.FLAG_UPDATE_CURRENT)
remoteViews.setOnClickPendingIntent(R.id.open_activity2,openActivity2PendingIntent);
notification.contentView = remoteViews;
notification.contentIntent = pendingIntent;
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(2,notification);

從上述代碼中可以看出惫企,我們只用傳入包名以及布局文件的資源id即可創(chuàng)建出一個RemoteViews對象疙咸。關(guān)于更新,我們則是使用RemoteViews提供的一系列set方法來完成操作媳友。如果要給一個控件增加點擊事件斯议,則需要setOnClickPendingIntent()方法來實現(xiàn)。

2.RemoteViews在桌面小部件上的應(yīng)用

開發(fā)桌面小部件主要分為以下幾步:
1)定義小部件的界面(布局信息)
2)定義小部件的配置信息
3)定義小部件的實現(xiàn)類
4)在AndroidManifest.xml中聲明小部件

具體的操作過程可以點擊這里醇锚。

3.PendingIntent概述

概念:PendingIntent表示一種pending狀態(tài)的意圖哼御,就是說接下來有一個Intent會在將來某一個特定的時刻發(fā)生。PendingIntent典型的使用場景是給RemoteViews添加單擊事件焊唬。PendingIntent通過send()和cancel()方法來發(fā)送和取消特定的待定Intent恋昼。

PendingIntent的三種意圖:PendingIntent支持三種意圖,啟動Activity赶促、啟動Service和發(fā)送廣播液肌,它們分別對應(yīng)著它的三個接口和方法:

PendingIntent的主要方法

可以看到這三個方法的參數(shù)都是相同的,這里來著重介紹一下requestCode和flags鸥滨。

  • requestCode
    表示PendingIntent發(fā)送方的請求碼嗦哆,多數(shù)情況下取0即可谤祖。同時它也和PendingIntent的匹配規(guī)則有關(guān),即當(dāng)兩個PendingIntent的requestCode和內(nèi)部的Intent都相同時老速,這兩個PendingIntent就是匹配的粥喜。

  • flag
    flag主要有以下4個標(biāo)記位:
    1)FLAG_ONE_SHOT:當(dāng)前描述的PendingIntent只能被使用一次,然后它會被自動cancel橘券,后續(xù)如果有相同的PendingIntent則它們的send()方法會調(diào)用失敗额湘。
    2)FLAG_NO_CANCEL:當(dāng)前描述的PendingIntent不會主動創(chuàng)建,如果當(dāng)前的PendingIntent之前不存在约郁,那么那三個方法會直接返回null缩挑。
    3)FLAG_CANCEL_CURRENT:當(dāng)前描述的PendingIntent如果已經(jīng)存在,那么它們都會被cancel鬓梅,系統(tǒng)在后續(xù)會創(chuàng)建一個新的PendingIntent供置。
    4)FLAG_UODATE_CRUUENT:當(dāng)前描述的PendingIntent如果以及存在,那么它們都會被更新绽快。

二.RemoteViews的內(nèi)部機制

1.RemoteViews的構(gòu)造方法

RemoteViews有許多的構(gòu)造方法芥丧,這里只是舉出來最常用的一種:public RemoteViews(String packgeNmae,int layout),從參數(shù)的名字中就可以看出該方法所需要的兩個參數(shù)就是當(dāng)前應(yīng)用所在的包名和將要加載的布局文件坊罢。

2.RemoteViews所支持的View類型

  • layout
    LinearLayout续担、FrameLayout、RelativeLayout活孩、GridLayout物遇。

  • View
    AnaloClock、Button憾儒、TextView询兴、ImageView、ListView起趾、GridView诗舰、Chronometer、ImageButton训裆、StackView眶根、ViewStub、ProgressBar边琉。

3.RemoteViews訪問View的方法

由于RemoteViews主要是用來操作其他進(jìn)程的View属百,所以它無法直接訪問里面的View元素,而是需要通過RemoteViews提供的一些列set方法來完成变姨,具體的方法如下:


RemoteViews的set方法

4.RemoteViews的內(nèi)部運行過程

首先由于RemoteViews實現(xiàn)了Parcelable接口诸老,所以它會先通過Binder傳遞到SystemServer進(jìn)程中。接著系統(tǒng)會根據(jù)RemoteViews中傳入的包名钳恕、布局等信息别伏,通過LayoutInflater去加載這些布局文件。接著系統(tǒng)會對View執(zhí)行一系列界面更新任務(wù)忧额,而這些更新任務(wù)就是通過之前的set方法來完成的厘肮,當(dāng)RemoteViews被加載完成以后,這些更新操作就會被執(zhí)行睦番。

Action的概念:在Android系統(tǒng)中由于效率的原因并沒有通過Binder去直接支持View的跨進(jìn)程訪問类茂,而是通過Action來進(jìn)行。Action實現(xiàn)了Parcelable接口托嚣。當(dāng)我們在應(yīng)用中每調(diào)用一次set方法時巩检,RemoteViews中就會添加一個Action的對象,當(dāng)我們提交更新時示启,這些Action對象就會被在遠(yuǎn)程進(jìn)程中依次執(zhí)行兢哭。

RemoteViews的內(nèi)部機制

執(zhí)行方法:當(dāng)RemoteViews到達(dá)遠(yuǎn)程進(jìn)程之后,RemoteViews就會調(diào)用apply()方法去遍歷所有的Action對象并且調(diào)用它們的apply()方法夫嗓,而具體的View更新操作都是由Action中得apply()方法去執(zhí)行的迟螺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舍咖,隨后出現(xiàn)的幾起案子矩父,更是在濱河造成了極大的恐慌,老刑警劉巖排霉,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窍株,死亡現(xiàn)場離奇詭異,居然都是意外死亡攻柠,警方通過查閱死者的電腦和手機球订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辙诞,“玉大人辙售,你說我怎么就攤上這事》赏浚” “怎么了旦部?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長较店。 經(jīng)常有香客問我士八,道長,這世上最難降的妖魔是什么梁呈? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任婚度,我火速辦了婚禮,結(jié)果婚禮上官卡,老公的妹妹穿的比我還像新娘蝗茁。我一直安慰自己醋虏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布哮翘。 她就那樣靜靜地躺著颈嚼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭寺。 梳的紋絲不亂的頭發(fā)上阻课,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音艰匙,去河邊找鬼限煞。 笑死,一個胖子當(dāng)著我的面吹牛员凝,可吹牛的內(nèi)容都是我干的署驻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼绊序,長吁一口氣:“原來是場噩夢啊……” “哼硕舆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骤公,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤抚官,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阶捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌节,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年洒试,在試婚紗的時候發(fā)現(xiàn)自己被綠了倍奢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡垒棋,死狀恐怖卒煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叼架,我是刑警寧澤畔裕,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站乖订,受9級特大地震影響扮饶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乍构,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一甜无、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦岂丘、人聲如沸陵究。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔乙。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間止状,已是汗流浹背励七。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留襟企,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像评姨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萤晴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1 應(yīng)用背景 printf()是格式化輸出函數(shù)吐句,在C語言編程中經(jīng)常用來輸出一些信息到控制臺,可以作為一種重要的調(diào)試...
    Carrot_123閱讀 6,443評論 0 3
  • 程序簡單店读,有很多方面不足嗦枢,還待改進(jìn)
    飛向深空閱讀 167評論 0 1
  • 我們所熟知的絲綢之路可能并不存在。 絲綢可能只是貨幣而不是貨物屯断。 這條路可能是一條文化交流之路文虏,而非商貿(mào)之路!
    大腦董事會閱讀 554評論 0 0