Activities简介

Activity类是android应用程序中的一个重要组件,activity对象组织和启动的方式更是android平台应用程序模型的基础。与范式编程使用main()函数启动应用不同,android系统在Activity实列中通过调用符合当前Activity生命周期的回调方法来执行代码。

本文档介绍activities的基本概念,并提供一些使用activities的轻量级指导。如需构建App最佳实践的更多信息,请参考 Guide to App Architecture。

activities的概念

移动应用程序体验与桌面应用程序不同,用户与应用程序的交互不总是在同一个地方开始。程序的开启经常是不确定的。比如,你在主屏幕开启一个Email app你可能看到的是email列表,但如果你在使用社交媒体app的途中打开一个email app,你可能会直接前往email的编辑页面。

Activity类就是为解决以上问题而设计的。一个app调用另一个app时,实际上调用的是该app的activity而不是调用的整个app。activity通过这种方式作为app和用户交互的入口点。可以通过继承Activity类来实现一个activity。

Activity提供了app绘制其UI的窗口。该窗口通常会填充整个屏幕,但可能比屏幕小,并且浮动在其他窗口之上。通常,一个activity实现着一个屏幕。例如,一个app的活动实现了选项屏幕,另一个activity实现了图片选择屏幕。

大多数应用包含多个屏幕,这意味着它们有多个activity。通常,一个应用程序会有一个 main activity,当用户启动app时,该acitvity所实现的屏幕就会首先出现在用户面前。然后,每个activity就可以开启其他activity以执行不同的操作。例如,一个简单的邮件app的 main activity 可能会提供一个展示收件箱的屏幕。从收件箱屏幕开始,main activity可以启动其他提供了例如邮件编辑和打开个人邮件屏幕的activity.

虽然app中的activity通过相互协作以形成有粘性的用户体验,但是每个activity仅仅是松散地绑定到其他activity,app中的活动通常有最小的依赖关系。实际上,activity经常会启动其他应用的activity。例如,一个浏览器app可能会启动一个社交媒体app的分享activity。

要在app中使用activity,就必须在app的manifest文件中注册activity的信息,并且正确地管理activity的生命周期。本文档的其他部分将介绍这些内容。

配置manifest文件

要想在app中使用activity,必须先定义activity,并在manifest文件中表明activity的属性。

定义activity

打开manifest文件,添加一个<activity>元素作为<application>元素的子元素以定义activity。例如,

<manifest ... ><application ... ><activity android:name=".ExampleActivity" />...</application ... >...
</manifest >

<activity>元素唯一需要的属性是android:name,该属性指向activity的类名。还可以添加定义activity特征的属性,例如标签、图标或UI主题。有关这些属性和其他属性的更多信息,请参见<activity>元素参考文档。

注意:在发布应用程序后,不应更改activity名称。如果这样做,可能会破坏某些功能,例如应用程序快捷方式。有关发布后避免更改的更多信息,请查看无法更改的内容。

定义intent filters

intent filters是android平台上的一个非常强大的特性。它们提供了启动activity的能力,不仅基于明确的请求,还能基于不明确的请求。例如,一个明确的请求会告诉系统"打开Gmail app中的发送邮件activity"。相比之下,一个不明确的请求会告诉系统"打开任何一个能发送邮件的activity"。当系统UI询问用户在执行任务时使用哪个应用程序时,这就intent filters在起作用。

可以通过在<activity>元素中定义<intent-filter>属性来使用该特性。<intent-filter>元素的定义包含一个<action>元素和可选的<category>元素和<data>元素。这些元素结合在一起,可以指定您的activity可以响应的intent类型。例如,下面的代码片段演示如何配置发送文本数据的activity,并接收来自其他activity的请求:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"><intent-filter><action android:name="android.intent.action.SEND" /><category android:name="android.intent.category.DEFAULT" /><data android:mimeType="text/plain" /></intent-filter>
</activity>

在本例中<action>元素指定本activity发送数据。将<category>元素设为default使activity能接收启动请求。<data>元素指定了该activity能发送的数据类型。以下代码片段展示了如何调用上述activity:

