本人第一次写东西,欢迎评论!!
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()
方法中去获取控件的尺寸,因为这是做不到的,来看一看各个回调方法调用的顺序:
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 或更高版本(正如
minSdkVersion
和targetSdkVersion
属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了"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进/出栈过程
说会启动模式。
四种启动模式分别是:standard
、singleTop
、singleTask
、singleInstance
。在说其中模式的区别之前,先说说设置方法,其实也就是在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()
,销毁所有活动等等。
网友评论