【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被销毁时被调用,在该方法中需要完全释放内存。

具体流程图见下图:

Android 区分activity-alias打开界面 安卓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栈顶

   

Android 区分activity-alias打开界面 安卓activity_出栈_02

 

  2.singleTop:

    在当前任务栈中,判断栈顶是否为当前的Activity,如果是,就直接使用,如果不是,再创建新的Activity放入栈顶

  

Android 区分activity-alias打开界面 安卓activity_bundle_03

从SecondActivity跳转到FirstActivity时生成了新的FirstActivity实例,当从ondActivity跳转到FirstActivity时,系统发现存在有FirstActivity实例,但不是位于栈顶,于是重新生成一个实例。如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。

 

Android 区分activity-alias打开界面 安卓activity_bundle_04

3.singleTask:

  在当前任务栈中,判断栈里是否存在需要的Activity,如果不存在,创建一个新Activity入栈,如果存在,会把该Activity之上的所有Activity清除出栈,显示当前的Activity。

Android 区分activity-alias打开界面 安卓activity_任务栈_05

在这个跳转过程中系统发现有存在的FirstActivity实例,于是不再生成新的实例,而是将FirstActivity之上的Activity实例统全部出栈,将FirstActivity变为栈顶对象,显示出来。SecondActivity实例被迫出栈,下次等FirstActivity跳转到SecondActivity时,找不到存在的SecondActivity实例,于是就必须生成新的SecondActivity实例。

4.singleInstance:

  新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例,如果已存在,那么会切换到该任务栈。两个Activity实例分别被放置在不同的栈结构。一般用于需要显示的组件是Android中重量级的组件,重新创建需要消耗很大的性能,例如WebView组件

Android 区分activity-alias打开界面 安卓activity_任务栈_06

FirstActivity跳转到SecondActivity时,重新启用了一个新的栈结构,用于放置SecondActivity实例,然后按下后退键,再次回到原始栈结构;图中下半部分显示的在SecondActivity中再次跳转到FirstActivity,这个时候系统会在原始栈结构中生成一个FirstActivity实例,然后回退两次,此时并没有退出,而是回到了SecondActivity,是因为从SecondActivity跳转到FirstActivity的时候,此时的起点变成了SecondActivity实例所在的栈结构,这样就回到了SecondActivity所在的栈结构。