具有Android体系结构组件的AppWidgetProvider [英] AppWidgetProvider with Android Architecture Component

查看:64
本文介绍了具有Android体系结构组件的AppWidgetProvider的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过AppWidgetProvider实现 Android体系结构组件./p>

我不确定将Widget LifeCycle正确映射到生命周期事件.

我创建了一个BaseAppWidgetProvider来由我的小部件扩展:

 /*** {@link BaseAppWidgetProvider}的基类,用于管理{@link生命周期}*/公共抽象类BaseAppWidgetProvider扩展了AppWidgetProvider实现的LifecycleOwner {私有最终AppWidgetProviderLifecycleDispatcher mDispatcher = new AppWidgetProviderLifecycleDispatcher(this);公共BaseAppWidgetProvider(){mDispatcher.onConstructor();}@CallSuper@Override公共无效onUpdate(上下文上下文,AppWidgetManager appWidgetManager,int [] appWidgetIds){mDispatcher.onUpdate();super.onUpdate(上下文,appWidgetManager,appWidgetIds);}@CallSuper@Overridepublic void onDeleted(Context context,int [] appWidgetIds){mDispatcher.onDeleted();super.onDeleted(上下文,appWidgetIds);}@CallSuper@Override公共无效onEnabled(上下文上下文){mDispatcher.onEnabled();super.onEnabled(上下文);}@CallSuper@Overridepublic void onDisabled(Context context){mDispatcher.onDisabled();super.onDisabled(上下文);}@CallSuper@Override公共无效onRestored(上下文上下文,int [] oldWidgetIds,int [] newWidgetIds){mDispatcher.onRestored();super.onRestored(上下文,oldWidgetIds,newWidgetIds);}@CallSuper@Overridepublic void onAppWidgetOptionsChanged(上下文上下文,AppWidgetManager,appWidgetManager,int appWidgetId,bundle newOptions){mDispatcher.onAppWidgetOptionsChanged();super.onAppWidgetOptionsChanged(上下文,appWidgetManager,appWidgetId,newOptions);}@NonNull@Override公共生命周期getLifecycle(){返回mDispatcher.getLifecycle();}} 

调度员

 公共类AppWidgetProviderLifecycleDispatcher {最终的生命周期注册表私有注册表;私有最终处理程序mHandler;专用DispatchRunnable mLastDispatchRunnable;/***服务的@param提供者{@link LifecycleOwner},通常是服务本身*/公共AppWidgetProviderLifecycleDispatcher(@NonNull LifecycleOwner提供者){mRegistry =新的LifecycleRegistry(提供者);mHandler = new Handler();}私人空白postDispatchRunnable(Lifecycle.Event事件){Timber.d("postDispatchRunnable event =" + event);如果(mLastDispatchRunnable!= null){mLastDispatchRunnable.run();}mLastDispatchRunnable =新的DispatchRunnable(mRegistry,event);mHandler.postAtFrontOfQueue(mLastDispatchRunnable);}/***即使在超级调用之前,也必须是{@link android.appwidget.AppWidgetProvider#AppWidgetProvider()}构造函数中的第一个调用.*/public void onConstructor(){postDispatchRunnable(Lifecycle.Event.ON_CREATE);postDispatchRunnable(Lifecycle.Event.ON_START);}/***必须是{@link android.appwidget.AppWidgetProvider#onDeleted(Context,int [])}方法中的第一个调用,即使在super.onDeleted调用之前也是如此.*/公共无效onDeleted(){postDispatchRunnable(Lifecycle.Event.ON_PAUSE);postDispatchRunnable(Lifecycle.Event.ON_STOP);postDispatchRunnable(Lifecycle.Event.ON_DESTROY);}/***必须是{@link android.appwidget.AppWidgetProvider#onDisabled(Context)}方法中的首次调用,即使在super.onDisabled调用之前也是如此.*/公共无效onDisabled(){postDispatchRunnable(Lifecycle.Event.ON_PAUSE);postDispatchRunnable(Lifecycle.Event.ON_STOP);postDispatchRunnable(Lifecycle.Event.ON_DESTROY);}/***必须是{@link android.appwidget.AppWidgetProvider#onEnabled(Context)}方法中的首次调用,即使在super.onEnabled调用之前也是如此.*/公共无效onEnabled(){postDispatchRunnable(Lifecycle.Event.ON_CREATE);postDispatchRunnable(Lifecycle.Event.ON_START);}/***必须是{@link android.appwidget.AppWidgetProvider#onRestored(Context,int [],int [])}方法中的首次调用,即使在super.onRestored调用之前也是如此.*/公共无效onRestored(){postDispatchRunnable(Lifecycle.Event.ON_CREATE);postDispatchRunnable(Lifecycle.Event.ON_START);}/***即使在super.onUpdate调用之前,也必须是{@link android.appwidget.AppWidgetProvider#onUpdate(Context,AppWidgetManager,int [])}方法中的首次调用.*/公共无效onUpdate(){postDispatchRunnable(Lifecycle.Event.ON_RESUME);}/***给定的{@link LifecycleOwner} @return {@link Lifecycle}*/公共生命周期getLifecycle(){返回注册表}public void onAppWidgetOptionsChanged(){postDispatchRunnable(Lifecycle.Event.ON_RESUME);}静态类DispatchRunnable实现Runnable {最终的生命周期注册表私有注册表;最后的Lifecycle.Event mEvent;私有布尔值mWasExecuted = false;DispatchRunnable(@NonNull LifecycleRegistry注册表,Lifecycle.Event事件){mRegistry =注册表;mEvent =事件;}@Override公共无效run(){如果(!mWasExecuted){mRegistry.handleLifecycleEvent(mEvent);mWasExecuted = true;}}}} 

