略过文绉绉的文档,直接说有用的。通常我都是在需要生成Activity的单例的情境下才会关注Activity的生命周期,这篇博文会总结下实现Activity单例的方法以及业务逻辑的整合。
先谈谈单例,有两种方法可以实现Activity的单例,一种是编辑AndroidManifest.xml
<activity android:name=".ShareActivity" android:launchMode="singleInstance"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
重点是android:launchMode="singleInstance"这一句,关于launchMode的解说,这篇文章是我见过的总结得最好的:
接着谈谈业务逻辑的整合,我遇到的场景是一个Activity需要显示新闻,不一定是从新闻列表跳转过去,也可能从一个新闻跳到另一个新闻,如果没有单例的话,内存可能会被吃光。所以我使用单例,并且需要Activity“在恰当的时机知道要刷新页面”。那么这个时机如何找呢?
让我们看一张Android Activity时序图:
从上图可以看出onCreate虽然是最先调用的,但是后面还有两个更有用的回调,两者都是从后台转到前台时调用,其中onStart()是从“停止”过来的,而onResume则是从“被挡住”过来的,我觉得onResume更加符合需求。
于是我在onResume里面判断是否需要刷新,这个问题就解决了。