Activity的介绍
原文地址:http://blog.youkuaiyun.com/Vange
===============================================
一个Application由多个Activity组成,不同的Activity来完成不同的功能
Android系统高层应用都由多个Activity组成,每一个Activity来完成对应的功能控制,类似于MVC模式中的C(控制器),它负责数据处理、控制界面的选择及部分显示。Activity的耦合性很低,只要app中设置了对应的Intent-filter则,其他的app也可以调用它的Activity,对于多种调用选择时,系统会弹出菜单列表来由用户选择。
Activity用界面来表示自己,并不一定都显示整个屏幕,有时也只是显示在屏幕最上面的一小部分
每个Activity都会用setContentView()来设置对应的视图来显示自身的数据。大部分显示时都是显示在整个屏幕,但有时也只是显示屏幕的一部分,如一些app在加载时的进度圈、在屏幕上方的字典查询。
Application有一个主的Activity来作为入口,由它启动其他的Activity
Activity都会有一个主的Activity来作为启动的入口,在创建时必要在文件中创建哪下标识:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
android.intent.action.MAIN 表示此Activity为App的入口;
android.intent.category.LAUNCHER则表示此入口为系统的图标或快捷方式启动;
(相关的intent-filter介绍在以后文章再补充)
但App并不只能有一个入口,也有可能是由intent-filter打开方式启动app。
创建一个简单的Activity
1. 第1步:创建继承于Activity的子类,作为实现Activity的逻辑代码。
2. 第2步:在AndroidManifest.xml文件中在Application节点内创建以下片断,一般用IDE创建时,都已经自己生成对应的XML。
<activity android:name=".activity.Second"></activity>
3. 第3步:在主Activity中调用新的Activity。
startActivity(new Intent(this,Second.class));
一般建议调用Activity的方法由新的Activity(Second类)的静态方法来提供,而调用时,只需传递入对应的参数,由新的Activity来组成Intent进行调用,这样可以把逻辑都放于对应的Activity,代码会显得更加清晰。如以下代码(摘自K-9 Mail开源代码:
public static void actionSettings(Context context, Account account) {
//在这里组装一个Intent
Intent i = new Intent(context, AccountSettings.class);
//加入对应需要的数据,放于Intent里面
i.putExtra(EXTRA_ACCOUNT, account.getUuid());
//启动对应的Activity
context.startActivity(i);
}
Activity的显示顺序队列遵循栈的模型
后入先出,最前打开的Activity在最上面
在同一个app里面每一个Activity被启动后,原来的Activity将会被放入到 Activity返回顺序栈 里面,如图(摘自Android网站):
1、 启动主Activity,可能是用系统的图标启动,也可能是用Intent-filter启动,此时Activity 1就被放入到 Activity返回顺序栈中。
2、 当点击“Start Activity 2”按钮时,系统将拉起新的Activity 2,此时Activity 2将被放入到栈中;
3、 当点击“Start Activity 3”按钮时,系统将拉起新的Activity 3,此时Activity 3将被放入到栈中;
4、 当点击返回按钮时,系统将会把Activity 3退出,返回到Activity 2;
当Finish()的Activity将不会放入到队列中
如图:
1、 主Activity被拉起;
2、 主Activity拉起Activity 1,此时栈中显示如2;
3、 当Activity 1 拉起 Activity 2后,调用了finish()方法,则Activity 1 将不会被放入到栈中,而是直接结束了生命周期,而Activity 2 则被放入栈中,当再次按返回键时,则返回到主Activity;
针对目前有许多的app需要按多次返回键后才能退出,有时还是在同一Activity界面出现多次,可以使用此方法进行解决,例如以下代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom);
startActivity(new Intent(this,Second.class));
finish(); //启动后直接调用finish()方法结束生命周期
}
Activity的生命周期简介
生命周期
每次App被拉起后Activity就开始了自己的生命周期,它有可能显示在最前方,也有可能显示在其他Activity后面,有时它隐藏在其他Activity后面时还会被系统回收(在系统资源紧张的情况下),有时它被其他app调用,直到最终结束自己的生命周期。
每一个周期都会回调Activity实现类中的对应的代码,如 onCreate()、onStart()等。请看下图:
1、 onResume()是一个关键点,无论Activity是第一次被拉起,还是重新回到前端,都需要调用此回调函数,所以对于数据及界面的初始化都可以在此方法里面进行处理;
2、 onSaveInstanceState()是当新的Activity将要被拉起的情况下回调使用,根据函数名可以看出此回调函数主要做一些数据的保存,以防止当Activity再次被使用时无法初始化原来的场景;
3、 这个关键点是当系统资源紧张或者用户使用某些进程管理软件将App进行杀掉,许多App在开发时没有考虑到此点,所以会出现应用在后台放置了一段时间,当用户再使用此App时,就出现程序错误,或者一些变量未初始化;
4、 onDestroy()是当一个Activity已经完成了自己的生命周期,最终退出调用的回调函数;
5、 当新的Activity被拉起时,都会在创建完成后再进行onStop()的调用;一般在onStop上进行一些资源的释放,在onResume()对必要的资源进行确认;
对于调用的顺序,可以写一个简单的Activity调用其他Activity的例子,同时在每个回调函数上,写上Log,则可以看到如下图的日志打印:
先写这么多,以后再继续补充。