首页 > 代码库 > 【Android笔记】(1)—— Activity生命周期与通信

【Android笔记】(1)—— Activity生命周期与通信

一、Activity

1.Activity状态
活动中:如果Activity在屏幕前,即是可视的,可接受用户的输入。
暂停状态:Activity失去焦点,但仍然可见。
停止状态:如果一个Activity被另一个Activity遮住了,它的状态时停止的。

2.Activity生命周期动作方法
onRestart() : Activity第一次被创建时调用,用于初始化一些数据,如View,此时处于停止状态。
onStart(): Activity将要对用户可见时调用,调用后进入停止状态。
onResume(): 开始于用户交互时被调用,调用后处于激活状态(活动中)。
onPause() : 恢复Activity时调用,调用后处于暂停状态。
onStop() : Activity不再对用户可见时调用,之后处于停止状态,用于关闭Activity。
onDestory() : 销毁Activity是被调用。

注:当Activity处于暂停状态,停止状态时,在内存极端底下时可能被意外的杀死。


3.Activity三个运作流程

1)第一次启动Activity
   调用onCreate()创建Activity(停止状态) -> 调用onStart()(暂停状态) -> 调用onResume()显示Activity(活动中)
2)Activity A 跳转到 Activity B
   A先调用onPause()进入暂停状态 -> B调用onCreate()进入停止状态 -> B调用onStart()进入暂停状态 -> 调用onResume()显示B,将A覆盖 -> 当A正在被覆盖时调用onStop()进入停止状态。
3)从Activity B回到 Acitivity A
   B先调用onPause()进入暂停状态 -> A调用onRestart()进入停止状态 -> A调用onStart()进入暂停状态 -> A调用onResume()进入激活状态,覆盖B -> B被覆盖时调用onStop()进入停止状态 -> B调用onDestory()销毁
因为Activity的创建时基于栈的,栈顶返回即出栈,所以B销毁了。

二、Activity之间通信

通过Intent传递数据,官方文档说Intent是一次即将操作的抽象描述(说的够抽象的)

1.直接将数据传入Intent对象
调用putExtra()方法以键值对的形式存入数据。取出则用getXXXExtra(),XXX表示存入数据的类型,getStringExtra()取出String类型。
Intent intent = new Intent(getApplicationContext(), BActivity.class); 
intent.putExtra("name", et_name.getText().toString()); 
startActivity(intent); 

2.用Bundle对象传值
如果值过多可以将数据都放入Bundle对象中,再通过Bundle传入Intent对象。Bundle是对HashMap<String, Object>的封装,存入的只能是基本素数据类型,比如int,byte....
Intent intent = new Intent(getApplicationContext(), BActivity.class);  
Bundle bundle = new Bundle();  
bundle.putString("name", "XXXX");
bundle.putInt("age",15);  
intent.putExtra("bundle", bundle);  
startActivity(intent);

3.跳转Activity后取出数据

首先调用getIntent()得到Intent对象,然后调用getExtra("Key")取出相应数据。
①直接取出Intent中数据
 String name = this.getIntent().getStringExtra("name").toString();
②取出Bundle中数据
Bundle bundle = this.getIntent().getBundleExtra("bundle");
String name = bundle.getString("name");
Int age = bundle.getInt("age");

注:Bundle获得数据需要调用getXXX(Key)方法,XXX为数据类型,比如getString(),getInt();

4.startActivity()与startActivityForResult区别
startActivity()启动了其他的Activity之后不再回调回来,也就是说启动者与被启动者在启动完毕后没有关系了。
如果我们想启动一个Activity后填入数据,并将数据返回至之前Activity就需要调用startActivityForResult()方法来启动Activity。
①在Activity A中启动另一个Activity,要在A Activity中重写onActivityResult()方法,用于处理回传的数据。
②在Activity B中需要调用setResult()方法,设置返回的Intent。

相关参数:
startActivityForResult(Intent intent, int requestCode),  第二个是"请求码",这个请求码是用来区分不同的请求。
onActivityResult(int requestCode, int resultCode, Intent data), 第一个是"请求码", 第二个是"结果码", 第三个是Intent,其为回传的数据
setResult(int resultCode, Intent data), 第一个是"结果码",用于A中onActivityResult()的识别,第二个是回传给A的Intent