【问题标题】:Android: enable/disable app widgets programmaticallyAndroid:以编程方式启用/禁用应用小部件
【发布时间】: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>

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

【问题讨论】:

    标签: android broadcastreceiver android-widget android-appwidget


    【解决方案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添加解释。
    • 它可以工作.. 但是禁用小部件需要一些时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2011-03-04
    • 2013-07-03
    相关资源
    最近更新 更多