Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          PackageManager.setComponentEnabledSetting 可以用來禁用某個組件,包括activity,receiver等等。被禁用的組件會被持久化到/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>

          現在需要在運行時禁用某個widget,同時有一個system property用來標識是否需要禁用。
          因為widget實際上就是個reveiver,它接收android.appwidget.action.APPWIDGET_UPDATE的action,所以開始的思路是:
          創建一個BroadcastReceiver,接收Intent.ACTION_BOOT_COMPLETED這個動作,從而在啟動完成后調用SystemProperties.get("disable_widget"),如果需要禁用這個widget,那么調用:
          PackageManager.setComponentEnabledSetting(widgetComponentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
          ??????????????? PackageManager.DONT_KILL_APP);

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

          參考:
          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) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 沾化县| 三门县| 南丰县| 陆丰市| 旅游| 芷江| 泰兴市| 会理县| 蚌埠市| 铜陵市| 靖安县| 彩票| 买车| 元谋县| 无锡市| 元氏县| 隆林| 龙胜| 宁陕县| 吐鲁番市| 永康市| 峡江县| 黑河市| 海城市| 卓尼县| 高碑店市| 东乡| 渝中区| 十堰市| 象山县| 彭阳县| 石城县| 桂阳县| 永嘉县| 巴林右旗| 巴青县| 邵阳县| 合山市| 彰化县| 政和县| 桂林市|