Android-9-Activity
Posted 木白星枝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-9-Activity相关的知识,希望对你有一定的参考价值。
目录
1.Activity是Android程序中的四大组件之一,为用户提供可视化界面及操作。
1.Activity是android程序中的四大组件之一,为用户提供可视化界面及操作。
在Android系统中,用户与程序的交互是通过Activity完成的,Activity负责管理Android应用程序的用户界面。Fragment是一种可以嵌入到Activity中的UI片段。
新建一个Activity
在Activity中添加那几行代码,才会默认该Activity是启动项
创建一个Activity时,会自动在清单文件中注册。只有继承自AppCompatActivity时,他才是一个Activity要不然就是一个普通的类,onCreate方法是重写的,在Activity创建时调用。
2.Activity的生命周期
Activity生命周期指的是一个Activity从创建到销毁的全过程。Activity的生命周期分为5种状态,分别是启动状态、运行状态、暂停状态、停止状态和销毁状态。其中启动状态和销毁状态是过渡状态,Activity不会在这两个状态停留。
(1)启动状态:Activity的启动状态很短暂,一般情况下,当Activity启动之后便会进入运行状态。
(2)运行状态:Activity在此状态时处于屏幕最前端,他是可见、有焦点的,可以与用户进行交互,如点击事件等。当Activity处于运行状态时,Android会尽可能地保持它地运行,当出出现内存不足地情况,Android也会先销毁栈底地Acticity,来确保当前Activity的正常运行。
(3)暂停状态:在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有响应,此时它就处于暂停状态。例如,当前Activity上覆盖了一个透明或者非全屏的Activity时,被覆盖的Activity就处于暂停状态。
(4)停止状态:当Activity完全不可见时,它就处于停止状态,但仍然保留着当前状态和成员信息。如果系统内存不足,那么这种状态下的Activity很容易被销毁。
(5)销毁状态:当Activity处于销毁状态时,将被清理出内存。
3.Activity生命周期的方法
(1)onCreate()方法:是在Activity创建时调用,通常做一些初始化设置
(2)onStart()方法:在Activity即将可见时调用,
(3)onResume()方法:在Activity获取焦点开始与用户交互时调用
(4)onPause()方法:在当前Activity 被其他Activity覆盖或锁屏时调用
(5)onStop()方法:在Activity对用户不可见时调用
(6)onDestroy()方法:在Activity销毁时调用
(7)onRestart()方法:在Activity从停止:状态再次启动时调用
4.横竖屏切换时的生命周期
(1)在进行横竖屏切换时,不让Activity销毁并重建
<activity android :name=".MainActivity"
android :configChanges="orientation|keyboardHidden|screenSize">
(2)希望Activity的界面一直处于横屏或者竖屏的状态
横屏:android :screenOrientation="portrait"
竖屏:android :screenOrientation="landscape"
5.Activity的启动模式
(1)standard 模式:standard是Activity的默认启动模式,这种模式的特点是,每启动一个Activity就会在栈顶创建一个新的实例。
(2)singleTop 模式:当Activity 已经位于栈顶,而再次启动Activity 时还需创建一个新的实例,不能直接复用。在这种情况下,使用singleTop模式启动Activity更合理,该模式会判断要启动的Activity 实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例。
(3)singleTask 模式:如果Actity并未处于栈顶位置,则可能还会创建多个实例。如果想要某个Activity在整个应用程序中只有一个实例,则需要借助singleTask模式来实现了。当Actity的启动模式指定为singleTask时,则每次启动该Activity时,系统首先会检查栈中是否存在当前Activity 实例,如果存在则直接使用,并把当前Activity之上的所有实例全部出栈,否则会重新创建一个实例。浏览器主界面通常采用这种模式。
(4)singlelnstance模式:singleInstance模式是4种启动模式中最特殊的一个,指定为singleInstance 模式的Activity会启动一个新的任务栈来管理Activity 实例,无论从哪个任务栈中启动该Activity,该实例在整个系统中只有一个。这种模式存在的意义,是为了在不同程序中共享同一个Activity实例。Activity采用singlelnstance模式启动分两种情况,一种是要启动的Activity不存在,则系统会先创建一个新的任务栈,然后再创建Activity实例。一种是要启动的Activity已存在,无论当前Activity位于哪个程序哪个任务栈中,系统都会把Activity所在的任务栈转移到前台,从而使Activity显示。实际开发中,来电界面通常采用这种模式。
6.Activity之间的跳转
需要用到Intent(意图)组件,通过Intent可以开启新的Activity实现界面跳转功能。
Intent被称为意图,是程序中各组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。一般用于启动Activity、Service 以及发送广播等。根据开启目标组件的方式不同,Intent 被分为显式意图和隐式意图两种类型。显示意图一般在应用的内部使用,隐式意图是在应用与应用之间使用的,当一个应用要激活另一个应用中的Activity时(看不到源码),仅仅能使用隐式意图。依据Activity配置的意图过滤器建一个意图,让意图中的各项參数的值都跟过滤器匹配,这样就能够激活其它应用中的Activity。
(1)显式意图:可以直接通过名称开启指定的目标组件,通过其构造方法Intent(Context packageContext, Class<?> cls)来实现,其中第1个参数为Context表示当前的Activity对象,这里使用this或者Activity1.this即可,第2个参数Class表示要启动的目标Activity。通过这个方法创建-一个Intent对象,然后将该对象传递给Activity的startActivity ( Intent intent )方法即可启动目标组件。
Intent intent = new Intent (this, Activity02.class); //创建Intent对象
startActivity (intent) ;//开启Activity02
(2)隐式意图:相比显式意图来说更为抽象,它并没有明确指定要开启哪个目标组件,而是通过指定action和category等属性信息,系统根据这些信息进行分析,然后寻找目标Activity。其示例代码如下。
Intent intent =new Intent() ;
//设置action动作,该动作要和清单文件中设置的一样
intent. setAction ("cn. itcast. START_ ACTIVITY");
startActivity (intent) ;
在上述代码中,只指定了action,并没有指定category,这是因为在目标Activity的清单文
件中配置的category是一一个默认值,在调用startActivity()方 法时,自动将这个category添加到
Intent中。
很显然,只有上述代码还不能开启指定的Activity, 还需在目标Activity 的清单文件中配置
<intent- filter>,指定当前Activity能够响应的action和category,示例代码如下。
<activity android : name="cn. itcast . Activity02">
<intent-filter>
<!--设置action属性,需要在代码中根据所设置的name打开指定的组件-->
<action android:name="cn. itcast . START ACTIVITY"/>
<category android:name= "android. intent. category. DEFAULT"/>
</ intent-filter>
</activity>
在清单文件中,目标组件Activity02指定了可以响应的<action>和<category>信息,只有当action和category属性与目标组件设置的内容相同时,目标组件才会被开启。需要注意的是,每个Intent只能指定一个action,却能指定多个category。
(3)点击按钮打开浏览器展示
在上述代码中,通过setAction()设置需要开启Activity的动作为“" android.intent.action. VIEW",这是一个Android系统内置的动作,通过这个动作可以和浏览器进行匹配。然后通过Uri.parse()方法将-一个网址字符串解析成Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。
7.Activity中的数据传递
在Android系统中,组件之间也可以进行消息传递或者数据传递,此时使用的也是Intent。Intent不仅可以开启Activity、Service、 BroadcastReceiver 组件,还可以在这些组件之间传递数据。
Intent 提供了一系列重载的putExtra(String name,String value)方法,通过该方法可以将要传递的数据暂存到Intent中,当启动另个Activity之后,只需将这些数据从Intent取出即可。
例如将Activity01中的字符串传递到Activity02中,示例代码如下。
Intent intent = new Intent (this, Activity02.class) ;
intent. putExtra("extra_ data", "Hello Activity02") ;
startActivity (intent) ;
putExtra()方法中接收两个参数,第1个参数是键用于后面从Intent中取值,第2个参数是传递的数据内容。
接下来在Activity02中取出传递过来的数据,示例代码如下。
Intent intent = getIntent();
String data = intent . getStringExtra ("extra data");
在上述代码中,首先通过getIntent()方法获取Intent 对象,然后调用getStringExtra(String name),根据传入的键值,取出相应的数据。由于这里传递的是字符串类型数据,因此使用getStringExtra()方法获取传递的数据。如果传递的数据是整数类型,则使用getlntExtra()方法,以此类推。
8.Activity中的数据回传
在Activity中,使用Intent既可以将数据传给下一个Activity,还可以将数据回传给上一个Activity。Activity 中提供了一个startActivityForResult(Intent intent,int requestCode)方法,该方法也用于启动Activity,并且这个方法可以在当前Actity销毁时返回一个结果给上一个Activity。
startActivityForResut(Intent intent, int requestCode)方法 接收两个参数,第1个参数是Intent对象,第2个参数是请求码,用于判断数据的来源,输入一个唯一值即可。使用该方法在Activity01中开启Activity2的示例代码如下。
Intent intent = new Intent (this, Activity02.class);
startActivityForResult (intent,1) ;
接下来在Activity02中添加返回数据的示例代码,具体如下。
Intent intent = new Intent() ;
intent . putExtra ("extra_ data", "Hello Activity01");
setResult (1, intent) ;
在上述代码中,同样构建了一个Intent对象,然后调用setResult(int resultCode, Intent data)方法向上一个Activity回传数据,其中第1个参数用于向Activity01返回处理结果,-般使用“0"或“1",第2个参数是把带有数据的Intent传递回去。由于使用startActivityForResult()方法启动Activity02, 在Activity02被销毁之后会回调Activity01的onActivityResult()方法,因此需要在Activity01 中重写该方法来得到返回的数据,示例代码如下。
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
super.onActivityResult (requestCode, resultCode, data) ;
if (requestCode == 1) {
if (resultCode == 1) {
String string=data.getStringExtra ("extra_ data");
}
}
}
在Activity01中,通过实现onActivityResult(int requestCode, int resultCode, Intent data)方法来获取返回的数据。该方法有3个参数,第1个参数requestCode表示在当前Activity01启动ActivityO2时传递的请求码;第2个参数resultCode表示在ActivityO2返回数据时传入结果码;第3个参数data表示携带返回数据的Intent.。
需要注意的是,在一个Actity 中很可能调用startActivityForResult()方法启动多个不同的Activity ,每一个Activity 返回的数据都会回调到onActivityResult()这个方法中。因此,首先要做的就是通过检查requestCode的值来判断数据来源,确定数据是从Activity02 返回的,然后通过resultCode的值来判断数据处理结果是否成功,最后从data中取出数据,这样就完成了Activity 数据返回的功能。
以上是关于Android-9-Activity的主要内容,如果未能解决你的问题,请参考以下文章