Calvin's Tech Space

          成于堅(jiān)忍,毀于浮躁

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
          PackageManager.setComponentEnabledSetting 可以用來(lái)禁用某個(gè)組件,包括activity,receiver等等。被禁用的組件會(huì)被持久化到/data/system/packages.xml中,如:

          <package name="com.android.setupwizard" codePath="/system/app/SetupWizard.apk" nativeLibraryPath="/data/data/com.android.setupwizard/lib" flags="1" ft="13349457a90" it="13349457a90" ut="13349457a90" version="130" userId="10016">
          <sigs count="1">
          <cert index="0" />
          </sigs>
          <disabled-components>
          <item name="com.android.setupwizard.SetupWizardActivity" />
          </disabled-components>
          </package>

          現(xiàn)在需要在運(yùn)行時(shí)禁用某個(gè)widget,同時(shí)有一個(gè)system property用來(lái)標(biāo)識(shí)是否需要禁用。
          因?yàn)閣idget實(shí)際上就是個(gè)reveiver,它接收android.appwidget.action.APPWIDGET_UPDATE的action,所以開(kāi)始的思路是:
          創(chuàng)建一個(gè)BroadcastReceiver,接收Intent.ACTION_BOOT_COMPLETED這個(gè)動(dòng)作,從而在啟動(dòng)完成后調(diào)用SystemProperties.get("disable_widget"),如果需要禁用這個(gè)widget,那么調(diào)用:
          PackageManager.setComponentEnabledSetting(widgetComponentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
          ??????????????? PackageManager.DONT_KILL_APP);

          但是問(wèn)題是,調(diào)用這個(gè)方法disable掉這個(gè)widget后,發(fā)現(xiàn)必須把設(shè)備重啟之后才能生效...
          經(jīng)過(guò)google,發(fā)現(xiàn)問(wèn)題出在com.android.server.AppWidgetService.java。
          原來(lái)開(kāi)機(jī)后,SystemServer會(huì)調(diào)用AppWidgetService的systemReady()方法,這個(gè)方法通過(guò)PackageManager查詢(xún)所有的widget receiver組件,保存到mInstalledProviders變量列表中,并持久化widget信息到/data/system/appwidgets.xml中。
          而在Launcher上長(zhǎng)按添加widget時(shí)的那個(gè)widget列表信息也是通過(guò)AppWidgetService取得mInstalledProviders列表。
          問(wèn)題在于我們通過(guò)PackageManager.setComponentEnabledSetting()禁用掉某個(gè)widget后,packagemanager確實(shí)將這個(gè)組件disable了,但是AppWidgetService卻沒(méi)有去從packagemanager reload widget信息,這就導(dǎo)致了mInstalledProviders中保存的widget信息還是開(kāi)機(jī)時(shí)load進(jìn)來(lái)的那些信息,并沒(méi)有與pm進(jìn)行同步。直到下一次開(kāi)機(jī)調(diào)用systemReady重新加載widget信息才會(huì)刷新這個(gè)列表。

          參考:
          Dynamically enabling or disabling a widget with PackageManager.setComponentEnabledSetting does not work
          http://code.google.com/p/android/issues/detail?id=6533

          http://blog.csdn.net/yinlijun2004/article/details/6136108

          posted on 2011-12-27 14:14 calvin 閱讀(1695) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Android
          主站蜘蛛池模板: 伊宁县| 漠河县| 柳河县| 滕州市| 梁山县| 中宁县| 玉屏| 建平县| 驻马店市| 名山县| 麦盖提县| 临湘市| 丰都县| 东兴市| 静乐县| 石河子市| 通化市| 高邑县| 陇南市| 通渭县| 延安市| 岑巩县| 郓城县| 汉沽区| 金川县| 讷河市| 武胜县| 滨州市| 富宁县| 高唐县| 时尚| 夏邑县| 通渭县| 和平区| 闽侯县| 社旗县| 凭祥市| 肃南| 冀州市| 井陉县| 新巴尔虎左旗|