草庐IT

android - 动态启用或禁用小部件不起作用

coder 2023-11-18 原文

我们想通过代码启用或禁用小部件。当我们说 “禁用”是指在应用程序中注册的小部件 不应出现在用户可用的小部件列表中 他们尝试在主屏幕上添加一个小部件。 不幸的是,这个问题已经被问过很多次了 回答。

Dianne Hackborn 对一个单独的问题做出了回应 小部件问题表明可以使用 包管理器禁用小部件:

PackageManager pm = context.getPackageManager(); 
pm.setComponentEnabledSetting(new ComponentName("com.example.android.apis", ".appwidget.ExampleBroadcastReceiver"), 
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED, // or DISABLED 
    PackageManager.DONT_KILL_APP); 

然而,这是行不通的。小部件组件仍然会出现 在小部件列表中。可能是 AppWidgetService(位于 在\src\base\services\java\com\android 的 Android 源代码的 Base.git 中 \server),加载可用小部件列表,缓存此列表 可用的小部件。但是,如果是这样的话,那么上面的 启用或禁用小部件组件的代码将在 设备重置,因为没有缓存;它不是。

我还尝试研究重写 AppWidgetProvider,比如过滤掉任何事件。我不认为 这将去任何地方,因为 AppWidgetService,它填充 列表,使用包管理器查找捕获的所有组件 启动时的 ACTION_APPWIDGET_UPDATE Action 添加(即安装了一个新的应用程序)。提供者唯一的时间是 从这个列表中删除是在 ACTION_PACKAGE_REMOVED 广播中。 因此,鉴于提供者将始终存在,无论 组件的启用/禁用状态,我已经查看了实际的 列出当用户长按时从 Launcher 应用程序显示的 Activity 点击桌面,添加一个widget:AppWidgetPickActivity in 设置.git中 com.android.设置。不幸的是,这填充了列表 直接来自 AppWidgetService,不对 组件启用状态: void putInstalledAppWidgets(列表项){ 已安装列表 = mAppWidgetManager.getInstalledProviders(); putAppWidgetItems(已安装,空,项目); }

我很想看看是否有人克服了这个障碍。也许我是 以错误的方式去做。我想要的只是能够删除一个 用户尝试使用时可用的小部件列表中的小部件 在他们的主屏幕上添加一个小部件。

最佳答案

It may be that the AppWidgetService (located in the Android source's Base.git at \src\base\services\java\com\android \server), which loads the list of available widgets, caches this list of available widgets.

确实如此,据我所知。它将列表存储在 mInstalledProviders 中;此列表是通过 readStateFromFileLocked() 添加的,它似乎是从系统启动逻辑中调用的。

If that were the case, though, then the above code which enables or disables the widget component would work after a device reset because there would be no cache; it does not.

假设有一个 RAM 缓存。缓存是一个 XML 文件。

This, unfortunately, populates the list directly from the AppWidgetService, without any filtering for the component's enabled status

这似乎是 Android 中的一个错误。更一般地说,我认为整个缓存问题都是错误——如果缓存不同步,我看不出有什么办法可以恢复。

我建议您将您的文章作为问题发布在 public Android issue tracker 上,如果您还没有这样做的话。

关于android - 动态启用或禁用小部件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213190/

有关android - 动态启用或禁用小部件不起作用的更多相关文章

  1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  2. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  5. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  6. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  7. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  8. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

  9. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  10. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

随机推荐