【问题标题】:Why manage lifecycle through Application class?为什么要通过 Application 类来管理生命周期?
【发布时间】:2015-01-09 16:31:50
【问题描述】:

我正在查看聊天演示应用程序的代码,我注意到他们创建了一个扩展应用程序的类,并且在 onCreate() 内部是以下行

registerActivityLifecycleCallbacks(new ActivityLifecycleHandler());

然后我查看了 ActivityLifecycleHandler 类,有类似的方法

public void onActivityDestroyed(Activity activity) {
}
public void onActivityPaused(Activity activity) {
}
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
public void onActivityStarted(Activity activity) {
}

然后在所有 Activity 类文件中,在 onPause() 中——也在 onStart()、onResume() 等中——例如来自 Application 类的生命周期将被引用。

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Application.activityPaused();
}

我想知道这是什么以及它的作用?这是否意味着 onPause() 适用于 Activity 而 Application.acitvityPaused() 适用于整个应用程序?他们这样做有什么优势吗?我不明白这是什么意思。提前致谢。

【问题讨论】:

  • 对于投反对票的人,您知道在活动与应用程序类中管理生命周期之间的区别吗?因为您在对该问题投反对票时没有提供任何答案。
  • 是的,愚蠢的投反对票。我已经做了我想支持的事情。完全合理的问题。
  • 谢谢西蒙。我很感激。

标签: android callback activity-lifecycle


【解决方案1】:

我不知道,但刚刚用 Google 搜索过。检查来源。

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/app/Application.java.

你可以看到,这只是调用你的回调方法,没有进一步的处理。 cmets 还表明它的设计用途是用于处理状态持久性。

因此,您可以通过创建一个 Activity 基类来实现相同的目的,该基类提供对活动回调的覆盖,然后从此扩展您的所有活动。

public class BaseActivity extends Activity{
    @override
    public void onCreate(){
          super.onCreate(); // calls the framework method
    }
}

public class Activity1 extends BaseActivity{
    @override
    public void onCreate(){
         super.onCreate(); // calls the base method which in turn calls the framework method
         ...
    }
}

public class Activity2 extends BaseActivity{
    @override
    public void onCreate(){
         super.onCreate();
         ...
    }
}

这些方法将被所有活动调用,无论它们是否扩展了基类。所以这个类生命周期将自动进行这些回调,而无需您做更多的事情。请注意,它只扩展Activity,而不是BaseActivity

public class Activity3 extends Activity{
     @override
     public void onCreate(){
          super.onCreate();
          ...
     }
 }

由于在 Java 中不能有多重继承,如果一个 Activity 需要为所有 Activity 扩展基类以外的东西,你将不得不开始链接回调,这可能会很快变得混乱。

最后,由于ActivityLifecycleCallbacks 是一个接口,并且由于您可以注册该接口的多个实现,您可以有一组回调来管理应用程序状态,另一组来管理用户状态,也许还有一个来管理服务或资源处理等等,而不必在单个回调方法中混合该代码。

【讨论】:

  • 您帮助我更了解了这一点。例如,一个聊天应用程序有会话。在应用程序引用的生命周期类中,我可以在活动生命周期的适当时间只用一行代码管理整个应用程序中的会话。这只是一个有用的例子,对吧?我想我明白为什么代码在那里,虽然不完整。但是该设置非常适合我刚才描述的场景。谢谢!
  • 正是如此。您将实现它,然后创建一个处理 onPause() 的方法,并且每个活动都会调用该方法,无论它是否继承了基类。
  • 哈!杰出的。谢谢你。这对我来说真的很好。干杯!
  • @Simon:非常感谢您对垃圾邮件答案的帮助,但在未来,请不要从答案中编辑垃圾邮件。它只会让模组的生活变得更加艰难(他们必须筛选帖子历史以找出发生了什么),并且一旦帖子被垃圾邮件删除,系统就会自动编辑内容。
  • 知道了。感谢您的审核。
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多