在做一个android应用项目中,遇到一个问题, 用monkey测试时, 偶然报异常"Receiver not registered",仔细查看log,思考一番,这可能与注册和注销Receiver时间不对有关。修改代码修复了错误。借此, 对android的Activity组件做个小结。
下图是官网给出的Activity生命周期
先尝试翻译一段官网API介绍。
在Activity中有3个关键的循环需要注意:
1.整个生命周期,Activity整个生命周期开始于第一次调用onCreate(Bundle), 终止于调用onDestroy(). 一个Activity将会在onCreate()方法里面建立好全局状态,在onDestroy()方法里面释放剩下的资源。举个例子,如果一个Activity中运行个后台线程从网络上下载数据,那么这个线程可能会是在onCreate()里面创建,在onDestroy()销毁。
2.可视生命周期, Activity的可视时间在调用onStart()后, 直到调用对应的onStop()之间。这段时间内,用户可以在屏幕上看到Activity,但是Activity有可能没有在前台和不能和用户交互。在这两个方法之间,你可以维护这些需要用来显示Activity的资源。举个例子, 你可以在onStart()里面注册监视影响UI变化的BroadcastReceiver,在onStop()里面注销BroadcastReceiver,当Activity在可见和隐藏状态变换的时候,onStart(0和onStop()会被调用多次。
3.前台生命周期,Activity的前台生命周期是在调用onResume()后,直到调用onPause()。这段时间内,Activity在所用Activyt的前面,同时可以和用户交互,一个Activity会频繁的在resumed和paused状态之间转换。比喻说设备睡眠,activiyt结果已经发送,新inent已经发送, 因此,这两个方法间的代码必须短小轻量。
通过官网介绍, 比较容易明白在应用中,Activity的每个生命周期函数里面应该做什么。
Activity类的生命周期函数一般都是回调函数,它的调用者是ActivityThread. ActivityThread类的消息处理函数会根据收到的消息, 调用Activity的生命周期函数。ActivityThread类的main()函数是应用的真正入口,它所在的线程就是UI主线程。在ActivityThread类的main函数中,会调用Looper.prepareMainLooper()准备消息队列。