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
字段的基本上下文。
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");
}
}
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()
是为了使库能够重新构建。
这种方法是否会适当地注册/注销?有什么不好的设计吗?这会导致任何上下文泄漏吗?
发布于 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
类不是单例,这无疑是一个糟糕的设计模式,因为您正在处理全局级别回调,并且只想初始化一次。
可能是这样的,
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
类的用例是什么?这两门课的设计似乎有些不对劲。
我希望这能帮到你。如果你想让我详细说明什么,请告诉我。
https://codereview.stackexchange.com/questions/148202
复制相似问题