android 四大组件之activity

来源:互联网 发布:python 自动化 工业 编辑:程序博客网 时间:2024/05/23 00:00

    Activity是一个独立的,可以与用户交互的android应用组件。他是一个功能强大的界面管理者,他负责调度各种界面视图,帮助开发人员完成android应用与用户之间的交流。Android应用就像一出戏,activity就是其中的一幕,用户界面就是舞台,Activity不仅仅要负责舞台上的表演,还要负责相关的灯光,音乐等,协调各个部分把戏演好。

一、Activity的生命周期

Activity 组件和java EE中的Servlet 组件一样,属于托管代码,即它的创建和销毁不是由组件自身或者用户来决定的,而是由它的运行的环境,或者说是容器决定。所以我们不能改变它,只能适应它。

        Activity的生命周期:  onCreate()——>onResume()——>onPaused()——>onStop()——>onDestory().

  1. onCreate:在这里创建界面,做一些数据的初始化工作,所以要避免在这里做太多的任务。可以延迟到onStart或onResume
  2. onStart:到这一步变成用户可见不可交互的。
  3. onResume:变成和用户可交互的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
  4. onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动。
  5. onstop:变得不可见,被下一个activity覆盖了
  6. onDestroy:这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用 isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。

在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart ->onResume。在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复的时候onResume 。

onPause,onstop, onDestroy,三种状态下activity都有可能被系统干掉为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。

二、Activity的管理

Android系统中可以运行多个android应用,每个andorid应用又可以包含多个activity,那个android是如何管理这些activity的呢?事实上,android是通过栈的方式来管理的activity的。当用户打开一个activity,就会把当前的activity压入栈顶;当用户操作返回按钮,就相当于把当前的activity销毁,则此activity将从栈中抛出。
为什么采用这种堆栈的方式来管理activity呢?这是由于android特有的运行环境和运行方式决定的,因为手机屏幕狭小,每次只能显示一个activiy用户界面,所以,android按照使用时间从近到远的顺序将屏幕对应的activity保存在堆栈中,使得系统中的程序得到最合理的缓存,将大大提高系统的响应速度。

三、activity被系统回

注意:①当设备冲横屏切换到竖屏时,android会将当前的activiity销毁,重新创建一个新的activity。OnCreate被重新执行。

解决办法是:在AndroidMainfest,xml中配置一下activity属性:

android:configChanges="orientation|keyboardHidden";
当系统资源紧张时,activity很可能会被杀死,以便回收系统资源。这种情况下,当activity再次被请求时,activity将重新被创建。
解决办法是:
//在onSaveInstanceSate方法中
public void onSaveInstanceSate(Bundle state){
      super.onSaveInstanceSate(sate);
      state.putInt("id",1);
      state.putString("name","tom");  
}
        //在OnCreate方法中
public void OnCreate(Bundle state){
if(sate!=null){
int id = state.getInt("id");
int name = state.getString("name");
}
}

三、activity与其它组件之间的交互

activity 之间的交互是通过Intnet组件来完成的,Intent 是要执行动作的抽象描述,它可以通过startactivity()启动新的activity,sendBroadcast发送给任何有兴趣的BroadcastReceiver组件和Context.startService()与service组件进行通信。这里就不做详细讲解。

四、activity的启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
    Activity启动模式设置:<activity android:name=".MainActivity" android:launchMode="standard" />    Activity的四种启动模式:1. standard:默认模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop:如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 4. singleInstance:在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
activity的启动模式详细介绍:http://www.cnblogs.com/meizixiong/archive/2013/07/03/3170591.html

        

0 0