Android-Activity

activity是一种展示型组件,用于和用户进行交互。一个activity组件可以具有特定的启动模式,不同的启动模式都会产生不同的效果。

activity的启动是由Intent触发的,其中Intent可以分为显式Intent和隐式Intent。
显式Intent可以明确地指向一个activity组件。
隐式Intent指向一个或多个目标activity,此时可以在activity上由用户自己选择。

Intent启动activity

显式Intent

 Intent(Context conntext, Class <?> class)

第一个参数提供一个启动活动的上下文,第二个参数指定想要启动的目标活动。

隐式Intent

 Intent(String action)
 Intent.addCategory(String category)
 Intent.setDate(Uri uri)
 Intent.setDateAndType(Uri uri, String mimeType)

隐式Intent是通过匹配设置在Manifest.xml中的过滤信息Intent-filter来进行设置的。一般过滤信息包括了action、category、data。

  • action:指明了当前activity可以响应的action
  • category:包含了一些附加信息,更加精准的指明activity可以响应的
  • data:指明了activity能够响应什么类型的数据
<activity android:name=".testActivity">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START"/>
        <category android:name="com.example.activitytest.DEFAULT"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http" />
    </intent-filter>
</activity>

action的匹配规则

action是一个字符串,系统预定义了一些action,我们也可以自定义action。action的匹配规则是Intent的action必须和过滤规则中的action完全匹配。

一个过滤规则中可以有多个action,只要Intent中的action能够和其中的任何一个匹配,就算做匹配成功。

category的匹配规则

category是一个字符串,系统预定义了一些category,我们也可以自定义category。
如果Intent中有category,那么Intent中所有的category都应该在过滤规则中匹配到相应的category,才可以匹配成功
如果Intent中没有category,系统在startActivity()或者startActivityForResult()时,会为Intent添加一个”android.intent.category.DEFAULT”。这也是为什么在< intent-filter >中必须有”android.intent.category.DEFAULT”这个category了。

data的匹配规则

data的语法
<data android:scheme="String"
    <!-- scheme指定URI的协议,如http file content -->
    android:host="String"
    <!-- host指定URI的主机名 -->
    android:port="String"
    <!-- host指定URI的端口号 -->
    android:path="String"
    android:pathPathern="String"
    android:pathPrefix="String"
    android:mimeType="String" />

data由两部分组成,URI和mimeType

  • mimeType指媒体类型,比如image/jpeg audio/mpeg4-generic video/*等,表示图片、文本、视频的不同媒体格式
  • URI(uniform resource identifier 统一资源标识符)用来唯一的标识一个资源。

    URI(uniform resource identifier)统一资源标识符,用来唯一的标识一个资源
    URL(uniform resource locator)统一资源定位器,是一种具体的URI,即URL不但用来标识一个资源,而且还指明了如何locate这个资源。
    URN(uniform resource name)统一资源命名,是通过名字来标识资源。
    URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

    data的匹配规则和action类似,要求Intent中含有data数据,并且能够完全匹配过滤规则中的data。如果要为Intent设置完整的data,必须调用setDateAndType()方法。

activity之间传送数据

向下一个activity传送数据

Intent.putExtra(String key, Object value)
startActivity(Intent intent)

通过startActivity方法来启动intent,Intent的putExtra()方法接收两个参数,第一个参数是键,用于后一个activity取值,第二个参数是真正要传递的数据,且数据是序列化的数据。

Intent.getStringExtra(String key)
Intent.getIntExtra(String key

第二个activity可以通过getIntent()方法获得Intent,然后调用相应的函数获取intent中的值。

返回数据给上一个活动

在第一个activity中调用startActivityForResult()方法,第一个参数是相应的Intent对象,第二个参数是请求码,用于在之后的回调中判断数据的来源。

startActivityForResult(Intent intent, int requestCode)

在第一个activity中重写onActivityResult()来接收返回的数据,第一个参数就是上面设置的请求码,第二个参数为返回的处理结果,第三个参数是回调的Intent。

public void onActivityResult(int requestCode, int resultCode, Intent data)

在第二个activity中调用setResult()方法

setResult(RESULT_OK, Intent intent)
setResult(RESULT_CANCELED, Intent intent)
finish()

activity的生命周期

活动状态

  • 运行状态:活动位于栈顶,能够和用户进行交互时,活动就处于运行状态。
  • 暂停状态:活动不位于栈顶,但仍然可见时,活动就进入暂停状态。
  • 停止状态:活动不位于栈顶,并且完全不可见时,活动就进入停止状态。系统仍然会为这种活动保存相应的状态和成员变量。
  • 销毁状态:活动从返回栈中移除,活动就进入销毁状态。

正常情况下activity生命周期

  • onCreate():表示activity正在被创建,在这个方法中可以做一些初始化的工作。
  • onRestart():表示activity正在重新启动,一般是activity在不可见状态变成可见状态下会被调用。
  • onStart():表示activity正在被启动,这时activity已经可见了,只是还没有出现在前台,无法和用户进行交互。
  • onResume():表示activity已经可见了,activity状态变为运行状态。
  • onPause():表示activity正在停止,activity状态从运行状态变为暂停状态。
  • onStop():表示activity即将停止,activity状态从暂停状态变为停止状态。
  • onDestroy():表示activity即将销毁,activity从停止状态变为销毁状态。
    这里写图片描述

异常情况下activity生命周期

activity在异常情况下终止,系统会调用onSaveInstanceState()来保存房钱activity的状态,这个方法的调用时机是在onStop()之前,但和onPause()的时间前后顺序并没有规定。

当activity被重新创建以后,系统会调用onRestoreInstanceState(),并且把onSaveInstanceState()方法所保存的Bundle对象作为参数传递给onRestoreInstanceState()和onCreate()方法。onRestoreInstanceState()调用的时机是在onStart()之后。

activity的启动模式

activity指定启动模式

  • 通过在AndroidManifest.xml对< activity >指定的android:launchMode设置
  • 通过Intent.addFlags()设置标志位来指定启动模式

两者的区别在于:

  1. Intent的指定优先级更高,当两种同时存在,以Intent的方式为准
  2. 第一种无法设定FLAG_ACTIVITY_CLEAR_TOP标识
  3. 第二种无法为activity指定singleInstance模式

activity LaunchMode

  • standard:标准模式,这是系统的默认模式。每次启动一个activity都会创建一个实例。创建的实例会进入到启动它的activity所属的任务栈中。
  • singleTop:栈顶复用模式,如果新的activity已经位于任务栈的栈顶,那么activity不会被重新创建,同时它的onNewIntent()会被回调。
  • singleTask:栈内复用模式,如果新的activity已经存在在任务栈中,则将任务栈的该activity以上的activity全部出栈。
  • singleInstance:单实例模式,具有此模式的activity只能单独的位于一个任务栈中。

activity Flags

activity的Flags有很多,有的标记位可以设定activity的启动模式,有的标记位可以影响activity的运行状态

  • FLAG_ACTIVITY_NEW_TASK:相当于指定了activity的“singleTask”启动模式
  • FLAG_ACTIVITY_SINGLE_TOP:相当于指定了activity的“singleTop”模式
  • FALG_ACTIVITY_CLEAR_TOP:当有此标记位的activity启动时,在同一个任务栈中所有位于它上面的activity都会出栈,一般会和singleTask启动模式一起出现。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值