天天看点

Android Activity 初识(一)

一、什么是Activity

  1. Activity 是用户接口程序(Android系统中的四大组件之一),原则上它会提供给用户一个交互式的接口功能(可以用于显示View)。它是 android 应用程序的基本功能单元。Activity 本身是没有界面的,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道。

二、activity生命周期

  1. 生命周期图
    Android Activity 初识(一)
  2. 函数控制
public class Activity extends ApplicationContext {

    protected void onCreate(Bundle savedInstanceState);

    protected void onStart();

    protected void onRestart();

    protected void onResume();

    protected void onPause();

    protected void onStop();

    protected void onDestroy();

}
           
  • 在一个Activity正常启动过程中,这些方法调用的顺序是:

    onCreate -> onStart -> onResume;

    在Activity被kill掉的时候方法顺序是:

    onPause -> onStop -> onDestroy;

    此为一个完整的Lifecycle。

    那么对于中断处理(比如电话来了),则是onPause -> onStop,恢复时onStart -> onResume;

    如果当前应用程序的是一个Theme为Translucent(半透明) 或者Dialog 的Activity那么中断就是onPause ,恢复的时候onResume。

  • onCreate:在这里创建界面,做一些数据的初始化工作;这个也是执行setContentView(View)函数的地方,setContentView(View)函数可以传入一个由XML

    编制的UI界面,可以使UI和具体实现完全分离。

  • onStart: 到这一步变成“用户可见不可交互”的状态;
  • onResume:变成和用户可交互的,(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity);
  • onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。更重要的是,任何在当前Activity中的任何改变都要在这个函数中提交。
  • onStop:变得不可见 ,被下一个activity覆盖了
  • onDestroy:这是Activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中运行,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常。onPause,onstop, onDestroy,三种状态下 activity都有可能被系统kill 掉。

三、 Activity的四种状态

  • Activity有四种状态:
  • 活动状态(active):当Activity处于Stack(栈)顶时,就是手机当前的现实屏幕,这是 Activity就处于activity或者运行状态。
  • 运行但是失去焦点:当Activity还处于运行状态时,但是屏幕是有另外一个Activity处于文档处于焦点状态,当前的Activity就处于pause。
  • 停止:当Activity被另一个Activity完全覆盖的时候,就被停止了,其实就是虽然在运行,但是用户却看不见
  • 结束:当Activity处于pause或者stop时,系统可以结束 Activity,回收资源,这是Activity就是处于结束状态了。

    处于结束状态的是Activity,如果要使用户可见,只要重启才可以。

四、Activity的响应时间

  • 当前Activity所在的线程为主线程,它的响应时间为5秒,如果在当前运行的Activity中进行耗时的操作且响应时间起过5秒,那么程序就会报ANR错误。所以,这也是不建议在Activity中写太多复杂代码的原因之一。

    当然,有些代码只能写在Activity中,不然就运行不了(它们不是生命周期方法),比如你想要获得android系统或者硬件一的些信息,就必须在Activity中写出来,如果单独写一个工具类获得不了。

五、Activity之间的通信

  • 在 Android 中,不同的 Activity 实例可能运行在一个或不同进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。

      Intent负责对操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

      

      在应用中,我们可以以两种形式来使用Intent:

     直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

      间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。

      对于直接Intent,Android不需要去做解析,因为目标组件已经很明确。

      Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。

六、Activity的栈式管理

  • Android针对Activity的管理使用的是栈,就是说某一个时刻只有一个Activity处在栈顶,当这个Activity被销毁后,下面的Activity才有可能浮到栈顶,或者有一个新的Activity被创建出来,则旧的Activity就被压栈沉下去了。Activity是Android程序的表现层。程序的每一个显示屏幕就是一个Activity。正在运行的Activity处在栈的最顶端,它是运行状态的。
    Android Activity 初识(一)
    当在程序中调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:它告诉 Activity Manager该Activity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity ,把原 Activity 压入到栈的第二层,从 Running 状态转到 Paused 状态。

七、Activity的跳转

  • Activity跳转,无返回结果

    这是最简单的Activity跳转方式。从一个Activity启动另一个Activity,直接startActivity(new Intent(当前Activity.this, 下一Activity.class))

  • Activity跳转,返回数据/结果

    需要返回数据或结果的,则使用

    startActivityForResult (Intent intent, int requestCode);

    setResult(int resultCode)只返回结果不带数据,

    或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是

    onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。

    注意,在setResult后,要调用finish()销毁当前的Activity,否则无法返回到原来的Activity,就无法执行原来Activity的onActivityResult函数,看到当前的Activity没反应。