RemoteViews 的 AppWidget 刷新 Uri

2023-12-12

我创建了一个 Appwidget,它显示一个图像文件 (test.png),该文件通过 Uri 提供给它的 RemoteViews。 在 onUpdate 中,我运行一个更改文件内容的服务。我还为将调用 onUpdate 的图像设置了一个 onClickListener。

-如果我创建 AppWidget 的实例,它将显示 Uri 文件的最近更改的版本。

-如果我单击小部件,我的服务会对文件进行适当的更改(我可以使用文件资源管理器进行验证),但它不会更新 AppWidget 中显示的图像。

-(最重要的是)如果我删除 AppWidget 并创建一个新的 AppWidget,它会显示图像文件的当前/正确版本。

我知道我的服务可能需要很长时间才能在第一次通过时生效,但它应该在 onUpdate 的下一次 onClick/调用时显示最新的图像。 就目前而言,AppWidget 仅显示第一次调用 onUpdate 时存在的图像文件的版本。

问题:

刷新应用程序小部件的 RemoteView 内容的正确方法是什么,我在此处的方法中是否遗漏了某些内容?

谢谢你的时间!

Update:

我尝试从 AppWidgetProvider.onReceive() 调用 AppWidgetManager.notifyAppWidgetViewDataChanged() 方法,但在 onUpdate() 之后仍然没有更改为 RemoteViews 内容。

public class CCWidgetProvider extends AppWidgetProvider {

  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) 
    {

    // Get all ids
    ComponentName thisWidget = new ComponentName(context,CCWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    for (int widgetId : allWidgetIds)
        {
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget_layout04);

        /*
         * it's here that I run a service that changes the content of the file /test/test.png
         */

        RelativeLayout RL_widget = new RelativeLayout(context);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        RL_widget = (RelativeLayout)inflater.inflate(R.layout.widget_main, null);

        Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()+"/test/test.png");
        remoteViews.setImageViewUri(R.id.IV_widget_image,uri);


        Intent intent = new Intent(context, CCWidgetProvider.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        //PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.IV_widget_image, pendingIntent);

        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
 }
} 

我发现有很多事情会让小部件变得困难。

A. onUpdate 并不是真正的更新机制

与听起来相反,onUpdate仅在两种情况下被调用:

  1. 创建小部件时。
  2. 每当更新周期时间(updateMillis在小部件的 xml 定义文件中定义的文件)已过期。

关键点:onUpdate其他时间从不被调用。 (据我在实践中见过)。

如果您希望小部件在其他时间更新,则需要创建一个了解小部件和触发能力的单独机制。通常这将是Service你开始于onUpdate常规。这可能看起来像:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )
{       
    // start the service in case it ain't started yet, this also force a widget update to ensure correct status on them
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra('service.startCode', /*A number to identify what is going on*/);
    context.startService(intent);

    // Everything else is triggered from the service!!
}

然后,该服务设置小部件的内容,并根据需要更新它们,无论是通过内部计时还是通过使用Broadcast机制。

B. 你无法真正更新小部件的一部分

