Activity | 青训营笔记

87 阅读2分钟

Activity | 青训营笔记

写在前面

这是我参与「第四届青训营 」笔记创作活动的第1天

该笔记为之前断断续续的笔记片段和大项目之后的笔记的整合,复习一些基本知识和在项目中遇到的问题。如有不妥之处,还望予以指正。

知识梳理

Activity 的生命周期

Activity 的生命周期如下图所示(图片来自掘金社区)

Pasted image 20220823120616.png

总共有10个与Activity生命周期有关的函数:onCreate()onStart()onResume()onPause()onStop()onRestart()onDestory()onSaveInstanceState()onRestoreInstanceState()onCreate()

但 Android 会自动管理 Activity 的生命周期,所以在这里,我只记录我在开发过程中接触的较多的部分,如,onCreate()onStart()onResume()onRestart()onDestory()。至于其他,我基本没用过也不好过多讨论。

Activity 最先会经历:被 onCreate() 创建,被 onStart() 调用使其对用户可见,之后一直处于 onResume() 互动状态。

以下就是 onCreate() 的初始代码,我们可以在其中添加相应的代码,来实现我们想要在这一阶段里面想要 Activity 做的事情。若没有,则直接调用父类的方法即可,onStart()onResume() 同理。

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
}

当我们准备离开或者已经离开当前 Activity 时 onPause()onStop() ,Android 会依次调用两个方法,让当前的 Activity 冻结,将资源更多的倾斜向新的 Activity 。(图片来自掘金社区)

16c83bd8fd291052_tplv-t2oaga2asx-zoom-in-crop-mark_3024_0_0_0.webp

新的 Activity 完成其周期后,会调用原 Activity 的 onRestart() 使其重新运行,之后再次执行 onCreate()onStart()onResume()。并且新的 Activity 会销毁 onDestory()

Activity 的启动模式

由于学之尚少,这部分只做了解,不过多深究。在开发过程中,我们是一个 MainActivity 和多个 Fragment,用 SingleInstance 会更好吗?可能吧,但没有特别的需求, Standard 已经足够了。

Standard:标准模式,默认启用的模式,每次激活Activity时都会创建Activity,并放入任务栈中。

SingleTask:栈内复用,栈内已经有该Activity的实例,就重用该实例,并使其返回栈顶,否则在栈顶创建该Activity的实例。

SingleTop:栈顶复用,栈顶存在该Activity的实例, 就重用该实例,否则在栈顶创建该Activity的实例。

SingleInstance:单例模式,在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。

遇到的问题

Activity 未找到

某次修改完 Activity 的名称并移动到另一个包后,在运行程序时报错显示未找到该 Activity。

查看AndroidMainfest.xml 后发现,在修改 Activity 时,该文件内绑定的 Activity 的所在包未及时更新。将包名 .xxx 改为Activity所在包 .xxx.xxx 后,成功运行。

Activity 未设置为 MAIN

某次在独立的包下编写完新的 Activity 代码后,忘记设置新的 Activity 为APP入口,在 AndroidMainfest.xml 中将目标 Activity 的 action 设置为 MAIN 即可。

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>