解决方案

AppWidgetProvider BroadcastReceiver .它没有生命周期.您的 AppWidgetProvider 实例仅可用于一种回调方法(例如, onUpdate()).因此,没有到 Lifecycle 事件的映射,就像没有 Lifecycle 事件到普通的 BrodadcastReceiver 的映射一样.

I want to implement Android Architecture Component with AppWidgetProvider.

I'm not sure to map properly Widget LifeCycle to LifeCycle events.

I created a BaseAppWidgetProvider to be extented by my widgets:

/**
 * Base class for {@link BaseAppWidgetProvider} to manage {@link Lifecycle}
 */

public abstract class BaseAppWidgetProvider extends AppWidgetProvider implements LifecycleOwner {
    private final AppWidgetProviderLifecycleDispatcher mDispatcher = new AppWidgetProviderLifecycleDispatcher(this);

    public BaseAppWidgetProvider(){
        mDispatcher.onConstructor();
    }

    @CallSuper
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        mDispatcher.onUpdate();
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    }

    @CallSuper
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        mDispatcher.onDeleted();
        super.onDeleted(context, appWidgetIds);
    }

    @CallSuper
    @Override
    public void onEnabled(Context context) {
        mDispatcher.onEnabled();
        super.onEnabled(context);
    }

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

    @CallSuper
    @Override
    public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
        mDispatcher.onRestored();
        super.onRestored(context, oldWidgetIds, newWidgetIds);
    }

    @CallSuper
    @Override
    public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
        mDispatcher.onAppWidgetOptionsChanged();
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mDispatcher.getLifecycle();
    }
}

And the dispatcher

public class AppWidgetProviderLifecycleDispatcher {
    private final LifecycleRegistry mRegistry;
    private final Handler mHandler;
    private DispatchRunnable mLastDispatchRunnable;


    /**
     * @param provider {@link LifecycleOwner} for a service, usually it is a service itself
     */
    public AppWidgetProviderLifecycleDispatcher(@NonNull LifecycleOwner provider) {
        mRegistry = new LifecycleRegistry(provider);
        mHandler = new Handler();
    }
    private void postDispatchRunnable(Lifecycle.Event event) {
        Timber.d("postDispatchRunnable event="+event);
        if (mLastDispatchRunnable != null) {
            mLastDispatchRunnable.run();
        }
        mLastDispatchRunnable = new DispatchRunnable(mRegistry, event);
        mHandler.postAtFrontOfQueue(mLastDispatchRunnable);
    }


    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#AppWidgetProvider()} constructor, even before super call.
     */
    public void onConstructor(){
        postDispatchRunnable(Lifecycle.Event.ON_CREATE);
        postDispatchRunnable(Lifecycle.Event.ON_START);
    }

    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#onDeleted(Context, int[])} method, even before super.onDeleted call.
     */
    public void onDeleted(){
        postDispatchRunnable(Lifecycle.Event.ON_PAUSE);
        postDispatchRunnable(Lifecycle.Event.ON_STOP);
        postDispatchRunnable(Lifecycle.Event.ON_DESTROY);
    }

    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#onDisabled(Context)} method, even before super.onDisabled call.
     */
    public void onDisabled(){
        postDispatchRunnable(Lifecycle.Event.ON_PAUSE);
        postDispatchRunnable(Lifecycle.Event.ON_STOP);
        postDispatchRunnable(Lifecycle.Event.ON_DESTROY);
    }

    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#onEnabled(Context)} method, even before super.onEnabled call.
     */
    public void onEnabled(){
        postDispatchRunnable(Lifecycle.Event.ON_CREATE);
        postDispatchRunnable(Lifecycle.Event.ON_START);
    }


    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#onRestored(Context, int[], int[])} method, even before super.onRestored call.
     */
    public void onRestored(){
        postDispatchRunnable(Lifecycle.Event.ON_CREATE);
        postDispatchRunnable(Lifecycle.Event.ON_START);
    }

    /**
     * Must be a first call in {@link android.appwidget.AppWidgetProvider#onUpdate(Context, AppWidgetManager, int[])} method, even before super.onUpdate call.
     */
    public void onUpdate(){
        postDispatchRunnable(Lifecycle.Event.ON_RESUME);
    }

    /**
     * @return {@link Lifecycle} for the given {@link LifecycleOwner}
     */
    public Lifecycle getLifecycle() {
        return mRegistry;
    }

    public void onAppWidgetOptionsChanged() {
        postDispatchRunnable(Lifecycle.Event.ON_RESUME);
    }

    static class DispatchRunnable implements Runnable {
        private final LifecycleRegistry mRegistry;
        final Lifecycle.Event mEvent;
        private boolean mWasExecuted = false;
        DispatchRunnable(@NonNull LifecycleRegistry registry, Lifecycle.Event event) {
            mRegistry = registry;
            mEvent = event;
        }
        @Override
        public void run() {
            if (!mWasExecuted) {
                mRegistry.handleLifecycleEvent(mEvent);
                mWasExecuted = true;
            }
        }
    }

}

解决方案

An AppWidgetProvider is a BroadcastReceiver. It does not have a lifecycle. An instance of your AppWidgetProvider lives for exactly one callback method (e.g., onUpdate()). Hence, there is no mapping to Lifecycle events, just as there is no mapping of Lifecycle events to an ordinary BrodadcastReceiver.

这篇关于具有Android体系结构组件的AppWidgetProvider的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