val sendIntent = Intent().apply {action = Intent.ACTION_SENDtype = "text/plain"putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

如果你想要自己的app“自给自足”并且不允许其他app触发你的app的activity,你不需要使用其他任何intent filters。不想要其他程序获取到的activity不应该有intent filters,您可以自己通过显式intent(在app范围内)来启动这些activity。有关activity如何响应intent的更多信息,请查看ntents and Intent Filters.

定义Permissions

您可以通过manifest文件的<activity>标签那些app可以启动指定的activity。一个父activity不能启动一个子activity除非这两活动在manifest文件定义了相同的权限。如果您为一个activity定义了<uses-permission>元素,调用的activity必须要有与之相应的<uses-permission>元素。

例如,如果你想使用一个假设名为SocialApp的app在社交媒体上分享邮件,SocialApp自己必须定义一个调用它的app也必须有的permission:

<manifest>
<activity android:name="...."android:permission=”com.google.socialapp.permission.SHARE_POST”/>

为了可以调用SocialApp,你的app必须在适配SocialApp中的permission设置:

<manifest><uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

有关权限和安全相关的更多信息,请查看Security and Permissions.

管理activity的生命周期

在activity的生命周期中,activity经历了许多状态。您可以通过一系列的回调方法来处理这些状态间的转换。接下来的部分,将会介绍这些回调方法。

onCreate()

该回调方法必须实现,该方法在系统创建activity时创建。该方法的实现必须初始化创建的activity的基本组件。例如,app中创建的views和绑定到列表的数据应该在此处完成。最重要的是,

必须在该方法内调用setContentView()方法以定义activity的用户界面的layout。

当onCreate()方法执行完毕后,下一个回调的方法是onStart()

onStart()

当onCreate()方法执行完毕后,activity进入started状态,并对用户变为可见。该回调方法包含使当前activity变为可与用户交互的前台activity最后的准备工作。

onResume()

系统仅在activity与用户开始交互前调用该方法,此时,activity处于activity栈的顶部,并获取所有的用户输入。一个app的大多数核心功能在onResume方法中实现。

onPause()方法总是在onResume方法之后调用。

onPause()

系统会在activity失去焦点和进入暂停状态时调用onPause()方法。例如,当用户点击"后退"或"最近"按钮时,就会出现这种状态。当系统为activity调用onPasuse()方法时,从技术上讲,该activity仍然部分可见,但通常表明用户正在离开activity,并且该activity会很快进入stopped状态或者resumed状态。

如果用户期待更新UI,处于暂停状态的activity可以继续更新UI。例如,一个包含地图导航或者媒体播放器的activity。即使这些activity失去了焦点,用户仍然希望UI继续更新。

不应该在onPause()方法中保存程序或者用户数据、调用网络、执行数据库事务。如需更多关于数据保存的信息,请查阅Saving and restoring activity state.

onStop()

系统会在activity不再对用户可见时调用onStop()方法。这可能是因为activity正在被销毁,一个新的activity正在开始,或者一个现有的activity正在进入恢复状态,并且正在覆盖已停止的activity。在所有这些情况下,停止的activity都不再可见。

如果activity正在返回与用户交互的状态,系统调用的下一个回调方法是onRestart(),如果活动被完全终止,则会调用onDestroy().

onRestart()

当处于停止状态的activity即将重新启动时,系统将调用此回调。onRestart()将activity恢复到该activity stopped时的状态。该方法后面总是跟着onStart()方法。

onDestroy()

系统在activity销毁前调用该方法。

这个回调是activity接收到的最后一个回调方法,onDesty()的实现通常是为了确保在activity或包含该activity的进程被销毁时释放所有资源。本节只对activity的生命周期进行简介。有关活动生命周期及其回调的更详细处理,请参见活动生命周期。

转载于:https://www.cnblogs.com/Shadowplay/p/9453435.html

Activity简介相关推荐

  1. 第三章:Activity简介和Fragment应用

    Activity的生命周期 Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activit ...

  2. 安卓四大组件之Activity

    1.Activity简介 它是安卓四大组件之一,用于界面的展示,是最贴切用户的一个组件,所以说它的操作 都与用户密切相关,可以通过setContentView来显示制定控件.通常情况下,在一个安卓应用 ...

  3. 安卓学习笔记05:Activity概述

    文章目录 零.学习目标 一.Activity简介 二.创建自定义Activity 1.基于普通类继承AppCompatActivity来创建 2.基于Android Studio的Activity模板 ...

  4. Android实战——Activity超详细学习笔记

    一.Activity简介 Activity是四大组件中最重要的一个,也是平时开发中接触最多的.与Activity启动行为相关的就是它的启动模式,Standard.SingleTop.SingleTas ...

  5. Android的Activity之生命周期

    Activity 简介  在讲解Activity之前,我先说一下为什么会有Activity这个组件.移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...

  6. 可视化界面:Activity 详解

    文章目录 Activity 简介 Activity 配置清单 声明activity intent过滤器 声明权限 Activity 生命周期 onCreate() onStart() onResume ...

  7. Android四大组件完全解析(一)---Activity

    本文参考\android\android\frameworks\base\core\java\android\app\Activity.java文件中的类注释,以及android/frameworks ...

  8. Android学习之详解Activity的生命周期

    Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...

  9. Android入门之Activity的创建及生命周期方法

    Activity简介 Activity用于提供可视化用户界面的组件, 可以与用户进行交互来完成某项任务. 一个Activity对象代表一个单独的窗口. 一个应用程序中会有一个Activity被指定为主 ...

最新文章

  1. keras 的 example 文件 mnist_siamese.py 解析
  2. 快速了解Kubernetes微服务中的通信
  3. GetMessage和PeekMessage的区别
  4. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式
  5. Spring Boot和应用程序上下文层次结构
  6. 网上支付心案例payment
  7. 配置python程序debug/run,避免每次运行都会重复加载数据集或模型,节约大量等待时间
  8. Android 功耗( 21 )---MTK 低功耗1
  9. signature=45ca03a07a2e888fb57b0d2c351110d7,Attention: Docket Number H054a Dec. 31,2004
  10. git 还原到某个版本_Git常用命令
  11. 基于html超市管理系统,超市管理系统后台模板
  12. 物料移动类型和后勤自动科目设置-转
  13. excel sumifs多条件求和
  14. swift实现python中的spicy.signal.find_peaks
  15. TFTP协议解析及C/C++代码实现
  16. 视频播放–AVPlayer
  17. 哔哩哔哩笔试 01串求最长1子串的长度
  18. 00.关于Android开发的任务分工
  19. 有效监控的 10 条基本原则
  20. 【在线图表生成】掌握这些图表,年终报表根本不用愁!

热门文章

  1. 软件工程作业汇总(网络14、15、16)
  2. Intellij IDEA连接Spark集群
  3. 关于使用Tomcat服务器出现413错误的解决办法(Request Entity Too Large)
  4. 华南理工大学2016年数学分析高等代数考研试题参考解答
  5. 那些不能遗忘的知识点回顾——C/C++系列(笔试面试高频题)
  6. Purus系统常见使用问题及解决方式FAQ 1
  7. asp.net关于倒出excel文件
  8. 前端性能优化之缓存技术
  9. 银行不放款可以换银行贷款吗?
  10. Linux系统是什么