您的位置:首页 > 其它

Activity生命周期管理之一——Starting一个Activity

2013-01-10 10:53 295 查看
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()并且不调用任何其他周期函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: