Android核心组件
Activity
Activity 是 Android 应用程序核心组件中最基本的一种,是用户和应用程序交互的窗口。
在 Android 应用程序中,一个 Activity 通常对应一个单独的视图。一个 Android 应用程序是由一个或多个 Activity 组成的,这些 Activity 相当于 Web 应用程序中的网页,用于显示信息,并且相互之间可以进行跳转。和网页跳转不同的是,Activity 之间的跳转可以有返回值。
新打开一个视图时,之前的那个视图会被置为暂停状态,并且压入历史堆栈中,用户可以通过回退操作返回以前打开过的视图。Activity 是由 Android 系统进行维护的,它有自己的生命周期,即“产生、运行、销毁”,但是在这个过程中会调用许多方法,如创建 onCreate()、激活 onStart()、恢复 onResume()、暂停 onPause()、停止 onStop()、销毁 onDestroy()和重启 onRestart() 等。
每个 Activity 都提供一个用户界面窗口,一般情况下,该界面窗口会填满整个屏幕,但是也可以比屏幕小,或者浮在其他的窗口之上。
Android 应用程序中的多个 Activity 可以直接相互调用以完成不同工作。
当新的 Activity 被启动的时候,之前的 Activity 会停止,但是不会被销毁,而是被压入“后退栈(Back Stack)”的栈顶,新启动的 Activity 获得焦点,显示给用户。
“后退栈”遵循“后入先出”的原则。当新启动的 Activity 被使用完毕,用户单击“Back”按钮时,当前的 Activity 会被销毁,而原先的 Activity 会被从“后退栈”的栈顶弹出并且激活。
当 Activity 状态发生改变时,都会通过状态回调函数通知 Android 系统。而程序编写人员可以通过这些回调函数对 Activity 进行进一步的控制。
Activity生命周期
本质上讲,activity的生命周期有三个状态
-
运行态
Activity 运行于屏幕的最上层并且获得了用户焦点。
-
暂停态
指当前 Activity 依然存在,但是没有获得用户焦点。
在其之上有其他的 Activity 处于运行态,但是由于处于运行态的 Activity 没有遮挡住整个屏幕,当前 Activity 有一部分视图可以被用户看见。处于暂停态的 Activity 保留了自己所使用的内存和用户信息,但是在系统极度缺乏资源的情况下,有可能会被杀死以释放资源。
-
停止态
指当前 Activity 完全被处于运行态的 Activity 遮挡住,其用户界面完全不能被用户看见。
名称 | 调用时间 |
---|---|
onCreate(Bundle savedInstanceState) | 创建 Activity 时调用。 设置在该方法中,还以 Bundle 的形式提供对以前储存的任何状态的访问。其中参数 savedInstanceState 对象是用于保存 Activity 的对象的状态。 |
onStart() | Activity 变为在屏幕上对用户可见时调用。 |
onResume() | Activity 开始与用户交互时调用(无论是启动还是重启一个活动,该方法总是被调用)。 |
onPause() | 当 Android 系统要激活其他 Activity 时,该方法被调用,暂停或收回 CPU 和其他资源时调用。 |
onStop() | Activity 被停止并转为不可见阶段时调用。 |
onRestart() | 重新启动已经停止的 Activity 时调用。 |
onDestroy() | Activity 被完全从系统内存中移除时调用。 该方法被调用可能是因为有人直接调用 finish() 方法或者系统决定停止该活动以释放资源。 |
上面 7 个生命周期方法分别在 4 个阶段按着一定的顺序进行调用,这 4 个阶段如下:
- 启动 Activity:在这个阶段依次执行 3 个生命周期方法:onCreate、onStart 和 onResume。
- Activity 失去焦点:如果在 Activity 获得焦点的情况下进入其他的 Activity 或应用程序,这时当前的 Activity 会失去焦点。在这一阶段,会依次执行 onPause 和 onStop 方法。
- Activity 重获焦点:如果 Activity 重新获得焦点,会依次执行 3 个生命周期方法:onRestart、onStart 和 onResume。
- 关闭 Activity:当 Activity 被关闭时,系统会依次执行 3 个生命周期方法:onPause、onStop 和 onDestroy。
Activity的创建
-
创建新类
创建一个 Activity,必须创建 Android.app.Activity(或者它的一个已经存在的子类)的一个子类,并重写 onCreate() 方法。
-
关联相应的布局文件
在新建的 Activity 中设置其布局方式,需要在 res/layout 目录中新建一个 XML 布局文件,可以通过 setContentView() 来指定 Activity 的用户界面的布局文件。
-
注册
在 AndroidManifest.xml 文件中对建立的 Activity 进行注册,即在 <application> 标签下添加 <activity> 标签。
Activity的启动
通过意图来启动Activity,一共有以下方法启动另一个activity。
intent的显式调用
1.class跳转
//第一个参数是传入自身的activity,第二个参数是所要跳转的activity
Intent intent = new Intent(this, Main2Activity.class);
startActivity(intent);
2.包名类名跳转
Intent intent=new Intent();
intent.setClassName(this,"csu.org.androiddemo3.Main2Activity");
startActivity(intent);
3.ComponentName
Intent intent=new Intent();
ComponentName componentName = new ComponentName(this,Main2Activity.class);
intent.setComponent(componentName);
startActivity(intent);
intent的隐式调用
需要利用到AndroidMainFest.xml
的意图过滤器,如下定义;
<activity android:name=".Main2Activity">
<intent-filter>
<!--我们将会利用action的name来进行隐式调用-->
<action android:name="action.seconde"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Intent intent=new Intent();
intent.setAction("action.seconde");
startActivity(intent);
Intent intent=new Intent("action.seconde");
startActivity(intent);