【1】Activity介绍
Activity,字面意思‘活动’。是Android四大用户组件之一,在Android中就是用于与用户交互的界面,一个用户界面就是一个Activity对现。用于可以通过该界面进行相关的操作,比如发短信、打电话、看视频等。
【2】activity的声命周期
7个方法3个状态
onCreate():创建Activity,在里面做一些初始化操作,例如获取布局文件中的组件、创建相关对象等。
onStrart():启动activity,此时activity处于可视不可交互转态,可以在该状态进行服务(Service)的绑定操作。
onResume():当调用该方法后,activity进入"激活状态"。可以与用户进行交互,例如:输入文字、点击按钮等
onRause():当进行界面切换,或者弹出一个窗口时,该方法被调用,此时activity进入"暂停状态",可视不可交互。此时当前activity可能因为应用内容不足被回收(kill),应该进行activity状态值的保存,释放一些不用的内存。如果弹出的是窗口,当窗口被取消后,activity会回到onResume()(激活转态)
onStop():当进行界面时被调用。此时activity处于"停止状态",不可视不可交互。在该方法中需要释放不重要的内存。需要注意,如果在onStart()方法中绑定了服务,需要在该方法中进行解绑),同时也需要保存activity的状态值。如果覆盖当前activity的另外一个activity被用户取消,则会调用onRestart()方法,然后调用onStart()方法进行重新启动。
onDestroy():当activity被销毁时被调用,在该方法中需要完全释放内存。
具体流程图见下图:
【3】activity之间的切换和数据传递
activity之间进行切换是借助于Intent来实现的,数据传递用两种方式
需要注意的是:如果传递的是对象,需要进行序列化操作。
发送端:
方式一:创建Bundle对象(存值是基于ArrayMap实现的 Bundle就是用来封装数据的)然后把Bundle对象封装到Intent对象中,具体操作如下:
Intent intent = new Intent(MainActiviy,Main2Activity); Bundle bundle = new Bundle(); bundle.putInt("id",1); bundle.putString("name","bobo"); intent.putExtra("date",bundle); startActivity(intent);
方式二 直接使用Intent对象传递数据
1 Intent intent = new Intent(MainActiviy,Main2Activity); 2 intent.putExtra("id",1); 3 intent.putExtra("name","bobo"); 4 intent.putExtra("money",2.0f); 5 startActivity(intent);
接收端
方式一 使用Bundle对象取值
1 Intent intent = getIntent(); 2 Bundle bundle = intent.getBundleExtra("date"); 3 int id = bundle.getInt("id",0); 4 String name = bundle.getString("name");
方式二 直接使用Intent对象取值
1 Intent intent = getIntent(); 2 int id = intent.getIntExtra("id",0); 3 String name = intent.getStringExtra("name"); 4 float money = intent.getFloatExtra("money",0.1f);
【4】activity的启动方式(此处的图并非原创)
1.standard:
默认的模式,每次启动都创建一个Activity对象放在Activity栈顶
2.singleTop:
在当前任务栈中,判断栈顶是否为当前的Activity,如果是,就直接使用,如果不是,再创建新的Activity放入栈顶
从SecondActivity跳转到FirstActivity时生成了新的FirstActivity实例,当从ondActivity跳转到FirstActivity时,系统发现存在有FirstActivity实例,但不是位于栈顶,于是重新生成一个实例。如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。
3.singleTask:
在当前任务栈中,判断栈里是否存在需要的Activity,如果不存在,创建一个新Activity入栈,如果存在,会把该Activity之上的所有Activity清除出栈,显示当前的Activity。
在这个跳转过程中系统发现有存在的FirstActivity实例,于是不再生成新的实例,而是将FirstActivity之上的Activity实例统全部出栈,将FirstActivity变为栈顶对象,显示出来。SecondActivity实例被迫出栈,下次等FirstActivity跳转到SecondActivity时,找不到存在的SecondActivity实例,于是就必须生成新的SecondActivity实例。
4.singleInstance:
新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例,如果已存在,那么会切换到该任务栈。两个Activity实例分别被放置在不同的栈结构。一般用于需要显示的组件是Android中重量级的组件,重新创建需要消耗很大的性能,例如WebView组件
FirstActivity跳转到SecondActivity时,重新启用了一个新的栈结构,用于放置SecondActivity实例,然后按下后退键,再次回到原始栈结构;图中下半部分显示的在SecondActivity中再次跳转到FirstActivity,这个时候系统会在原始栈结构中生成一个FirstActivity实例,然后回退两次,此时并没有退出,而是回到了SecondActivity,是因为从SecondActivity跳转到FirstActivity的时候,此时的起点变成了SecondActivity实例所在的栈结构,这样就回到了SecondActivity所在的栈结构。