Activity的简单整理
Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的。
一、Android中的MVC设计模式:
这是我在查阅Activity的相关资料是看到关于介绍MVC设计模式在Android开发中的简单介绍:
M(Model 模型):Model是应用程序的主体部分,所有的业务逻辑都应该写在这里,在Android中Model层与JavaEE中的变化不大,如:对数据库的操作,对网络等的操作都放在该层(但不是说它们都放在同一个包中,可以分开放,但它们统称为Model层)。
V(View 视图):是应用程序中负责生成用户界面的部分,也是在整个MVC架构中用户唯一可以看到的一层,接收用户输入,显示处理结果;在Android应用中一般采用XML文件里德界面的描述,使用的时候可以非常方便的引入,当然也可以使用JavaScript+Html等方式作为View。
C(Controller控制层)android的控制层的重任就要落在众多的activity的肩上了,所以在这里就要建议大家不要在activity中写太多的代码,尽量能过activity交割Model业务逻辑层处理。
了解了Android应用开发中的MVC架构后,我们就可以很明确的知道,在Android中Activity主要是用来做控制的,它可以选择要显示的View,也可以从View中获取数据然后把数据传给Model层进行处理,最后再来显示出处理结果。
二、Activity的生命周期:(这是一张网络上经典的流程图)
创建一个activity,必须创建一个Activity的子类(或者一个Activity的子类的子类)。在子类中,需要实现系统回调的回调方法,当activity在它的生命周期的多种状态中转换的时候,例如当activity被创建、停止、恢复或摧毁。两个最重要的回调方法是:
——onCreate():必须实现这个方法。系统调用它当创建activity的时候。在实现的过程中,初始化activity的基本的组件。更重要的是,这里是必须调用setContentView()来定义activity用户接口的地方。
——onPause():系统调用这个方法当用户离开activity(虽然不总是意味着activity被摧毁)。常此时需要完成保存数据的工作以便用户后面回到Activity以恢复之前的状态。
1 public class MainActivity extends Activity { 2 3 //当第一次调用一个Activity就会执行onCreate方法 4 //在这里创建界面,做一些关于数据初始化的工作 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 } 10 //当Activity处于可见不可交互状态的时候就会调用onStart方法 11 @Override 12 protected void onStart() { 13 // TODO Auto-generated method stub 14 super.onStart(); 15 } 16 //当Activity可以得到用户焦点的时候就会调用onResume方法 17 @Override 18 protected void onResume() { 19 // TODO Auto-generated method stub 20 super.onResume(); 21 } 22 //当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法 23 // 24 @Override 25 protected void onRestart() { 26 // TODO Auto-generated method stub 27 super.onRestart(); 28 } 29 //当Activity被遮挡住的时候就会调用onPause方法 30 //这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。应该在这里保存一些数据,因为这个时候程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。 31 @Override 32 protected void onPause() { 33 // TODO Auto-generated method stub 34 super.onPause(); 35 } 36 //当Activity处于不可见状态的时候就会调用onStop方法 37 @Override 38 protected void onStop() { 39 // TODO Auto-generated method stub 40 super.onStop(); 41 } 42 //当Activity被销毁时会调用onDestory方法 43 @Override 44 protected void onDestroy() { 45 // TODO Auto-generated method stub 46 super.onDestroy(); 47 } 48 49 @Override 50 public boolean onCreateOptionsMenu(Menu menu) { 51 // Inflate the menu; this adds items to the action bar if it is present. 52 getMenuInflater().inflate(R.menu.main, menu); 53 return true; 54 } 55 56 }
Activity中上面的七个方法代表了Activity生命周期的七个阶段,其中当Activity第一次被创建的时候会执行onCreate方法,而当Activity创建完后并且展示给用户的时候会调用onStart方法,接着如果该Activity获得焦点将会由Android系统调用该Activity的onResume方法,接下来,如果该Activity执行了另外一个Activity,那么上一个Activity的onPause方法会被调用以执行一些资源的释放操作,接下来执行新的Activity的onCreate,onStart以及onResume方法,如果新建的Activity完全覆盖了原来的Activity,那么原来Activity的stop方法将会被调用。而当从新建的Activity中会到原来的Activity时onRestart方法会被调用,并连续执行onStart()以及onResume(),此时不会再执行onCreate(),因为该Activity并未被销毁,如果在Activity中执行了finish()或者Android系统需要回收资源时可能会执行Activity的onDestroy()。
注意,在Activity的执行过程中,存在一个Task的概念,Task其实就是一个Activity栈,先进后出,其中首先执行的Activity入栈,接下来执行的Activity继续入栈,如果Activity执行了finish(),将不会被放入Task栈中,新的Activity入栈的时候,上一个Activity会执行onPause(),接下来是刚入栈的Activity的onCreate,onStart,onResume方法,接下来可能会执行上一个Activity的onStop方法,当从Task栈中弹出Activity的时候,会首先执行上一个弹出的Activity的onPause(),接着执行当前Activity的onRestart(),onStart()以及onResume(),再执行上一个弹出的Activity的onStop()以及onDestroy()。弹出的Activity若要再次被执行,即进入Task栈,需要再次执行onCreate来创建它,因为此时它已经被销毁,不能再onRestart了。
三、Activity栈
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。
四、Activity的四种启动模式
(1)standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈。
(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例。
(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop。
(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例。
五、多个Activity之间的数据传递
Activity之间可以传递数据,而且Activity不仅仅必须在同一个应用程序内,也可以在不同的应用程序之间。使用startActivity(Intent intent)来执行另外一个Activity,其中intent是很关键的,它象征了请求,其中包含了请求执行的动作,携带的数据等等信息。