首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Architecture组件的AppWidgetProvider

带有Architecture组件的AppWidgetProvider
EN

Stack Overflow用户
提问于 2017-11-14 17:17:06
回答 1查看 1.8K关注 0票数 5

我想用Android体系结构组件实现AppWidgetProvider。

我不确定是否正确地将Widget LifeCycle映射到LifeCycle事件

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

代码语言:javascript
复制
/**
 * 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();
    }
}

还有调度员

代码语言:javascript
复制
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;
            }
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-14 17:52:25

AppWidgetProviderBroadcastReceiver。它没有生命周期。AppWidgetProvider的实例只存在一个回调方法(例如,onUpdate())。因此,不存在到Lifecycle事件的映射,就像没有将Lifecycle事件映射到普通BrodadcastReceiver一样。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47291669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档