Android widget update after x time

和自甴很熟 提交于 2019-12-30 11:09:13

问题


I just started to learn Android, I'm trying to write a widget which is updating the counter in every seconds, but somewhere it's missing something.I'm getting 1 on the screen. I'm using Android 4 emulator.

package com.ibluekey;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import com.ibluekey.R;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class WidgetActivity extends AppWidgetProvider {
    public static WidgetActivity Widgetke = null;
    public static Context context;
    public static AppWidgetManager appWidgetManager;
    public static int appWidgetIds[];   
    private Handler mHandler = new Handler();
    private static int count=0; 
    @Override
    public void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds )    {     
        if (null == context) context = WidgetActivity.context;
        if (null == appWidgetManager) appWidgetManager = WidgetActivity.appWidgetManager;
        if (null == appWidgetIds) appWidgetIds = WidgetActivity.appWidgetIds;

        WidgetActivity.Widgetke = this;
        WidgetActivity.context = context;
        WidgetActivity.appWidgetManager = appWidgetManager;
        WidgetActivity.appWidgetIds = appWidgetIds;

        Log.d("PXR", "onUpdate");

        final int N = appWidgetIds.length;
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];  

            updateAppWidget(context,appWidgetManager, appWidgetId);            
        }

    }


    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
            int appWidgetId) {

        count++;

        /*Intent intent = new Intent(context, UpdateService.class);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
        remoteViews.setOnClickPendingIntent(R.id.mainlayout, pendingIntent);

        remoteViews.setTextViewText(R.id.test_out, ""+count);

        // Tell the widget manager
        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);*/

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
        views.setTextViewText(R.id.test_out, count+"");
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }



    public static class UpdateService extends Service {
        @Override
        public void onStart(Intent intent, int startId) {
            //WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds);
            //Toast.makeText(context, "Update Widget", Toast.LENGTH_SHORT).show();

            WidgetActivity.Widgetke.mHandler.removeCallbacks(WidgetActivity.Widgetke.mUpdateTimeTask);
            WidgetActivity.Widgetke.mHandler.postDelayed(WidgetActivity.Widgetke.mUpdateTimeTask, 100);
        }

        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    }

    private Runnable mUpdateTimeTask = new Runnable() {
           public void run() {         

               WidgetActivity.Widgetke.onUpdate(context, appWidgetManager, appWidgetIds);              
               WidgetActivity.Widgetke.mHandler.postAtTime(this, 1000);

           }
        };
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.ibluekey"
      android:versionCode="1"
      android:versionName="1.0">


    <uses-sdk android:minSdkVersion="4" />

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <receiver android:name=".Reciever" android:label="@string/app_name">
            <intent-filter>
                <action android:name="MyTestIntent" />
            </intent-filter>
        </receiver>  
        <receiver android:name="com.ibluekey.WidgetActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data                
                android:name="android.appwidget.provider"
                android:resource="@xml/widgetprovider" />
        </receiver>

        <service android:name="com.ibluekey.WidgetActivity$UpdateService" />
    </application>

</manifest>

回答1:


Here is a great tutorial series for creating widgets in Android and updating them at intervals. It starts here: http://android-er.blogspot.com/2010/10/simple-home-screen-app-widget-with.html

And ends here with a recurring timer/alarm: http://android-er.blogspot.com/2010/10/app-widget-using-alarm-manager.html

Basically you need to setup some things in the manifest to listen for a broadcasted intent which updates the widget. It also shows how to create a config activity for the widget.

To create alarms or recurring events you can also use the AlarmManager class.




回答2:


after

appWidgetManager.updateAppWidget(appWidgetId, views);

add this

super.onUpdate(context, appWidgetManager, appWidgetId);

i believe this will solve your problem



来源:https://stackoverflow.com/questions/8287796/android-widget-update-after-x-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!