Android:以编程方式启用/禁用应用小部件

fra*_*yan 6 android broadcastreceiver android-widget android-appwidget

问题:有没有办法以编程方式启用我用我的应用程序提供的一些主屏幕小部件?例如,拥有"高级"小部件并仅在付款后才能访问它?


正如Android 文档所说,应该在清单中添加一个广播接收器,告诉系统应用程序附带了一个小部件:

<receiver android:name="ExampleAppWidgetProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
           android:resource="@xml/example_appwidget_info" />
</receiver>
Run Code Online (Sandbox Code Playgroud)

但理论上,广播接收器也可以通过编程方式添加,因此小部件可以在运行时稍后注册吗?

Com*_*are 7

您可以在清单中使用app小部件android:enabled="false"<receiver>元素,然后在用户执行某些操作时使用PackageManagersetComponentEnabledSetting()在运行时启用它(例如,付费).

但是,在主屏幕意识到有新的潜在应用小部件提供商之前,可能需要重新启动.

  • 我知道,在晚会之前,但是为了将来参考`setComponentEnabledSetting()`对于所有Android版本的AppWidgets都不可靠.错误报告位于:https://issuetracker.google.com/issues/36914010 (4认同)

Jit*_*ude 6

PackageManager packageManager = getApplicationContext().getPackageManager();
//To disable widget
packageManager.setComponentEnabledSetting(new ComponentName(getApplicationContext(), MyAppWidgetProvider.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
//To enable widget
packageManager.setComponentEnabledSetting(new ComponentName(getApplicationContext(), MyAppWidgetProvider.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)