Android 小部件在 x 时间后更新

2023-12-12

我刚刚开始学习 Android,我正在尝试编写一个小部件,它每秒更新一次计数器,但在某个地方它缺少一些东西。我在屏幕上看到 1。我正在使用 Android 4 模拟器。

package com.ibluekey;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import com.ibluekey.R;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class WidgetActivity extends AppWidgetProvider {
    public static WidgetActivity Widgetke = null;
    public static Context context;
    public static AppWidgetManager appWidgetManager;
    public static int appWidgetIds[];   
    private Handler mHandler = new Handler();
    private static int count=0; 
    @Override
    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )    {     
        if (null == context) context = WidgetActivity.context;
        if (null == appWidgetManager) appWidgetManager = WidgetActivity.appWidgetManager;
        if (null == appWidgetIds) appWidgetIds = WidgetActivity.appWidgetIds;

        WidgetActivity.Widgetke = this;
        WidgetActivity.context = context;
        WidgetActivity.appWidgetManager = appWidgetManager;
        WidgetActivity.appWidgetIds = appWidgetIds;

        Log.d("PXR", "onUpdate");

        final int N = appWidgetIds.length;
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];  

            updateAppWidget(context,appWidgetManager, appWidgetId);            
        }

    }


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

        count++;

        /*Intent intent = new Intent(context, UpdateService.class);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        remoteViews.setOnClickPendingIntent(R.id.mainlayout, pendingIntent);

        remoteViews.setTextViewText(R.id.test_out, ""+count);

        // Tell the widget manager
        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);*/

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
        views.setTextViewText(R.id.test_out, count+"");
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }



    public static class UpdateService extends Service {
        @Override
        public void onStart(Intent intent, int startId) {
            //WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds);
            //Toast.makeText(context, "Update Widget", Toast.LENGTH_SHORT).show();

            WidgetActivity.Widgetke.mHandler.removeCallbacks(WidgetActivity.Widgetke.mUpdateTimeTask);
            WidgetActivity.Widgetke.mHandler.postDelayed(WidgetActivity.Widgetke.mUpdateTimeTask, 100);
        }

        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    }

    private Runnable mUpdateTimeTask = new Runnable() {
           public void run() {         

               WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds);              
               WidgetActivity.Widgetke.mHandler.postAtTime(this, 1000);

           }
        };
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.ibluekey"
      android:versionCode="1"
      android:versionName="1.0">


    <uses-sdk android:minSdkVersion="4" />

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <receiver android:name=".Reciever" android:label="@string/app_name">
            <intent-filter>
                <action android:name="MyTestIntent" />
            </intent-filter>
        </receiver>  
        <receiver android:name="com.ibluekey.WidgetActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data                
                android:name="android.appwidget.provider"
                android:resource="@xml/widgetprovider" />
        </receiver>

        <service android:name="com.ibluekey.WidgetActivity$UpdateService" />
    </application>

</manifest>

这是一个很棒的教程系列,用于在 Android 中创建小部件并定期更新它们。它从这里开始:http://android-er.blogspot.com/2010/10/simple-home-screen-app-widget-with.html

并以循环定时器/闹钟结束:http://android-er.blogspot.com/2010/10/app-widget-using-alarm-manager.html

基本上,您需要在清单中设置一些内容来侦听更新小部件的广播意图。它还展示了如何为小部件创建配置活动。

要创建警报或重复事件,您还可以使用 AlarmManager 类。

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

Android 小部件在 x 时间后更新 的相关文章

