美文网首页
Activity 比较详细的详解

Activity 比较详细的详解

作者: ErolC鱼 | 来源:发表于2017-10-30 19:04 被阅读0次

    本人第一次写东西,欢迎评论!!

    Activity是四大组件之一

    四大组件都是有个性的,所以他们都要在AndroidMainfest.xml文件中注册。
    Activity 几乎算是所有开始接触Android的新手第一个接触到的基本组件,只要是一个完成的APP,Activity就是不可或缺的,看看google官网的解释:

    Activities are one of the fundamental building blocks of apps on the Android platform. They serve as the entry point for a user's interaction with an app, and are also central to how a user navigates within an app (as with the Back button) or between apps (as with the Recents button).

    看不懂?那就来看看翻译吧:

    活动是Android平台上应用程序的基本构件之一。它们作为用户与应用程序交互的切入点,也是用户在应用程序中导航(如“后退”按钮)或应用程序之间的关键(与“更新”按钮一样)。

    这样就清楚多了吧。

    Activity 的新建

    新建一个Activity其实很简单,如果用的是Android studio ,那就更简单了,因为As(Android studio的简称,以下用到的都会用简称)提供了一个可以快速新建Activity的选项:


    图1 . 新建Activity

    新建好了之后本来还需要到AndroidManifest.xml文件中配置信息的

    图2 . APP第一个运行的Activity

    但是As在新建的时候会智能的帮我们去配置,但是只是单纯的配置一个Activity而已,一个最简单的Activity配置是这样的

    图3 . 最简单的Activity配置
    如果要使用隐式意图Intent来开启这个Activity还需要配置里面的意图过滤器,也就是这个<intent-filter>标签,关于意图Intent这里就不说了,看我的有关意图的文章。
    回到正题,如果用As开发,创建Activity也就选几个选项的事情,是不是很简单啊。

    Activity的生命周期

    Activity的生命周期从开始到销毁在Activity中经历的回调方法是这些

    图4 . Activity的生命周期图

    按照这个图,说说各个回调方法:

    onCreate()

    创建状态:在系统首次创建Activity时就会调用该方法,在这个方法中可以设置application的一些基本启动程序,包括获取控件,填充数据等等,由于是创建方法,所以在整个生命周期中,该方法只会被调用一次。注意:不可在onCreate()方法中去获取控件的尺寸,因为这是做不到的,来看一看各个回调方法调用的顺序:

    图5 . 生命周期顺序

    onStart()

    开始状态:通过这个方法,Activity将会进入前台,使活动对用户可见,该方法在onCreate()后面调用,该方法还会在另外一个方法后面调用,就是onRestart()方法,该方法后面再说。

    onResume()

    交互状态,也称恢复状态:调用这个方法时,说明Activity已经被置于前台了,进入了与用户交互的状态。就是说,用户可以操作该Activity了。

    onPause()

    暂停状态:Activity进入暂停状态,但依然可见,比如被半透明的弹框遮住,也就是该Activity中断了,可以使用该
    方法释放系统资源,例如广播接收器,传感器(例如GPS)的手柄,或任何可能影响电池寿命的资源,因为活动暂停,已经不需要这些资源了。

    onStop()

    停止状态:当您的活动对用户不再可见时,它已进入 停止状态,系统调用onStop()回调。例如,当新启动的活动覆盖整个屏幕时,可能会发生这种情况。当活动完成运行时,系统也可以调用,并且即将被终止。在该方法中,应用程序应该释放几乎所有的用户不需要的资源。例如,如果您注册一个BroadcastReceiver在侦听可能会影响用户界面的变化,你可以注销在广播接收器 ,因为用户不再能看到的UI。同样重要的是,您可以使用 释放可能泄漏内存的资源,因为系统可能会在不调用活动最终onDestroy回调的情况下终止托管活动的进程 。您还应该使用相对CPU密集的关机操作。例如,如果您无法找到更适合将信息保存到数据库的时间,则可能会在此期间执行此操作。以下示例显示了一个实现 ,将注释草稿的内容保存到永久存储。在这个方法之后呢,会有两条路,一条是销毁onDestroy(),一条是重生onRestart()

    onRestart()

    切换到别的界面之后重新进入Activity,而后调用的方法是onStart()方法,重新回到前台。

    onDestroy()

    销毁,该方法是整个生命周期的最后一个方法,也只调用一次,调用这个方法证明这个Activity已经到尽头了,所以就完了。

    害怕自己文笔不是很好,所以附上google官网的图,这样就更清楚啦。

    图6 . Activity回调方法以及说明
    关于 ‘是否能事后终止’ 一栏:是,则表示随时有可能被系统终止,就算是在onPause()方法,返回到onResume()方法期间也有可能被系统终止。

    杂.记

    切换横竖屏还重启Activity?

    众所周知,手机屏幕是可以切换横竖屏的,在切换横竖屏或者做某些操作的时候,会让整个Activity销毁后重新创建。其实这也没什么,只是在你没有保存你的Activity状态时,切换横竖屏就会丢掉一些数据,这是一件比较不爽的事。那有没有办法阻止Activity在切换横竖屏的时候不销毁呢,可以这样子做:

    图7

    在Activity中有个属性android:configChanges,该属性是确定友哪些操作引起的本来需要重启的操作,现在不用了,参数就是这些操作,比如orientation就是屏幕方向也就是切换横竖屏,而keyboardHidden则是表示键盘可用性及语言,如上图所示,参数可以有多个,只需要用通道|连接即可。当然啦,你也可以老老实实的去保存Activity的状态,

    注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本(正如minSdkVersiontargetSdkVersion属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了"orientation"值以外,您还必须添加"screenSize"值。 也就是说,您必须声明android:configChanges="orientation|screenSize"。但是,如果您的应用面向 API 级别 12 或更低版本,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。

    接下来说说Activity的启动模式

    Activity的四种启动模式

    再说启动模式之前,先说说Activity被创建之后所在的地方,被称为返回栈,这个栈只有栈顶一个口,进和出都在这里,创建一个Activity就放入这个栈中,如果在栈中已经有Activity,那么新创建的Activity会置于栈顶,将其他的Activity压于栈底,而手机显示的就是处于栈顶的Activity。
    引用一下官网的:

    当前 Activity 启动另一个 Activity 时,该新 Activity 会被推送到堆栈顶部,成为焦点所在。 前一个 Activity 仍保留在堆栈中,但是处于停止状态。Activity 停止时,系统会保持其用户界面的当前状态。 用户按“返回”按钮时,当前 Activity 会从堆栈顶部弹出(Activity 被销毁),而前一个 Activity 恢复执行(恢复其 UI 的前一状态)。 堆栈中的 Activity 永远不会重新排列,仅推入和弹出堆栈:由当前 Activity 启动时推入堆栈;用户使用“返回”按钮退出时弹出堆栈。 因此,返回栈以“后进先出”对象结构运行

    还有更为直观的图:


    图8 . Activity进/出栈过程

    说会启动模式。
    四种启动模式分别是:standardsingleTopsingleTasksingleInstance。在说其中模式的区别之前,先说说设置方法,其实也就是在AndroidMainfest.xml文件中Activity配置标签中的一个属性:launchMode像这样:

    启动模式的配置

    启动模式的区别

    standard(标准)是最普通的模式,也是默认的模式。就是说,在没有指定某一种启动模式时,系统会默认使用这一种模式,这模式特点就是可以有多个实例,如果Activity1是使用了该模式,可以不断创建该Activity,就算在返回栈中已经存在该Activity,所以,如果打开了三次这个Activity(就是创建三次Activity,并将之置于返回栈),那么需要“返回”三次才能推出这个Activity。

    singleTop(栈顶唯一),由名字可以知道,如果再次创建正处于栈顶的Activity,那么将不会创建,而是继续复用这个Activity。

    singleTask(栈唯一),由名字可以知道,在这种模式下,如果需要创建的Activity在栈中已经存在,那么将不会创建,而是将这个Activity提升到栈顶,继续复用这个Activity。

    singleInstance(实例唯一),如果选择了这种模式,那么无论在这个Activity的返回栈中是否存在这个Activity,系统都会为这个Activity重新创建一个单独的返回栈,这样,整个系统就只有这个Activity的这一个实例,所有的APP都可以访问这个Activity。就像打电话的Activity。

    Activity的开启与销毁

    Activity有两种开启方式:
    一种是startActivity(),另一种是startActivityForResult()。区别也很简单,一种是没有返回值的,一种是有返回值的,但是都可以将数据传输到被打开的Activity,其中用到的就是意图Intent,由于这篇文章是我专门写Activity所以就不说Intent了。然而启动Activity,Intent是必不可少的,所以在我的有关Intent的文章中会再次说到开启活动。

    那第二种启动方式返回的值该怎样获取呢?

    在Activity中有这么一个函数onActivityResult(),所有由第二种方式开启的Activity返回的值都是返回到这里的。

    那该怎样区分哪个值是由哪个Activity返回而来的呢?

    那当然是要靠请求码和返回码啦。在调用第二种开启方式是需要参数,完整的方法,包括参数是这样的startActivityForResult(Intent intent,int requestCode),第二个参数requestCode是一个请求码,然而在被开启的Activity也有一个返回方法setResult(int resultCode,Intent intent),第一个参数resultCode是一个返回码,这两个码都可以用来解答上面的问题。当然啦,在调用setResult()方法之后就要销毁被打开的页面了,毕竟调用了这个方法,就代表你已经要返回数据并退出这个Activity了。
    那如何销毁一个Activity呢?最简单直接的就是finish()方法。当然除了这个方法之外,肯定还有其他的方法。就比如ActivityCollector.finishAll(),销毁所有活动等等。

    相关文章

      网友评论

          本文标题:Activity 比较详细的详解

          本文链接:https://www.haomeiwen.com/subject/rsxuextx.html