创建一个似乎合乎逻辑remoteViews当您创建小部件,然后在情况发生变化时更新该小部件或其中的视图时。根据我的经验,这并不能按预期进行。当您想要更改小部件中的任何内容时,请创建一个新的remoteViews,正确填写,然后将其分配给小部件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RemoteViews 的 AppWidget 刷新 Uri 的相关文章

  • 没有这样的属性:类的 useLibrary

    我的项目在Android Studio上使用ndk 所以 build gradle如下 dependencies classpath com android tools build gradle experimental 0 4 0 app
  • 如何减少Android中CheckBox的宽度和高度

    谁能告诉我如何减少 CheckBox 的宽度和高度 以便在 Android 中显示非常小的 CheckBox 提前致谢 只需像使用普通按钮一样使用 setWidth w 和 setHeight h 函数即可
  • 从 TimerTask 的 run 方法更新 TextView 时出错

    我正在尝试测试 UI 和 Timer 类的可能性 所以我尝试了以下练习 TestTimerActivity java package com tvt TestTimer import android app Activity import
  • Phonegap(3.0.0) 相机第一次尝试不成功

    出于测试目的 我复制了在音隙相机 API http docs phonegap com en 3 0 0 cordova camera camera md html Camera我发出警报onPhotoDataSuccess测试函数何时被触
  • 如何在不清除和闪烁地图的情况下刷新谷歌地图上的标记位置?

    是否可以创建无需闪烁 清除整个地图即可更新的 Google 地图 V2 标记 目前我必须清除地图然后添加标记 googleMap clear googleMap addMarker new MarkerOptions position en
  • 在Android中的TextView下方绘制下划线

    我想在我的下面画下划线TextView 我搜索了一些内容 但找不到任何有成果的内容 有人可以帮我吗 在 TextView 中添加文本下方有三种方法 跨度字符串 http developer android com reference and
  • 如何处理 Jetpack Compose 中的导航?

    在 Jetpack Compose 中 导航应该如何完成 所有 并不多 示例 包括来自 Google 的官方示例 都使用密封类并加载新屏幕以响应观察当前屏幕的变化 这确实 有点 有效 但不提供导航返回堆栈 并且手机的后退按钮完全不知道 只是
  • 我想了解 NfcV ISO-15639 的操作

    我是 NFC 技术新手 我很难理解如何操作块 byte cmd new byte byte 0x20 FLAG byte 0x21 WRITE SINGLE BLOCK COMMAND byte 0x00 byte 0x00 byte 0x
  • 在 CustomAdapters 中使用条件 if(view==null)

    我正在为 ListView 编写一个自定义适配器 它扩展了 BaseAdapter 并在此方法中 Override public View getView int position View convertView ViewGroup pa
  • 如何监听自定义 URI

    我正在开发一个有自己的 URI 前缀的应用程序 在本例中为 dchub 到处搜索并阅读了很多 但我有点困惑 当有人点击以以下开头的链接时 是否可以启动我的应用程序dchub 在浏览器中 到目前为止 找到了很多从应用程序打开浏览器的其他示例
  • 以编程方式更改 android 按钮可绘制图标颜色

    我想以编程方式更改按钮的图标颜色 在我的 xml 上 我有 android drawableTint color colorPrimary android drawableTop drawable ic car black 24dp 要设置
  • Android 当应用程序启动时显示白屏几秒钟?

    我没有调用任何 URL 请求 该应用程序显示了一个简单的启动屏幕 我也禁用了即时运行 但该警告仍然出现 06 26 09 26 05 022 8709 8709 saurav com navigation drawer I art 后期启用
  • 在主线程中处理某些代码时如何显示进度对话框(在单独的线程中?)

    我需要执行以下操作 当应用程序启动时 它会运行一项活动 splashActivity 该活动尝试创建一个 DBHelper SQLiteDatabase 实例 该实例在创建时检查数据库是否存在 如果不存在则创建一个 在此数据库创建过程中 我
  • Recycler查看可见项目的数量

    我正在我的应用程序中创建一个水平 RecyclerView 它必须一次在屏幕上显示 2 个图像 因此每个图像的宽度必须为屏幕的 50 目前它工作正常 但每个项目都会占用屏幕的所有宽度 这是我的代码 mRecyclerView Recycle
  • android,如何重命名文件?

    在我的应用程序中 我需要录制视频 在开始录制之前 我为其指定名称和目录 录制完成后 用户可以重命名其文件 我写了以下代码 但似乎不起作用 当用户输入文件名并单击按钮时 我将执行以下操作 private void setFileName St
  • 使android listview布局可滚动

    我有一个 xml 文件 其布局为 ASCII 形式 ImageView TextView List
  • android-security :Google Play 警告:您的应用程序包含 SQL 注入问题

    作为我们应用程序的一部分 我们使用两个 contentProvider 但两者都受到 android exported false 的保护 但我们仍然收到一封 Google Play 警告邮件 您的应用程序包含 SQL 注入问题 他们提到的
  • 启动 Activity 时自动弹出键盘

    我有一个相对简单的问题 我有一个包含很多 EditText 的活动 当我打开活动时 它会自动聚焦到第一个 EditText 并显示虚拟键盘 我怎样才能防止这种情况发生 在 XML 文件的布局标签中使用此属性 android focusabl
  • 按钮的大小取决于屏幕分辨率

    I have LinearLayout有 6 个按钮 在 4 7 英寸大小的分辨率下 按钮几乎是完美的 但在分辨率较高的设备上 它们不会占据整个屏幕 而在分辨率较低的设备上 并非所有按钮都可见 您能否解释一下如何使按钮在不同屏幕分辨率的设备
  • 与桌面浏览器相比,移动浏览器有多强大? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • `for..of` 循环如何从对象解析迭代器?

    对于实现可迭代接口的对象 它必须实现 Symbol iterator 指向一个函数的键 该函数返回iterator 我想知道是否for of循环在对象内部调用此方法来获取iterator 我很好奇的原因是 例如 Map定义了一个带有多个迭代
  • 在 JPasswordField 中显示密码,而不是将 0 设置为回显字符

    如何显示 JPasswordField 的文本而不是将 0 设置为回显字符 Java 文档说 设置值 0 表示您希望查看键入的文本 类似于标准 JTextField 的行为 以下结果导致不兼容类型错误 outField setEchoCha
  • WPF SplashScreen,如何使闪屏显示时间更长

    我发现只有一种方法可以延长启动显示时间 现在是将 ApplicationDefinition 更改为 Page 并进行配置 但我需要应用程序定义 我在这里找到了定位器 如果我使用页面 它就会丢失 所以我想让启动屏幕显示时间和显示主窗体之前的
  • MySQL ORDER BY RAND() 函数何时排序?

    我读过有关 ORDER BY RAND 及其性能问题的内容 这些是否仅适用于返回大型数据集的查询 例如 如果我有一个包含 100 000 行的表 并使用 WHERE 子句返回包含 10 条记录的数据集 然后使用 ORDER BY RAND
  • 使用命名范围填充列表框

    我正在开发我的第一个 VBA 项目 需要一些绝对的新手指导 我有一份提交表格 员工将用它来提交他们的每日 KPI 我在用户表单中有一个名为 lstName 的列表框控件 员工在提交表单之前将使用该控件来选择自己的姓名 员工姓名存储在 She
  • 在 Windows XP 上安装 wxPython 后“导入 wx”失败

    我下载并安装了这个版本wxPython与我的 Python 2 6 安装一起使用 http downloads sourceforge net wxpython wxPython2 8 win32 unicode 2 8 9 1 py26
  • 单击并拖动 Selenium(chrome webdriver)不是拖动,而是单击并按住

    因此 我尝试自动化一个可以单击的列表元素 并将其拖动到 ol 元素的不同部分 然后保存 但测试只会持续到保持该元素为止 它不会移动偏移量 也不会移动到目标元素 Chrome 网络驱动程序 Java Selenium public void
  • 是否可以将 Azure VM 从托管磁盘转换为非托管磁盘? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 如果您认为该问题与主题相关另一个 Stack Exchange 站点 您可以发表评论来解释问题可以在哪里得到解
  • 关联 php 数组中的下一个元素

    这看起来很容易 但我不明白 users emails array Spence gt email protected Matt gt email protected Marc gt email protected Adam gt email
  • 在jasper报告中命名excel中动态生成的工作表名称

    我有一个要求 我需要生成 Excel 格式的报告 Excel工作表的工作表将动态生成 我想知道是否有一种方法可以命名这些动态生成的工作表 使用 net sf jasperreports export xls sheet names ator
  • 同一台计算机上的两个 Chrome 会话 - 一个将连接到我们的 Azure 网站,另一个“无法连接到 SQL Server 数据库”

    我们遇到一个 Azure 网站的问题 该网站间歇性失败并出现以下错误 SqlException 0x80131904 建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误 服务器未找到或无法访问 验证实例名称是否正确以及
  • PHP中使用IMAP()获取最近未读邮件数

    我正在努力得到不 来自 gmail 帐户的最近未读邮件 为此 我在 Ubuntu 系统中安装了 IMAP 并尝试了一些 PHP iMAP 功能 这是我到目前为止所尝试过的 connect to gmail hostname imap gma
  • C# 删除空url参数正则表达式

    我正在尝试使用 C 从字符串中删除空 url 类型参数 我的代码示例在这里 public static string test string parameters one aa two three aaa four string patte
  • 如何获取带有波纹可绘制的按钮的颜色

    我有各种按钮 我想获取它们的背景颜色 在颜色可绘制中获取背景颜色很容易 但在波纹可绘制中并不容易 我如何设法从波纹可绘制中获取背景颜色 尝试这个 RippleDrawable rippleDrawable RippleDrawable bu
  • 不裁剪项目的虚拟化面板

    因此 如果项目在滚动区域的末尾被剪切 裁剪 那么拥有无镶边的集合看起来真的很愚蠢 我想为集合 ItemsControl ListBox 创建一个虚拟化面板 它只绘制整个项目 而不是项目的各个部分 例如 我不希望显示第三个部分容器 除非有空间
  • Pygame 不返回操纵杆轴移动而不显示

    我见过这个问题的其他解决方案说你要么需要调用 pygame event pump 要么在 while 循环之外初始化操纵杆 然而 即使使用这些解决方案 我得到的操纵杆轴值仍为 0 如果我只取消注释pygame display set mod
  • 类、对象和实例之间的区别

    Java中的类 对象和实例是什么 A class是您用来创建的蓝图objects 一个对象是一个instance类的 它是您使用特定类创建的具体 事物 因此 对象 和 实例 是同一件事 但 实例 一词表示对象与其类的关系 如果你看一个例子就
  • 省略 mtable/outreg 类型表中的一些系数

    我一直在运行一堆不同的回归模型 现在想将它们的估计值放入 LaTeX 表中 为了使不同的规格具有可比性 我想使用那种表格outreg来自rockchalk包或mtable from memisc产生 即其中不同的模型显示在列中 并且这些模型
  • 将 UITextField 格式化为货币

    我的应用程序上有一个 UITextField 它仅接收来自用户的数字输入 此数字输入代表货币 默认值为 0 00 我想创建类似掩码的东西 以便在用户输入数字时格式化 UITextField 例如 9 变成 0 09 美元 99 变成 0 9
  • RemoteViews 的 AppWidget 刷新 Uri

    我创建了一个 Appwidget 它显示一个图像文件 test png 该文件通过 Uri 提供给它的 RemoteViews 在 onUpdate 中 我运行一个更改文件内容的服务 我还为将调用 onUpdate 的图像设置了一个 onC