一、 Activity
1.Activity生命周期:
所有的Android组件都有它自己的生命周期,表示从这一组件的创建到销毁的整个过程。
在这一过程中,组件会在活动、非活动以及可见或不可见等状态中不断切换。
Activity一般处于4种状态:
Running、Paused、Stop、Killed
(运行、暂停、停止、销毁)
- Active/Running
Activity处于屏幕的最前端,用户完全可以看得到,并且可以与用户进行交互。
对于Activity栈来说,它处于栈顶;(一次只有一个) - Paused
Activity在屏幕上仍然可见,但是它已经失去了焦点,用户不能与之进行交互。
暂停状态的Activity是存活的,仍然维持着其内部状态和信息,但是系统可能会在手机内存极低的情况下杀掉该Activity; - Stop
Activity在屏幕上完全不能被用户看见。
处于停止状态的Activity,系统仍然保留有其内部状态和成员信息,但是它经常会由于手机系统内存被征用而被系统杀死回收; - Killed
Activity被系统杀死回收或者未启动。
2.Activity生命周期的回调函数:
onCreate(): 只在活动第一次被创建时被调用
onStart(): 当活动由不可见变为可见时被调用
onResume(): 在活动准备好与用户进行交互时调用
onPause(): 系统准备去启动或恢复另一个活动时调用onStop(): 在活动完全不可见时被调用
onDestroy(): 活动被销毁前调用
onRestart(): 活动由停止状态变为运行状态前调用 - 完整生存期:
从onCreate()方法到onDestroy()方法 - 可见生存期:
从onStart()方法到onStop()方法 - 前台生存期:
从onResume()方法到onPause()方法
小结:
创建→运行 onCreate()–>onStart–>onResume();
运行→停止 onPause()—>onStop();
停止→运行 onRestart()–>onStart()—>onResume();
运行→暂停 onPause();
暂停→运行 onResume();
停止→销毁 onDestory()
二、Intent(协助应用间的交互与通讯)
- Intent负责对操作的动作、动作涉及数据、附加数据进行描述,根据此Intent的描述找到对应的组件,将 Intent传递给调用的组件,完成组件的调用。
- Intent不仅可用于应用程序之间,也可用于Activity/Service之间的交互。
1.Intent属性: - Action属性
用于描述Intent要完成的动作,对要执行的动作进行一个简要描述。 - Data属性
执行动作的Uri(Uniform Resource Identifier)和MIME(Multipurpose Internet Mail Extensions)类型 - Category属性
指明一个执行Action的分类,Intent中定义了一系列Category属性常量 - Extra属性
通过使用Intent对象的putExtra()方法来添加附加信息。
Intent intent=new Intent();
intent.putExtra("name","zhangsan");
通过使用Intent对象的getXXXExtra()方法可以获取附加信息。
例如,将上面代码存入Intent对象中的人名获取出来,因存入的是字符串,所以可以使用getStringExtra()方法获取数据,
String name=intent.getStringExtra("name");
2.Intent解析:
2.1 直接(显式)Intent
已经知道要启动的组件名称,通过直接指定组件来实现
常用方法有setComponent()、setClassName()或setClass()
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
2.2 间接(隐式)Intent
不知道要启动的组件名称,只知道一个Intent动作要执行,比如:拍照,录像。
通过Intent Filter过滤实现,根据Action、Data和Category属性进行匹配查找。
Intent过滤
- 通过IntentFilter类生成;
- 通过在配置文件AndroidManifest.xml中定义intent-filter>元素生成。
<activity android:name="com.example.admin.activitylifedemo.Activity1">
<intent-filter>//注册
<action android:name="android.intent.action.MAIN" />//应用程序入口
<category android:name="android.intent.category.LAUNCHER" />//该活动优先级最高
</intent-filter>
</activity>
- action>子元素
一个intent-filter>中可以添加多个action>子元素。
intent-filter>列表中的Action属性不能为空,否则所有的Intent都会因匹配失败而被阻塞。所以一个intent-filter>元素下至少需要包含一个action>子元素,这样系统才能处理Intent消息。 - category>子元素
一个intent-filter>中也可以添加多个category>子元素,类似Action
与Action一样,intent-filter>列表中的Category属性不能为空。Category属性的默认值"android.intent.category.DEFAULT"是启动Activity的默认值,在添加其他Category属性值时,该值必须添加,否则也会匹配失败。 - data>子元素
一个中可以包含多个子元素,用于指定组件可以执行的数据
三、Activity跳转(四大组件都通过Intent来解析进行跳转)
在使用Intent进行Activity之间的跳转时,我们通常有三种Intent跳转方式,即:
1.不带参数的跳转
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
startActivity(intent);
2.带参数的跳转
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("Name","Kate");
bundle.putString("Age","25");
intent.putExtras(bundle);
intent.setClass(Activity1.this,Activity2.class);
startActivity(intent);
Activity1跳转到Activity2之后,Activity2通过Bundle获取Intent传过来的值
Bundle bundle=this.getIntent().getExtras();
String name=bundle.getString("Name");
String age=bundle.getString("Age");
3.带返回值的跳转
第一个页面传送返回值:
Intent intent=new Intent();
intent.setClass(Activity1.this,Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("参数","参数值");
intent.putExtra(bundle);
this.startActivityForResult(intent,0);
startActivityForResult(Intent intent,Int requestCode)
中requestCode用于识别第二个页面传回来的值
第二个页面:
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString("参数","参数值");
intent.putExtra(bundle);
intent.setClass(Activity2.this,Activity1.class);
setResult(RESULT_OK,intent);
finish();
第一个页面接收返回值:
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch (requestCode){//Activity1的请求标识
//resultCode为回传的标记,在Activity2中使用的是RESULT_OK,所以此处选择case 0
if(resultCode==RESULT_OK){
Bundle b=data.getExtras();
String str=b.getString("参数");
}
break;
default:
break;
}
}