准确更新Android小部件的最佳方法是什么?

时间:2014-04-23 07:36:03

标签: android android-widget

我有一个带小部件的应用程序,我不需要定期更新它,除了一次正好在0:00:00。

因此,我设置 android:updatePeriodMillis="0" 以节省设备电量,但每天进行一次更新的最佳做法是什么?

1 个答案:

答案 0 :(得分:3)

我的解决方案,基于AlarmManager

public class Widget extends AppWidgetProvider {
public static String ACTION_AUTO_UPDATE_WIDGET = "ACTION_AUTO_UPDATE_WIDGET";

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    Intent intent = new Intent(Widget.ACTION_AUTO_UPDATE_WIDGET);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MILLISECOND, 1);

    AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmMgr.setInexactRepeating(AlarmManager.RTC, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
}

@Override
public void onDisabled(Context context) {
    super.onDisabled(context);

    Intent intent = new Intent(Widget.ACTION_AUTO_UPDATE_WIDGET);
    AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmMgr.cancel(PendingIntent.getBroadcast(context, 0, intent, 0));
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    if (ACTION_AUTO_UPDATE_WIDGET.equals(intent.getAction())) {
        // do something useful here
        Toast.makeText(context, ACTION_AUTO_UPDATE_WIDGET, Toast.LENGTH_LONG).show();
    }
}
}
清单中的

小部件:

        <receiver
        android:name=".Widget"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="ACTION_AUTO_UPDATE_WIDGET" />
        </intent-filter>

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