• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks
            http://piziyuyu.blog.163.com/blog/static/96323832201011863647922/

            About Widget 2

            上一篇是對(duì)Dev Guide中關(guān)于SDK的翻譯,這篇文章的目的就是對(duì)AppWidget有一個(gè)深入的介紹。

            一、首先介紹一下在開機(jī)過程中系統(tǒng)對(duì)AppWidget做了什么

            當(dāng)SystemServer.java運(yùn)行到init2()的時(shí)候,通過SystemManager.addService(Context.AppWidget_Service,appWidget)AppWidgetService服務(wù)加到服務(wù)隊(duì)列里面,當(dāng)所有服務(wù)加載完畢后會(huì)調(diào)用appWidgetF.systemReady(safeMode)進(jìn)入到AppWidgetService.java,在這個(gè)方法中做了三件事:

            1、遍歷所有的安裝包,找到符合條件的ACTIONACTION_APPWIDGET_UPDATE<meta-data android:name="android.appwidget.provider"/>receiver,解析相關(guān)信息,保存到本地?cái)?shù)據(jù)成員中。

            2、讀取本地文件數(shù)據(jù):/data/system/appwidgets.xml,所有已安裝到桌面的widget的信息都保存在這個(gè)文件里。讀出來,也保存到本地?cái)?shù)據(jù)成員里。

            3、注冊(cè)了三個(gè)消息:ACTION_BOOT_COMPLETED(系統(tǒng)啟動(dòng)到桌面就會(huì)發(fā)送此消息),ACTION_PACKAGE_ADDED(有新 APK包安裝到系統(tǒng)),ACTION_PACKAGE_REMOVED(有APK包被刪除)。當(dāng)系統(tǒng)啟動(dòng)到桌面后,AppWidgetService接收 到了ACTION_BOOT_COMPLETED消息,它會(huì)去檢查本地?cái)?shù)據(jù)成員,如果有已經(jīng)安裝到桌面的widget,它會(huì)上發(fā) ACTION_APPWIDGET_ENABLEDACTION_APPWIDGET_UPDATE消息。如果有widget設(shè)置了updatePeriodMillis的屬性,它就會(huì)開始計(jì)時(shí)(這個(gè)是通過AlarmManager來實(shí)現(xiàn)的),到時(shí)間時(shí),就會(huì)再次發(fā)送ACTION_APPWIDGET_UPDATE消息。

             

            二、與AppWidget相關(guān)的類有:

            RemoteViews.java   

             * A class that describes a view hierarchy that can be displayed in

             * another process. The hierarchy is inflated from a layout resource

             * file, and this class provides some basic operations for modifying

             * the content of the inflated hierarchy

            上面是Google給的關(guān)于RemoteViews的解釋,大家不要被它的名字給欺騙了,說白了它就是作為一個(gè)描述view信息的載體,通過它可以在進(jìn)程間傳遞,在另一個(gè)進(jìn)程中由AppWidgetHostView去獲取RemoteViews所承載的信息并且顯示出來。

            AppWidgetProvider.java

             這個(gè)類繼承BroadcastReceiver,并且重寫了它里面的方法,里面通常使用的是onUpdate()方法對(duì)AppWidget更新

            AppWidgetManager.java

             * Updates AppWidget state; gets information about installed AppWidget providers and other

             * AppWidget related state.

             

            AppWidgetHost.java

            * AppWidgetHost provides the interaction with the AppWidget service for apps,

             * like the home screen, that want to embed AppWidgets in their UI.

            AppWidgetHostView.java

            * Provides the glue to show AppWidget views. This class offers    automatic animation

             * between updates, and will try recycling old views for each incoming

             * {@link RemoteViews}.

            AppWidgetService.java

            具體實(shí)現(xiàn)AppWidgetHostAppWidgetManager中的方法。

            關(guān)于AppWidget的深入理解2 - piziyuyu - piziyuyu的博客

            對(duì)上圖的一個(gè)解釋:

            當(dāng)我們把一個(gè)AppWidget放在桌面的時(shí)候其實(shí)這個(gè)AppWidget是停靠在Launcher的一個(gè)View上面,被停靠的這個(gè)Activity我理解為“宿主”,而AppWidget是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程中,所以AppWidget要與這個(gè)“宿主”通信的話就需要IPC

            當(dāng)RemoteViewsAppWidgetView信息傳遞“宿主”的時(shí)候,通過AppWidgetHost獲得AppWidgetHostView的實(shí)例,這樣 按照RemoteViews中的信息將AppWidgetView繪制到“宿主”中來。至此,我們的Widget就顯示在“宿主”上了。

            下圖是對(duì)AppWidgetManagerAppWidgetHost做的解釋,作為管理類,各自完成不同的管理任務(wù)。 
            關(guān)于AppWidget的深入理解2 - piziyuyu - piziyuyu的博客
             

            在網(wǎng)上看到這么一段關(guān)于AppWidget的比喻,貼來大家看看

            Android AppWidget框架妄析: Android中的借尸還魂


            Android, AppWidget, 借尸還魂

            由于初識(shí)Android不久,所以一切分析皆可有誤,故而只能為之妄析。 題目起的比較恐怖,然非我本意。 只是實(shí)在找不到更加貼切的,可以對(duì)AppWidget框架一針而見血的比喻了。 閑話少說,且看如何個(gè)借尸還魂。

            首看魂者何來。 大家都知道Widget的宗旨,就是要在同一屏幕(界面上)運(yùn)行多個(gè)具有獨(dú)立功能的小插件,從而豐富功能的同時(shí)簡(jiǎn)化操作。那么,在Android4大組件中,何人可以充當(dāng)該角色,抑或需要再獨(dú)立設(shè)計(jì)一個(gè)組件? Activity 非也!! ActivityUI呈現(xiàn)和用戶交互的一個(gè)組件,具有獨(dú)特的Task管理機(jī)制,同一時(shí)刻,框架只允許一個(gè)Activity與用戶交互并呈現(xiàn)。 Widget的特點(diǎn)是,多實(shí)例的并發(fā)交互性。 所以,Activity不能滿足,不能滿足同時(shí)多個(gè)Widget的并發(fā)交互和呈現(xiàn)。 既然不能前臺(tái),那么只能在后臺(tái)Running Service or BroadCastReceiver 由于Widget需要處理眾多的事件交互,所以,BroadCastReceiver更加合適。 既然找到了合適的,那么也就沒有必要再創(chuàng)造新的。 夠用就可以,不是越多越好,這也是軟件設(shè)計(jì)的準(zhǔn)則。 OK AppWidget的魂已經(jīng)找到,BroadCastReceive也, 所以,Android中的AppWidget其本質(zhì)就是一個(gè)BroadCastReceive組件。

            再看尸者何來。 尸者,陽間之物也。 雖已死(本身無用),卻能見光(呈現(xiàn))也。 任何一個(gè)期望在其之上運(yùn)行Widget的前臺(tái)的應(yīng)用(Activity),其實(shí)就是一個(gè)Widget宿主。 其本身而言,無任何Widget功能,但卻可以和用戶交互并呈現(xiàn),從此點(diǎn)而言,可謂尸也。 Android中的AppHost即為尸也。

            最后我們看如何還魂。 AppWidget為魂,功能強(qiáng)大,為所欲為,但卻始終位于陰間(后臺(tái)運(yùn)行),無法見日,故而眾人不可觀之。 AppHost為尸,雖見天日,卻已無所可為。 我們何不將此二者互補(bǔ)那?? 但是,陰陽兩隔,必須使用特殊的方式, 此即為還魂術(shù)。 通過還魂術(shù),可使得魂寄于尸而見天日。 還魂術(shù)就是陰間通往陽間的大道。 Android中的還魂術(shù)即為RemoteView Android中,由于進(jìn)程邊界的存在,使得AppWidgetAppHost也陰陽兩隔,默認(rèn)是無法直接溝通的。 采用RemoteView,讓AppWidget將一切需要呈現(xiàn)的描述構(gòu)建到RemoteView中,AppHost中再基于該描述,重新創(chuàng)建于屬于自己進(jìn)程中的View進(jìn)而顯示。

             

             

             

             

             

             

             

             


            posted on 2012-03-04 18:45 life02 閱讀(548) 評(píng)論(0)  編輯 收藏 引用 所屬分類: laucher開發(fā)(轉(zhuǎn)載)
            国产成年无码久久久久毛片| 国产毛片久久久久久国产毛片| 青青草原综合久久| 2021精品国产综合久久| 一日本道伊人久久综合影| 亚洲国产精品综合久久一线| 国产精品久久久久久久| 久久亚洲欧美日本精品| 欧美国产精品久久高清| www性久久久com| 久久伊人色| 亚洲国产二区三区久久| 国产美女亚洲精品久久久综合 | 7777久久久国产精品消防器材| 99久久99久久久精品齐齐| 国产L精品国产亚洲区久久| 热re99久久6国产精品免费| 久久精品国产一区二区电影| 亚洲日本va中文字幕久久| 久久久WWW成人| 久久综合给合综合久久| 久久99精品久久久久久秒播| 精品久久久久久久无码| 久久国产精品99国产精| 超级碰碰碰碰97久久久久| 深夜久久AAAAA级毛片免费看| 一本色综合网久久| 久久无码中文字幕东京热| 日韩AV毛片精品久久久| 亚洲国产高清精品线久久| 久久国产精品免费| 日本高清无卡码一区二区久久| 精品伊人久久大线蕉色首页| 狠狠精品久久久无码中文字幕| 久久国产三级无码一区二区| 国内精品久久久久久久影视麻豆 | 久久久国产精品| 无码AV中文字幕久久专区| 久久w5ww成w人免费| 思思久久好好热精品国产| 亚洲综合伊人久久大杳蕉|