Activity原理分析(一)

Activities

一个Activity是一个application组件,提供一个屏幕, 跟用户交互 来完成一些事情,如打电话,拍照,发邮件或者看地图。每个activity有一个window,在上面画着它的UI,这个window填充这个屏幕,但是有的比屏幕小 并且悬浮在别的windows上面。

一个应用通常包含了许多activities,他们相互绑在一起,typically, 在一个应用里,有一个MainActivity,它是用户点击桌面应用图标后出现的第一个activity。每一个应用然后可以启动另外一个应用来执行不同的Action,每次一个新的activity start 前面那个activity就stopped,但是系统保留这个activity在一个stack(back stack)中,当一个activity起来时,它被放在stack的最前面,当完成事情后按back键时,因为stack是后进先出 所以这个在最前面的activity 被push出栈,也就是destory了,然后在它之前的activity就resume了。。

当一个activity被stopped 是因为新的activity 被start了, 这些变化会触发activity生命周期里相应的回调函数。 每一个activity都有可能触发几个回调函数, 因为有可能有多次状态发生变化。 无论activity  create   stop   resume   destroy    都会触发, 这样子 你就能在每个状态时在相应的回调函数里做事情, 例如, 当它stopped , 你可以把任何大的对象释放,如网络 或者 数据库连接, 当activity resume时 你可以重新请求需要的资源 和恢复那些中断的actions, 这些状态转换 是activity 生命周期的全部。

剩下的文章主要讨论 如何build 跟use  an activity, 包括阐释一个完整的activity 生命周期工作,so 在不同状态切换时候 你可以安排他们的通信。


Starting an Activity

你可以开始另外一个activity 用 startActivity()这个方法,通过传递一个Intent 来描述你要启动的activity,这个Intent要么指定想要启动的activity 或者描述你要执行的动作(这样系统就可以为你选择正确的activity, 甚至可以启动别的应用的activity )。 intent 也可以稍上小量的数据  在被启动的activity中使用。

当在自己的application中,你通常需要launch 一个知道的activity, 你可以new 一个intent 把想要启动的activity的类 传进去 并且调用startActivity 接口就可以启动

However, 你的应用 想要perform some action 如 发邮件 编辑短信息 或者 系统升级 ,用你的现在activity的数据。 在这种情况下,如果你的应用没有做这些动作的activity时,这时候,你就要调用在这个手机上的别的应用的activity ,这个时候就是intent的真正价值所在了,你可以new 一个intent, 它描述了你想要做的动作, 然后用这个intent 启动的

activity 就是你想要做的事情的activity, 如果有多个activity 可以处理这个intent的响应时,你可以选择用哪个, 如 你想发邮件 你可以这样做 在当前的activity里:


这个EXTRA_EMAIL extra 是一个 字符串 array的KEY 通过它来传递 recipientArray 这个数组 代表着将要发送的邮件地址, 在新的发邮件页面里,可以通过这个KEY来读出。当用户在发送按钮上点done 时 然后邮件发送出去, 然后你刚才那个activity resume了。


Starting an activity for a result

有时候,你可能想要收到一个结果从你刚刚启动的activity里, 在这种情况下, 如果调用startActivityForResult() (instead of startActivity())就可以实现,为了获得这个结果,你必须在onActivityResult() 方法里得到, 当第二个activity 结束, 它会返回一个带结果的intent到第一个activity的OnActivityResult方法里。

例如,可能你想打电话时调用联系人找出某人 然后把结果返回到打电话界面 下面就是完成这个功能:


这个例子展示了使用onActivityResult()方法的基础的逻辑,先checkrequest是不是成功,如果成功 看看resultcode是不是ResultOk,然后 requestCode是不是跟第二个参数匹配,最后 代码处理了 传回来intent的数据

这里有一个ContentResolver  就是一个数据队列, 是第二个activity提供的contentProvider  它返回的是一个Cursor 可以通过查询数据来得到要的数据, 这个后期在Content Providers 会讲到。


Shutting Down an Activity


可以调用finish() 来关闭当前activity 想要关闭之前打开的activity 可以调用finishActivity()方法

注意: 通常情况下,最好不要强制finish an Activity 用这些方法, 让Activity根据生命周期来进行最好, 系统会自动处理, 所以 你不需要亲自finish Activity, 调用这些方法能形象用户体验 只要当你明显不像让用户返回到某个Activity的实例时才使用这些方法。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值