2

Why does my Android time widget doesn't update on its own? I created a time & date widgets for home screen but the problem is that my time widget is only updated if the screen orientation is changed for example from landscape to portrait.. It should be auto updated in real time mode.. Here's my code:

public class PointlessWidget extends AppWidgetProvider {
    Time mCalendar;
    float mMinutes;
    float mHour;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);

        mCalendar = new Time();

        // Line below sets time that will be displayed - modify if needed.
        mCalendar.setToNow();


        int hour = mCalendar.hour;
        int minute = mCalendar.minute;
        int second = mCalendar.second;

        mMinutes = minute + second / 60.0f;
        mHour = hour + minute / 60.0f;

        final int N = appWidgetIds.length;

        for (int i = 0; i < N; i++) {
            int awID = appWidgetIds[i];
            RemoteViews v = new RemoteViews(context.getPackageName(),
                    R.layout.widget);

            v.setTextViewText(R.id.textHour, " " + hour);
            v.setTextViewText(R.id.textMinute, " " + minute);

            appWidgetManager.updateAppWidget(awID, v);
        }
    }

     @Override
     public void onDeleted(Context context, int[] appWidgetIds) {
     // TODO Auto-generated method stub
     super.onDeleted(context, appWidgetIds);

     Toast.makeText(context, "Widget Deleted!", Toast.LENGTH_SHORT).show();
     }

}

And here is my manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidwidgets"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

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

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

        <activity android:name=".WidgetsConfig" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>
    </application>

</manifest>

And this is my widget_stuff xml. I already set the updatePeriodMillis="1000" or equivalent to 1 sec in conversion.

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget"
    android:minHeight="30dp"
    android:minWidth="274dp"
    android:updatePeriodMillis="1000" >

</appwidget-provider>
Zohaib Amir
  • 3,482
  • 2
  • 11
  • 29
  • Check this solution http://stackoverflow.com/questions/2078122/android-widget-not-updating I think you should be waiting for 30 mins – Girish Nair Oct 29 '12 at 04:36

2 Answers2

2

For update your time widget use AlarmManager class.

Or

you can use background service for update your time widget.

Arvind Kanjariya
  • 2,089
  • 1
  • 18
  • 23
2

I already figured out the solution in my problem.. And for the sake of others with the same problem as mine I will share my codes:

import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;

public class DigitalClock extends Activity {
    private Runnable updateTimeTask;
    private Handler handler;

    public static final int TIME_UPDATE_INTERVAL_MSEC = 1000;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (updateTimeTask == null) {
            updateTimeTask = new Runnable() {
                @Override
                public void run() {
                    // if (!DigitalClock.this.isActive()) return;

                    timeAndDate();
                    handler.postDelayed(this, TIME_UPDATE_INTERVAL_MSEC);
                }
            };
        }
        if (handler == null) {
            handler = new Handler();
        }
        handler.removeCallbacks(updateTimeTask);
        handler.postDelayed(updateTimeTask, TIME_UPDATE_INTERVAL_MSEC);
    }

    public void timeAndDate() {
        Calendar c = Calendar.getInstance();

        SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss");
        SimpleDateFormat date = new SimpleDateFormat("MMMM dd yyyy");
        SimpleDateFormat day = new SimpleDateFormat("EEEE");
        SimpleDateFormat am_pm = new SimpleDateFormat("aa");
        String sTime = time.format(c.getTime());
        String sDate = date.format(c.getTime());
        String sDay = day.format(c.getTime());
        String sAm_Pm = am_pm.format(c.getTime());

        // formattedDate have current date/time
        Toast.makeText(this, sDate + " | " + sTime, Toast.LENGTH_SHORT).show();

        // Now we display value in TextView
        TextView txtTime = (TextView) findViewById(R.id.txtHour);
        TextView txtDay = (TextView) findViewById(R.id.txtDay);
        TextView txtDate = (TextView) findViewById(R.id.txtDate);
        TextView txtAm_Pm = (TextView) findViewById(R.id.txtAm_Pm);

        txtTime.setText(sTime);
        txtDate.setText(sDate);
        txtDay.setText(sDay);
        txtAm_Pm.setText(sAm_Pm);
    }
}