RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1579828
Accepted
federk
federk
Asked:2024-05-11 20:00:07 +0000 UTC2024-05-11 20:00:07 +0000 UTC 2024-05-11 20:00:07 +0000 UTC

每隔几秒定期更新 Android 小部件中的 TextView 值

  • 772

请告诉我如何正确实现 Android 中小部件的 TextView 每隔几秒更新(分配新值)?由于每 30 分钟更新一次小部件的限制,内置 updatePeriodMillis 参数不适合。小部件中的文本必须每隔几秒更改一次。

如何正确且最佳地执行此任务:为了最大限度地减少电池消耗,以便计时器更新仅在小部件在活动且打开的屏幕上可见时才起作用,而在其他情况下(正在运行的应用程序、关闭的应用程序)或锁定屏幕、打开设置等)- 小部件更新被禁用?

Android Studio 默认创建了一个简单的 NewAppWidget 小部件:

package com.dev.app;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;

/**
 * Implementation of App Widget functionality.
 */
public class NewAppWidget extends AppWidgetProvider {

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        CharSequence widgetText = WidgedDataGenerator.getWidgetString();
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
        views.setTextViewText(R.id.appwidget_text, widgetText);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void onDisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }
}

新值是通过WidgedDataGenerator.getWidgetString()生成的。TextView 中的文本必须每 2 或 20 秒更新一次(取决于应用程序设置中的值),同时消耗最少的资源。

java
  • 2 2 个回答
  • 113 Views

2 个回答

  • Voted
  1. Deniska SosiSka
    2024-05-15T13:33:39Z2024-05-15T13:33:39Z

    您可以考虑使用UsageStatsManager的选项,通过它您可以接收手机使用统计信息,并根据它启用/禁用小部件更新。


    但一般来说,使用(更多信息请参见网络)选项 cBroadcastReceiver来拦截屏幕打开和关闭事件Handler以及Runnable更新小部件会更容易。

    以下代码是根据公开示例编译的,仅供粗略演示,可能包含错误:

    • 拦截屏幕打开和关闭事件:
    public class ScreenReceiver extends BroadcastReceiver {
    
        private static boolean isScreenOn = false;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                isScreenOn = true;
                startWidgetUpdater(context);
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                isScreenOn = false;
            }
        }
    
        public static boolean isScreenOn() {
            return isScreenOn;
        }
    
        private void startWidgetUpdater(Context context) {
            Intent intent = new Intent(context, WidgetUpdaterService.class);
            context.startService(intent);
        }
    }
    
    • 小部件更新服务(poke、tap):
    public class WidgetUpdaterService extends Service {
    
        private static final int UPDATE_INTERVAL = 2000; // 2 секунды
    
        private Handler mHandler = new Handler();
        private Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                if (ScreenReceiver.isScreenOn()) {
                    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
                    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(getApplicationContext(), NewAppWidget.class));
                    for (int appWidgetId : appWidgetIds) {
                        NewAppWidget.updateAppWidget(getApplicationContext(), appWidgetManager, appWidgetId);
                    }
                    mHandler.postDelayed(this, UPDATE_INTERVAL);
                }
            }
        };
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            mHandler.post(mRunnable);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            mHandler.removeCallbacks(mRunnable);
        }
    }
    
    • 注册接收者和服务:
    <receiver android:name=".ScreenReceiver">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_ON"/>
            <action android:name="android.intent.action.SCREEN_OFF"/>
        </intent-filter>
    </receiver>
    
    <service android:name=".WidgetUpdaterService"/>
    
    • 让我们在创建小部件时添加一个服务启动:
    public class NewAppWidget extends AppWidgetProvider {
    
        @Override
        public void onEnabled(Context context) {
            super.onEnabled(context);
            context.startService(new Intent(context, WidgetUpdaterService.class));
        }
    
        // ...
    }
    
    • 1
  2. Best Answer
    Falchio
    2024-05-18T04:41:46Z2024-05-18T04:41:46Z

    YouTube上有一个视频,其中包含一个完全可以运行的应用程序。不幸的是,作者并不太详细。但有一个指向小部件更新来源的链接。

    我无法让小部件每秒更新一次,但它确实每两秒左右更新一次。

    要更新小部件,请使用AlarmManager.

    • 1

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5