您的位置:首页 > 其它

Activity的生命周期

2015-11-22 17:22 274 查看
Activity生命周期的回调方法:
//创建Activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//Activity快要变成可见的
@Override
protected void onStart() {
super.onStart();
}
//Activity变成可见的,处于运行状态
@Override
protected void onResume() {
super.onResume();
}
//其他Activity获得用户焦点,(Activity快要暂停了)
@Override
protected void onPause() {
super.onPause();
}
//Activity不再可见,处于停止状态
@Override
protected void onStop() {
super.onStop();
}
//Activity快要被销毁了
@Override
protected void onDestroy() {
super.onDestroy();
}
}


这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)

1. Activity的entire lifetime(全部的生命期)发生在调用onCreate()和调用onDestory()之间。
在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
2. Activity的visible lifetime(可见的生命期)发生在调用onStart()onStop()之间。
在这个期间,用户能在屏幕上看见Activity,和它进行交互。
系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
3. Activity的foreground lifetime (前台的生命期)发生在调用onResume()onPause()之间。
在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
一个Activity能频繁的在前台进入和出去之间转变。

下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:



下面就根据上面的过程图进行说明:

activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。

通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:Another activity comes into the foreground. 也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。

而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。我们看看上图从onPause到onStop的原因是:the activity is no longer visiable.
也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。

从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。

对图中最左侧的箭头指示的解释:
当MainActivity处于onPause和onStop状态时,当更高优先级的apps需要内存,而此时系统内存不够了,那么android系统就会将MainActivity所在的进程给杀了以释放资源。
当然被杀了之后,想重生,那必须得从头来过:onCreate ---> onStart() ---> onResume().
总结:
onCreate: 在这里创建界面,做一些数据的初始化的工作
onStart: 到这一步变成用户可见不可交互的
onResume: 变成和用户可交互的
onPause: 到这一步是可见不可交互的,系统会停止动画等消耗CPU的事情,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统回收。 在这里保存的数据,应该在onResume里读出来。(注意:这个方法里做的事情时间要短,因为下一个activity不会等这个方法完成才启动)
onStop: 变得不可见,被下一个activity覆盖了(onPause 和 onStop的区别为是否可见)
onDestroy :这是activity 被干掉之前最后一个被调用的方法了。

下面通过一个Demo来学习以下Activity的生命周期。
Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。
MainActivity

package com.example.activitytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

private Button btn;
private static final String TAG = "ActivityTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "MainActivity onCreate");
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});

}
@Override
protected void onPause() {
Log.d(TAG, "MainActivity onPause  ");
super.onPause();
}
@Override
protected void onResume() {
Log.d(TAG, "MainActivity onResume  ");
super.onResume();
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"MainActivity onStart  ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "MainActivity onStop  ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "MainActivity onDestroy  ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "MainActivity onRestart  ");
}
}
SecondActivity:

package com.example.activitytest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SecondActivity extends Activity {
private static final String TAG = "ActivityTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.second_layout);
super.onCreate(savedInstanceState);
Log.d(TAG,"SecondActivity onCreate");

}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "SecondActivity onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "SecondActivity onResume");

}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "SecondActivity onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "SecondActivity onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "SecondActivity onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "SecondActivity onRestart");
}
}

1. 运行应用,MainActivity运行。
可以看出一个Activity运行调用的回调方法是: onCreate()->onStart()->onResume()



2. 点击跳转按钮,由MainActivity跳转到SecondActivity:

1>SecondActivity是Dialog。



由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。

2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)
再点击跳转按钮:



对于MainActivity,由于不可见,状态由运行变为停止。
依次调用了它的回调方法: onPause()->onStop()

3.Activity处于运行状态时,点击返回按钮:



点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法: onPause()->onStop()->onDestroy()
4.Activity处于运行状态,点击主页按钮,返回桌面:



Activity由运行状态变为停止状态,依次调用它的回调方法: onPause()->onStop()
5.Activity处于停止状态,即由桌面返回到Activity:



停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()
6.Activity处于运行状态,旋转屏幕:



可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。
运行->暂停->停止->死亡->运行
依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()
7.Activity处于运行状态,手机此时锁屏:



可以看出,手机锁屏,此时由于Activity不可见,会进入停止状态。
依次调用回调方法:onPause()->onStop()
8.当应用正在运行时,手机锁屏,然后解锁回到应用界面:



可以看出应用从停止状态恢复到运行状态。

依次调用回调方法:onRestart()->onStart()->onResume()

参考:http://www.cnblogs.com/JohnTsai/p/4052676.html http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: