首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ActivityLifecycleHelper实现

ActivityLifecycleHelper实现
EN

Code Review用户
提问于 2016-11-26 21:43:30
回答 1查看 679关注 0票数 10

描述

ActivityLifecycleHelper使用wrap(Context)创建类并保存全局Application字段。然后,它使用with(ActivityCallbacks)Application字段上注册android.app.Application.ActivityLifecycleCallbacks。每当触发onActivityResumed(Activity)时,该类都调用空OnSaved(Bundle)。每当触发onActivitySaveInstanceState(Activity, Bundle)时,该类都会调用保存/空OnSaved(Bundle)。然后,当触发android.app.Application.ActivityLifecycleCallbacks时,它会取消注册onActivityDestroyed(Activity)。最后,它返回Application字段的基本上下文。

ActivityLifecycleHelper.class

代码语言:javascript
运行
复制
public class ActivityLifecycleHelper {

    public interface ActivityCallbacks {
        void OnSaved(Bundle savedInstance);
    }

    private final Application application;

    private ActivityLifecycleHelper(Application application) {
        this.application = application;
    }

    public static ActivityLifecycleHelper wrap(Context context) {
        return new ActivityLifecycleHelper(assertApplication(context));
    }

    public Context with(final ActivityCallbacks callbacks) {
        application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity a, Bundle b) {}

            @Override
            public void onActivityStarted(Activity a) {}

            @Override
            public void onActivityResumed(Activity a) {
                callbacks.OnSaved(null);
            }

            @Override
            public void onActivityPaused(Activity a) {}

            @Override
            public void onActivityStopped(Activity a) {}

            @Override
            public void onActivitySaveInstanceState(Activity a, Bundle b) {
                callbacks.OnSaved(b);
            }

            @Override
            public void onActivityDestroyed(Activity a) {
                application.unregisterActivityLifecycleCallbacks(this);
            }
        });
        return application.getBaseContext();
    }

    private static Application assertApplication(Context context) {
        final Context application = context.getApplicationContext();
        if (application instanceof Application) return (Application) application;
        throw new NullPointerException("Context must be instance of Application");
    }
}

使用

代码语言:javascript
运行
复制
public class Usage implements ActivityLifecycleHelper.ActivityCallbacks {

    private final Context context;

    Usage(Context context) {
        this.context = ActivityLifecycleHelper.wrap(context).with(this);
    }

    @Override
    public void OnSaved(Bundle savedInstance) {
        // doingit
    }
}

推理

这在库中使用,初始化时,库接收从应用程序扩展的上下文,并将其挂钩到任何活动LifeCycle事件中。

OnResume()将允许库重置某些内容,而onSaveInstanceState()是为了使库能够重新构建。

需要

这种方法是否会适当地注册/注销?有什么不好的设计吗?这会导致任何上下文泄漏吗?

EN

回答 1

Code Review用户

发布于 2017-01-17 14:28:59

是。这似乎是一个糟糕的设计,或者说,考虑到你正在构建一个库项目,它将被其他应用程序使用。

首先,在库初始化中,您应该请求Application引用,而不是Context引用。

例如,

如果您的库有这样的init方法,

MyLibrary.init(Context applicationContext);

然后应该转换为接受这样的Application对象,

MyLibrary.init(Application application);

然后,

在这个init方法中,您应该注册正在实现Application.ActivityLifecycleCallbacks的类。

application.registerActivityLifecycleCallbacks(ActivityLifecycleHelper.getInstance());

确保您的类是singleton。在您的示例中,您的ActivityLifecycleHelper类不是单例,这无疑是一个糟糕的设计模式,因为您正在处理全局级别回调,并且只想初始化一次。

可能是这样的,

代码语言:javascript
运行
复制
public class ActivityLifecycleHelper implements Application.ActivityLifecycleCallbacks {
private static ActivityLifecycleHelper ourInstance = new ActivityLifecycleHelper();

private ActivityLifecycleHelper() {
}

public static ActivityLifecycleHelper getInstance() {
    return ourInstance;
}

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
}

@Override
public void onActivityStarted(Activity activity) {
}

@Override
public void onActivityResumed(Activity activity) {
}

@Override
public void onActivityPaused(Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
}

另外,我不明白你为什么在这里有两门课。Usage类的用例是什么?这两门课的设计似乎有些不对劲。

我希望这能帮到你。如果你想让我详细说明什么,请告诉我。

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

https://codereview.stackexchange.com/questions/148202

复制
相关文章

相似问题

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