Activity的生命周期完全由Android系统进行管理,周期中有几个主要的状态,下面介绍一下
理解生命周期回调函数
下面一张图说的很清晰:
根据app的复杂性,不一定实现所有生命周期函数,但理解他们并知道什么时候该实现是很重要的,实现周期函数要保证一下几点:
- 接电话或转移到另一个app的时候不要产生冲突
- 用户不用时不要消耗可观的系统资源
- 在用户暂时离开时不要丢失用户数据和进展
- 屏幕方向改变时不要丢失用户数据
有三个状态时可以保持的:
-
Resumed
- 此状态下,activity在前台,可以和用户交互,也叫运行状态 Paused
- 此状态下,本activity被另一个前台activity隐藏,这个前台activity是半透明的或只占据部分屏幕,paused状态下activity不接受用户输入,也不执行任何代码 Stopped
- 此状态下,activity完全不可见,也就是在后台,所有实例对象和成员变量等都被保存,但不执行任何代码
其他状态都是瞬时的,调用onCreate后立即调用onStart后立即调用onResume
这些是基本的周期状态,下面看看一些特殊的生命周期表现
指定app启动Activity
用户触点你的app icon时,系统调用被你声明为launcher activity的onCreate()函数,这个activity提供程序用户界面的主入口
可以在Android manifest文件中定义
launcher activity必须以<intent-filter>
定义,包含 MAIN
action 和LAUNCHER
category 标签,例如:
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Note: 使用Android SDK tools建立项目时,以上声明自动包含,如果没有 MAIN
action 或 LAUNCHER
category,app icon不会出现在Home屏幕列表里
创建一个新实例
所有的新Activity实例产生都调用onCreate()函数
必须实现onCreate()函数做一些基本的初始化工作,例如用户界面初始化,成员变量初始化,或者UI的配置等等,例如下面例子:
TextView mTextView; // Member variable for text view in the layout
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the user interface layout for this Activity
// The layout file is defined in the project res/layout/main_activity.xml file
setContentView(R.layout.main_activity);
// Initialize member TextView so we can manipulate it later
mTextView = (TextView) findViewById(R.id.text_message);
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// For the main activity, make sure the app icon in the action bar
// does not behave as a button
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(false);
}
}
Caution: 用SDK_INT
以兼容Android2.0一下的版本,否则会出现运行时异常
技术上说,onStart()函数之后,界面可见,但onResume()函数调用紧随其后,所以看不出来
如下几种情况可以使activity脱离resumed状态:
1.来电话
2.用户转向另一个activity
3.屏幕被关掉
以后再说onStart()和onResume()函数何时使用,他们也是很有用的,特别对于经常从Paused和Stopped状态转换为Resumed状态的activity
Note: onCreate()的参数savedInstanceState后面再说
Destroy一个Activity
当app被完全移出内存之前,最后调用onDestroy()函数
大多数app不需要实现,因为大多清理工作会在onPause()和onStop()函数中做,然而,若果activity有后台线程或者其他不正确关闭会产生内存泄露的资源,要在onDestroy()函数中处理他们
@Override
public void onDestroy() {
super.onDestroy(); // Always call the superclass
// Stop method tracing that the activity started during onCreate()
android.os.Debug.stopMethodTracing();
}
Note: 系统总是在onPause()和onStop()之后调用onDestroy(),但一种情况除外,就是在onCreate()中调用finish()之后,直接调用onDestroy()并且不调用任何其他周期函数