随机推荐

  • 为什么 Appbase 在返回正确的项目之前返回“未定义”?

    我正在使用 AppBase io 作为数据库 我不明白为什么这个组件在获取项目后渲染两次 看起来 AppBase 数据库 返回了不明确的第一个和正确的项目然后 有人知道为什么吗 查看示例 其中我得到 2 个日志 在这个组件中 我需要从数据库
  • 扩展 AS3 的数组访问运算符以“包装”越界索引值

    我真的很希望能够使 Flash 的数组访问语法 环绕 数组的边界 冗长的解释 var array Array a b c d e f 为了简单起见 第一个索引是 0 其值是第一个字母 a 为了获得这个值 我们会这样做 array 0 ret
  • 如何读取 HttpServletReponses 输出流?

    我想制作一个 Servlet 过滤器 它将在处理和完成后读取响应的内容 并以 XML 或 PDF 或其他形式返回该信息 但我不确定如何从 HttpServletResponse 对象中获取任何信息 我怎样才能得到这些信息 将其添加到过滤器
  • Xgboost 未与校准分类器一起运行

    我正在尝试使用校准的分类器运行 XGboost 下面是我遇到错误的代码片段 from sklearn calibration import CalibratedClassifierCV from xgboost import XGBClas
  • Android OpenSSL 应用程序拒绝问题

    经过大量研究后 我仍然无法弄清楚我的应用程序的哪一部分使用了 Google 不接受的 OpenSSL 查询以下命令后 我收到的输出为 unzip p MyApp apk strings grep OpenSSL GmsCore OpenSS
  • 如何展开递推式:T(n)=2T((n+2)/3)

    我正在尝试解决这个复发问题 但我不知道如何展开它 T n 2T n 2 3 1 我可以忽略 2 并将其解为 2T n 3 1 吗 这来自一个使用V a b 数组并返回 return V X f V a Y f V Z b Where Y i
  • UIModalTransitionStylePartialCurl 半页

    我通过以下方式显示 UIViewController MyViewController myVc MyViewController alloc initWithNibName MyViewController bundle nil myVc
  • 为什么 libc 有两个版本号(在 Ubuntu 上)?

    如果我在 Docker 中运行这个ubuntu latest root 4304dfbfa661 ls lib x86 64 linux gnu libc l rwxr xr x 1 root root 1868984 Jan 15 02
  • 如何在透视投影场景中使用面法线进行背面剔除

    我正在用 C 编写低级 2D 3D 渲染引擎作为 MCU 平台显示驱动程序的一部分 但我在 3D 透视投影和面部剔除方面遇到了困难 假设我的 3D 引擎正在使用M V P矩阵 与 OpenGL 固定管道中的模型 视图和投影矩阵相同 这个想法
  • 如何定义由其他数据类型组成的数据类型?

    我想定义数据类型Currency 它由其他三种数据类型组成 我遇到的问题是 Haskell 无法将数据类型识别为货币的一部分 这会破坏一切 我的想法是将不同的货币定义为它们自己的数据类型 然后将它们添加到货币类型中 我尝试过 data Eu
  • RecyclerView 中的选定项目在滚动时发生变化

    我有一个 RecyclerView 其中每个元素代表一个事件 我想让用户通过单击来选择事件 选择后 事件和报告按钮将被着色 执行单击之前的 UI 点击这里 UI 执行单击后 点击这里 这非常简单并且据称有效 我设置了一个OnClickLis
  • Firebase 与 Swift 3 计算儿童数量

    我有一个字符串数组 我正在尝试通过 firebase 填充它 它是一个聊天应用程序 当用户创建房间时 他或她会为该房间命名 当用户登录并进入登陆页面时 它会查询他或她正在参与的所有房间 我希望它填充表格视图 在 firebase 文档中 我
  • javascript onclick create(element) div viz 弹出框

    我正在尝试制作一个弹出框 单击按钮即可调用该弹出框 这就是我到目前为止所得到的 http jsfiddle net WGPhG 2 这是一个真正可以做你想做的事情的小提琴 http jsfiddle net WGPhG 6 JS funct
  • PrimeFaces 验证器未触发

    由于 fileLimit 不再存在于 primefaces 3 4 中 我正在尝试解决实现验证器的问题 问题是方法 validate 从未被调用 这是我的验证器 FacesValidator value fileLimitValidator
  • 需要帮助使用 C++ 在 Linux 环境中的现有应用程序中生成击键

    我需要帮助在 LINUX 环境中的现有应用程序中生成击键 我完全知道 Dev C 中有一些库可以完全满足我的需求 但在 Windows 中 我需要在 Linux 中实现类似的功能 我用谷歌搜索了很多 但找不到任何解决方案 下面是 Dev C
  • .htaccess 重写 url 并删除 .php

    我想通过 htaccess 文件从 url 中删除 php 例如home php to home我在 htaccess 文件中使用以下重写规则 RewriteRule 1 php L 我还想重写网址 例如 detail php ca 38
  • C++为类成员函数分配一个lambda函数以提高计算效率[重复]

    这个问题在这里已经有答案了 更新 改写 我希望通过将类成员函数的运行时分配给以其他类成员为条件的许多函数之一来提高代码的计算效率 一种推荐的解决方案使用 include
  • 如何正确地将 Angular 2 (npm) 升级到最新版本?

    最近我开始了 Angular 2 教程https angular io docs ts latest tutorial 并停止了 Angular 2 beta 8 现在我恢复了教程 最新的测试版是测试版 14 如果我只是这样做npm 更新一
  • C# 中的 SafeFileHandle 是什么?何时应该使用它?

    当我还在学习 System IO 时 File Streamclass 的构造函数 我发现存在类型名为的重载构造函数SafeFileHandle 我尝试在互联网和MSDN文档上搜索 但我什么都看不懂 我发现even stranger这样的词
  • Android 小部件在 x 时间后更新

    我刚刚开始学习 Android 我正在尝试编写一个小部件 它每秒更新一次计数器 但在某个地方它缺少一些东西 我在屏幕上看到 1 我正在使用 Android 4 模拟器 package com ibluekey import java tex