【问题标题】:Lags on widget update小部件更新滞后
【发布时间】:2012-06-02 00:00:58
【问题描述】:

我很感兴趣在这里构建一个简单的时钟小部件。我想知道最好的做法是什么?大多数时候它工作正常,但有些人说我的时钟小部件落后了。实际时间是上午 10 点,然后我的小部件显示可能是上午 9 点 48 点

我的清单上有这个

    <receiver
        android:name="my.package.name.MyClock"
        android:label="@string/widget_name">

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

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


    <service
        android:name="MyClock$UpdateService"
        android:label="UpdateService" >
        <intent-filter>
            <action android:name="my.package.name.UPDATE" />
        </intent-filter>             
    </service>

这是我的主要 java 类

公共类 MyClock 扩展 AppWidgetProvider {

@Override
public void onDisabled(Context context) {
    super.onDisabled(context);
    context.stopService(new Intent(context, UpdateService.class));
}

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    context.startService(new Intent(UpdateService.ACTION_UPDATE));
}    

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    context.startService(new Intent(UpdateService.ACTION_UPDATE));
} 

public static final class UpdateService extends Service {
    static final String ACTION_UPDATE = "my.package.name.UPDATE";

    private final static IntentFilter sIntentFilter;

    private String mMinuteFormat;
    private String mHourFormat;

    private Calendar mCalendar;

    static {
        sIntentFilter = new IntentFilter();
        sIntentFilter.addAction(Intent.ACTION_TIME_TICK);
        sIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        sIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        reinit();
        registerReceiver(mTimeChangedReceiver, sIntentFilter);
    }

  @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mTimeChangedReceiver);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        reinit();
        update();
    }

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

    private void update() {
        mCalendar.setTimeInMillis(System.currentTimeMillis());
        final CharSequence minute = DateFormat.format(mMinuteFormat, mCalendar);
        final CharSequence hour = DateFormat.format(mHourFormat, mCalendar);

        RemoteViews views = null;             views = new RemoteViews(getPackageName(), R.layout.main);
        views.setTextViewText(R.id.HOUR, hour);
        views.setTextViewText(R.id.MINUTE, minute);                   

        //Refresh the widget
        ComponentName widget = new ComponentName(this, MyClock.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(widget, views);          
    }    

    private void reinit() {
        mHourFormat = "hh";
        mMinuteFormat = "mm";            
    }

    private final BroadcastReceiver mTimeChangedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (action.equals(Intent.ACTION_TIME_CHANGED) ||
                action.equals(Intent.ACTION_TIMEZONE_CHANGED))
            {
                reinit();

            }

            update();

        }
    };

}     }

我错过了什么?为什么小部件落后了? 你能帮我发现这里的问题吗? 我在做正确的方法吗?使用 Service 而不是 AlarmManager 每分钟更新时钟小部件?

问候

【问题讨论】:

    标签: android widget


    【解决方案1】:

    可能导致此问题的原因有很多,但最有可能的是服务被系统杀死。没有办法防止后台服务被系统杀死,只有让它成为前台服务在大多数时候是安全的,但是通知图标对用户来说很烦人。

    我认为使用AlarmManager 会是最好的,我最近也使用这种技术更新了我的时钟小部件。由于 AlarmManager 进行广播,即使您的应用程序被杀死,它也会在发送之前重新创建它。

    【讨论】:

    • 嗨,xandy,您的解释似乎是正确的。起初我以为我从未在更新过程中设置 widgetID。如果您建议使用 AlarmManager,则意味着它会在每分钟内执行一次。可以吗?电池使用情况如何?是更高效还是更消耗精力?
    • 似乎更费力。但是,如果您在几分钟内完成,那将不是问题。
    • 所以,只是为了确保 AlarmManager 适合每分钟更新一次的数字时钟小部件?
    • 是的,记得使用 RTC 而不是 RTC_WAKEUP
    • 谢谢。我会尝试使用 AlarmManager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2014-08-21
    • 2017-03-27
    相关资源
    最近更新 更多