如何在午夜更新应用小部件?

7

我的应用程序有一个小部件,显示今天的日期并需要在午夜时更新。该小部件在清单中定义为

<manifest>
    ...
    <application>
        ...
        <receiver
            android:name=".MyWidgetProviderClass"
            android:label="MyLabel" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_icon_info" />
        </receiver>
    </application>
</manifest>

小部件信息文件是

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/my_layout"
    android:minHeight="40dp"
    android:minWidth="294dp"
    android:updatePeriodMillis="3600000" >
</appwidget-provider>

这个小部件的更新时间在午夜到下午1点之间随机发生,但我希望它能在更接近午夜的时候进行更新,因此我添加了一个意图接收器。

<receiver
     android:name=".MyWidgetUpdaterClass"
     android:enabled="true" >
     <intent-filter>
         <action android:name="MyAction" />
      </intent-filter>
</receiver>

以及一个静态方法

public static void setMidngintAlarms(Context context) {
    Intent intent = new Intent("MyAction");
    PendingIntent pendingIntent = 
        PendingIntent.getBroadcast(context, 0, intent, 0);              
    long interval = 24*60*60*1000;        
    long firstTime = SystemClock.elapsedRealtime() + 
        millisecondsToNextMidnight();
    AlarmManager am = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    firstTime, interval, pendingIntent);
}

(由于闹钟管理器使用相同的意图请求会相互覆盖,因此多次调用setMidngintAlarms没有坏处。)我尝试从几个位置调用setMidnightAlarms()(从应用程序的主活动中,从AppWidgetProvider的onUpdate()等)。一切都很顺利,闹钟管理器意图被接收并更新小部件,但只要应用程序运行。如果我杀死应用程序,小部件在午夜停止更新。 有什么办法在午夜时更新小部件吗?我需要添加一个服务吗?如果需要,怎样添加?有任何例子吗? 我有点惊讶这个基本功能如此复杂需要这么久才能工作。

小部件应该仍然更新,因为你为它设置了一个闹钟。因此,无论应用程序是否在运行中都没有关系。但如果设备重新启动并且你没有从一开始注册闹钟,那就有关系了。 - coder_For_Life22
当设置了一个重复的闹钟并且从未明确取消时,安卓系统在什么情况下会取消它(如果有的话)?我找不到相关信息。例如,它是否与发送它的活动或服务相关,还是独立地永远存在? - user1076637
2个回答

0

将此添加到您的清单小部件接收器中

 <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            <action android:name="android.intent.action.DATE_CHANGED" />...

日期的更改将触发您的onReceive()函数,携带着"android.intent.action.DATE_CHANGED"的动作(action)


0
我通过以下方式解决了这个问题:
  1. 启动一个服务来监听Intent.ACTION_TIME_TICK消息。 每分钟检测Time TICKED,然后向小部件发送广播。

  2. 在小部件中接收广播,并判断是否为午夜:

代码:

   if (MyWidget.BROADCAST_TIME_TICK.equals(action)) {
        //If it's midnight, then update.
        int hour = Calendar.getInstance().get(Calendar.HOUR);
        int minute = Calendar.getInstance().get(Calendar.MINUTE);
        Utils.log(TAG, "time is : " + hour+":" + minute);
        if (!(hour == 0 && minute == 0)) {  //Only update at midnight's time tick.
            return;
        } else {
            //Do the midnight stuff.
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接