微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我的应用程序有一个显示今天日期的小部件,需要在午夜更新.窗口小部件在清单中定义为
<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,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没有坏处).

我尝试从几个地方(从应用程序的主要活动,从appwidgetprovider的onUpdate()等)调用setMidnightAlarms().一切运行良好,接收到警报管理器意图,并且只有应用程序运行时才更新窗口小部件.如果我杀了应用程序,小部件会在午夜停止更新.

知道如何让小部件在午夜更新吗?我需要添加服务吗?如果是这样的话?任何例子?

我有点惊讶的是,让这个基本功能起作用是多么微不足道.

解决方法

解决了这个问题:

>启动服务以侦听Intent.ACTION_TIME_TICK消息.
然后,如果Time TICKED,则向小部件发送广播. (每分钟).
>接收小部件中的广播,并通过以下方式判断天气是午夜:

码:

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.
        }
    }

原文地址:https://www.jb51.cc/android/314856.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