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

Posted

技术标签:

【中文标题】Android:以编程方式启用/禁用应用小部件【英文标题】:Android: enable/disable app widgets programmatically 【发布时间】:2017-02-25 11:49:06 【问题描述】:

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


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

<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>

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

【问题讨论】:

【参考方案1】:

您可以在清单中的应用小部件的&lt;receiver&gt; 元素上添加android:enabled="false",然后使用PackageManagersetComponentEnabledSetting() 在用户执行某些操作(例如,支付)时在运行时启用它。

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

【讨论】:

谢谢!一个简短的问题:这是否意味着其他应用程序可以调用这个函数来指定我的接收器组件,甚至可以从 adb 命令行启用它? @frangulyan:“这是否意味着其他应用程序可以调用此函数指定我的接收器组件” - 普通的 Android SDK 应用程序不能。系统应用程序、root 设备上的应用程序等可能。 “甚至从 adb 命令行启用它?” - 我想是这样。恕我直言,这应该在您的关注点列表中相当远。 迟到了,我知道,但供将来参考 setComponentEnabledSetting() 并不可靠地适用于所有 Android 版本上的 AppWidgets。错误报告在这里:issuetracker.google.com/issues/36914010 不工作.. 在运行时它不启用接收器 @String 现在问题已经修复了!!【参考方案2】:
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);

【讨论】:

请考虑为共享代码sn-p添加解释。 它可以工作.. 但是禁用小部件需要一些时间

以上是关于Android:以编程方式启用/禁用应用小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中以编程方式启用禁用 GPS? [复制]

如何在Android上以编程方式启用或禁用GPS?

Android:如何以编程方式启用/禁用 Wifi 或 Internet 连接

Android:如何以编程方式启用/禁用 Wifi 或 Internet 连接

Android:一旦我以编程方式禁用滚动视图行为,我将无法再次启用它

如何在android studio上以编程方式检查自动启动权限是启用还是禁用