Question

I have an application with widget, and I don't need to update it periodically, besides one time exactly at 0:00:00.

So, I set android:updatePeriodMillis="0" to save device battery, but what is a best practice to do one update per day?

Was it helpful?

Solution

my solution, based on 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();
    }
}
}

widget in manifest:

        <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>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top