一、Activity概念介绍:
(1)Android组件显示的载体,负责与用户交互,监听各个组件的操作事件并作出相应事件的响应。
二、Activity生命周期流程图:
(1)引用Android官方文档生命周期流程图:
三、Activity生命周期中常用回调方法:
(2)官方只是提供了大概的基本流程,具体细节我通过具体代码测试并结合网上查阅资料总结如下两点:
1、以下几种情况下Activity生命周期的流程:
<span style="font-family:Microsoft YaHei;font-size:14px;">/**
* 生命周期:
*
* 第一种情况---->正常启动
* onCreate()--->onStart()--->onPostCreate()--->onResume()--->onPostResume()
*
* 第二种情况---->黑屏之后(和按home键回到主界面一样) onPause()--->onStop()
*
* 第三种情况---->恢复屏幕之后 onRestart()--->onStart()--->onResume()--->onPostResume()
*
* 第四种情况---->按返回键退出应用 onPause()--->onStop()--->onDestroy()
*
* 第五种情况---->进入下一个界面 onPause()--->onStop()
*
* 第六种情况---->返回原来界面 onRestart()--->onStart()--->onResume()--->onPostResume()
*
* 第七种情况---->旋转屏幕(默认旋转屏幕会发生以下调用并restart该activity
* 但可通过设置activity的属性android:configChanges="orientation" 来告知屏幕旋转不发生restart行为
* 详细看 android:configChanges 属性文档说明)
* onPause()--->onStop()--->onDestroy--->()
* --->onCreate()--->onStart()--->onPostCreate()--->onResume()--->onPostResume()
*
* 第八种情况---->打开dialog主题的窗体 onPause()--->onSaveInstanceState()
*
*/</span>
2、在Activity生命周期中的回调方法中我们具体应该做点什么:
<span style="font-family:Microsoft YaHei;font-size:14px;">// (1)初始化入口方法
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);
Log.i("1", "---------->onCreate");
// 本方法应用场景:本方法中主要实现 界面基本布局初始化、界面基本数据初始化
initTheLayoutOfActivity();
initTheDataOfActivity();
nextButton = (Button) findViewById(R.id.next);
nextButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Log.i("3", "---------->进入下一个界面");
// 可以传递intent到下一个界面
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
intent.putExtra("name", "张三");
// startActivity(intent);
startActivityForResult(intent, 2);
}
});
}
/**
* 初始化布局界面
*
* @since 2014年11月6日 下午3:21:12
* @作者 GAVIN
*/
public void initTheLayoutOfActivity() {
}
/**
* 初始化基础数据
*
* @since 2014年11月6日 下午3:21:29
* @作者 GAVIN
*/
public void initTheDataOfActivity() {
}
// (2)开始显示界面调用或者当当前Activity从stop状态变为active状态时调用onRestart()之后调用
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i("1", "---------->onStart");
}
// (3)本方法主要在Activity加载完成后调用 在这个方法里面可以获取界面的宽高等数据
@Override
protected void onPostCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onPostCreate(savedInstanceState);</span>
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="white-space:pre"> </span>//本方法可以再Activity加载完成后获得一些UI布局控件的宽度等数值
Log.i("1", "---------->onPostCreate");
}
// (4)当当前Activity从pause状态变为Active状态时调用
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("1", "---------->onResume");
}
// (5)
@Override
protected void onPostResume() {
// TODO Auto-generated method stub
super.onPostResume();
Log.i("1", "---------->onPostResume");
}
// (6)当当前Activity从Active状态变为Pause状态时调用
@Override
protected void onPause() {
// TODO Auto-generated method stub
// 在本方法中进行保存当Activity退出后用户界面的关键数据,防止系统回收内存造成数据丢失
super.onPause();
Log.i("1", "---------->onPause");
}
// (7)当当前Activity完全被遮挡对于用户来说不可见时调用(内存不足时有可能被系统kill)
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("1", "---------->onStop");
}
// (8)当前Activity被系统回收时调用(表明此时Activity被终结)
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("1", "---------->onDestroy");
}
// (9)当当前Activity从Stop状态变为active状态时调用
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i("1", "---------->onRestart");
}</span>
四、Activity应用场景:
(1)作为界面控件显示的载体,Activity应用于Android程序的各个界面,贯穿整个应用程序。
五、Activity常用方法介绍:
(1)打开一个Activity的两种方法:
// 可以传递intent到下一个界面
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
intent.putExtra("name", "张三");
//第一种方法:一个参数 目的:只是单纯的打开另一个视图 操作完成后,返回本界面还需要在二级界面使用startActivity方法
// startActivity(intent);
//第二种方法:两个参数或者三个参数 目的:需要二级界面返回一定数据进行其它操作,返回本界面只需要二级界面中使用 setResult()方法后调用finish()方法
startActivityForResult(intent, 2);
// startActivityForResult(intent(目的意图), requestCode(请求的code值,用于区分当前发起事件的Activity是哪个));
// startActivityForResult(intent, requestCode, options(可选,传递一些数据));
</pre><strong>(2)当使用startActivityForResult(intent, "requestCode", "bundle")打开一个界面,接收回调数据时调用如下方法:</strong></div><div><span style="font-family:Comic Sans MS; font-size:18px"><strong></strong></span><pre name="code" class="java"><strong>@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
// 此方法用于接收上一个Activity返回的数据
if (requestCode == 1) {
switch (resultCode) {
case RESULT_OK:
Log.i("1", "i get it !!");
break;
default:
break;
}
} else {
Log.i("1", "期待新功能");
}
}</strong>
(3)onSaveInstanceState()调用情景:
// 这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity
// A是否会被销毁,故系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。</strong>
//以下几种情况的分析都遵循该原则
//1、当用户按下HOME键时。
//2、长按HOME键,选择运行其他的程序时。
// 3、按下电源按键(关闭屏幕显示)时。
// 4、从activity A中启动一个新的activity时。
// 5、屏幕方向切换时,例如从竖屏切换到横屏时,在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity// A,所以onSaveInstanceState一定会被执行
// 此方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等,</strong>
//而不应该用来保存持久化数据,持久化数据应该当用户离开当前的
// activity时,在 onPause()
// 中保存(比如将数据保存到数据库或文件中)
// 在onPause()中不适合用来保存比较费时的数据,如果数据量大就应该开一个线程来进行操作</strong>
@Overrideprotected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Log.i("1", "onSaveInstanceState");
}
(4)Activity常用主题(theme)样式:
/**
* Android Activity 主题样式 常用的有以下几种
*
* android:theme="@android:style/Theme.Dialog" 将一个Activity显示为对话框模式
* android:theme="@android:style/Theme.NoTitleBar" 不显示应用程序标题栏
* android:theme="@android:style/Theme.NoTitleBar.Fullscreen"不显示应用程序标题栏,并全屏 ?
* android:theme="@android:style/Theme.Light" 背景为白色
* android:theme="@android:style/Theme.Light.NoTitleBar" 白色背景并无标题栏
* android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 白色背景,无标题栏,全屏
* android:theme="@android:style/Theme.Black" 背景黑色
* android:theme="@android:style/Theme.Black.NoTitleBar"黑色背景并无标题栏
* android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" 黑色背景,无标题栏,全屏
* android:theme="@android:style/Theme.Wallpaper" 用系统桌面为应用程序背景
* android:theme="@android:style/Theme.Wallpaper.NoTitleBar" 用系统桌面为应用程序背景,且无标题栏
* android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"用系统桌面为应用程序背景,无标题栏,全屏
* android:theme="@android:style/Translucent"
* android:theme="@android:style/Theme.Translucent.NoTitleBar"
* android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
* android:theme="@android:style/Theme.Panel" ?android:theme="Theme.Light.Panel"
*/
程序猿群英汇:
Android 学习交流群:322494132
IOS 学习交流群:226881076
Swift 学习交流群:199157150
Voip for ios 学习交流群:213493886