Android开发之程序活动单元Activity【1】_andriod的activity怎么写-程序员宅基地

技术标签: android  Andriod学习  

前言

  • 本文学自宁传奇老师,仅供学习和参考,禁止用作任何商业用途!

一 Activity简介

  • Android中的四大组件分别是活动Activity、服务Service、内容提供器ContentProvider、广播接收器BroadercastReceiver
  • Activity是一个负责和用户交互的组件、每个Android应用中都会用Activity来显示界面以及处理界面上一些控件的时间

二 Activity的生命周期

2.1 Activity的声明周期状态

  • Activitiy的生命周期是指Activity从创建到销毁的整个过程,分别分为:启动状态、运行状态、暂停状态、停止状态和销毁状态。
  • 启动状态 :Activity的启动状态很短暂,一般情况下,当Activity启动之后便会进入运行状态。
  • 运行状态:Activity在此状态时处于界面最前端,它是可见、有焦点的,可以与用户进行交互,如点击界面中的按钮和在界面上输入信息等。
  • 暂停状态:在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有响应,此时它就处于暂停状态。例如,当前Activity上覆盖了一个透明或者非全屏的界面时,被覆盖的Activity就处于暂停状态。
  • 停止状态:当Activity完全不可见时,它就处于停止状态。如果系统内存不足,那么这种状态下的Activity很容易被销毁。
  • 销毁状态:当Activity处于销毁状态时,将被清理出内存。
  • 当Activity处于运行状态时,Android会尽可能地保持这种状态,即使出现内存不足的情况,Android也会先销毁恚底的Activity,来确保当前Activity正常运行。
  • 需要注意的是,Activity生命周期的启动状态和销毁状态是过渡状态,Activity不会在这两个状态停留。

2.2 Activity声明周期方法

方法 说明
onCreate:创建活动 此时会把页面布局加载进内存,进入了初始状态。
onStart:开启活动 此时会把活动页面显示在屏幕上,进入了就绪状态。
onResume:恢复活动 此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
onPause:暂停活动 此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交互。
onStop:停止活动 此时活动页面将不在屏幕上显示。
onDestroy:销毁活动 此时回收活动占用的系统资源,把页面从内存中清除掉。
onRestart:重启活动 处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建过程,而是走onRestart的重启过程。
onNewIntent:重用 已有的活动实例
  • 图解
    在这里插入图片描述
  • 如果一个Activity已经启动过,并且存在当前应用的Activity任务栈中,启动模式为singleTask,singleInstance或singleTop(此时已在任务栈顶端),那么在此启动或回到这个Activity的时候,不会创建新的实例,也就是不会执行onCreate方法,而是执行onNewIntent方法。

在这里插入图片描述

三 Activity的创建、配置、开启和关闭

3.1 Activity的创建

  • 创建和配置非常简单,只需右键选择并填写相关内容即可
    在这里插入图片描述
  • 分别填写Activity名称、布局名称和报名即可
    在这里插入图片描述

3.2 Activity的配置

  • 新建的Activity需要在Androidmanifest.xml文件中配置组件<activity></activity>
  • 如果Activity所在的包名和Androidmanifest.xml文件中<manifest></manifest>标签中package属性指定的包名一致。android:name的属性可以直接设置为.Activity组件名
<activity
    android:name=".MainActivity2"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

3.3 Activity的开启和关闭

  • 创建Activity的方法:startActivity()Intent参数是Android应用中各个组件之间通信的桥梁。
public void startActivity(Intent intent)
new Intent(this, ActFinishActivity.class)
  • 关闭Activity的方法:无参方法finish()
public void finish()
  • 示例
public class MainActivity2 extends AppCompatActivity implements
        View.OnClickListener{
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        findViewById(R.id.button).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
    
        finish();
    }
}

四 活动之间传递消息(Intent&IntentFilter)

  • 如果用户需要从一个活动切换到另一个活动,则必须使用Intent来进行切换

4.1 Intent简介

  • Intent【意图】:程序中各组件间进行交互的一种重要方式。它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。
  • Intent分为两类:显式Intent和隐式Intent
  • Intent用于Android各组件之间的通信,它主要完成下列3部分工作:
    1. 标明本次通信请求从哪里来、到哪里去、要怎么走
    2. 发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据
    3. 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容
  • Intent的组成部分
元素名称 设置方法 说明与用途
Component setComponent 组件,它指定意图的来源与目标
Action setAction 动作,它指定意图的动作行为
Data setData 即Uri,它指定动作要操纵的数据路径
Category addCategory 类别,它指定意图的操作类别
Type setType 数据类型,它指定消息的数据类型
Extras putExtras 扩展信息,它指定装载的包裹信息
Flags setFlags 标志位,它指定活动的启动标志

4.2 显式Intent

  • 显式Intent:直接指定来源活动与目标活动,属于精确匹配
  • 在构建一个意图对象时,需要指定两个参数,第一个参数表示跳转的来源页面,即来源Activity.this;第二个参数表示待跳转的页面,即目标Activity.class
  • 具体的意图构建方式有如下3种:
  1. 在Intent的构造函数中指定
Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图
  1. 调用意图对象的setClass方法指定
Intent intent = new Intent(); // 创建一个新意图
intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动
  1. 调用意图对象的setComponent方法指定
Intent intent = new Intent(); // 创建一个新意图
// 创建包含目标活动在内的组件名称对象
ComponentName component = new ComponentName(this, ActNextActivity.class);
intent.setComponent(component); // 设置意图携带的组件信息

4.3 隐式Intent

  • 隐式Intent:没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。Android系统会使用IntentFilter匹配相应的组件,匹配的属性主要包括以下 3个:
    • action:Intent对象要完成的动作
    • data:Intent对象中传递的数据
    • category:action添加的额外信息
  • 举例:
    1. 在清单文件AndroidManifest中配置Action
    <activity
       android:name=".MainActivity2"
       android:exported="true"
       >
       <intent-filter>
           <action android:name="start_activity"></action>
           <category android:name="android.intent.category.DEFAULT"></category>
       </intent-filter>
    </activity>
    
    1. 在其他的MainActivity中开启MainActivity2
    Intent intent = new Intent();
    intent.setAction("start_activity");
    startActivity(intent);
    
  • AndroidManifest.xml文件的Activity标签下的<intent-filter>中,为被开启的Activity指定catrgory为"android.intent.category.DEFAULT"。必须在AndroidManifest.xml文件的Activity标签下的<intent-filter>中,为被开启的Activity指定catrgory为"android.intent.category.DEFAULT"。
  • 通常App不希望向外部暴露活动名称,只给出一个事先定义好的标记串,这样大家约定俗成、按图索骥就好,隐式Intent便起到了标记过滤作用。这个动作名称标记串,可以是自己定义的动作,也可以是已有的系统动作。
  • 常见系统动作的取值
Intent 类的系统动作常量名 系统动作的常量值 说明
ACTION_MAIN android.intent.action.MAIN App启动时的入口
ACTION_VIEW android.intent.action.VIEW 向用户显示数据
ACTION_SEND android.intent.action.SEND 分享内容
ACTION_CALL android.intent.action.CALL 直接拨号
ACITON_DIAL android.intent.action.DIAL 准备拨号
ACTION_SENDTO android.intent.action.SENDTO 发送短信
ACTION_ANSWER android.intent.action.ANSWER 接听电话
  • 隐式Intent还用到了过滤器的概念,把不符合匹配条件的过滤掉,剩下符合条件的按照优先顺序调用。譬如创建一个App模块,AndroidManifest.xml里的intent-filter就是配置文件中的过滤器。像最常见的首页活动MainAcitivity,它的activity节点下面便设置了action和category的过滤条件。其中android.intent.action.MAIN表示App的入口动作,而android.intent.category.LAUNCHER表示在桌面
    上显示App图标,配置样例如下:
<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

4.4 IntentFilter

  • 当发送一个隐式Intent后,Android系统会将它与程序中的每一个组件的过滤器进行匹配,匹配的属性有action、data、category,需要这三个属性都匹配成功才能唤起相应的组件。接下来,对三个属性的匹配规则进行介绍:

4.4.1 action属性匹配规则

  • action属性用来指定Intent对象的动作,在清单文件中设置action属性的示例代码如下:
<intent-filter>
	<action android:name="android.intent.action.EDIT"/>
	<action android:name="andrnid.intent.action. VIEW"/>
</intent-filter>
  • <intent-filter>标答中间可以罗列多个action属性,但是当使用隐式Intent激活组件时,只要Intent携带的action与其中一个<intent-filter>标签中action的声明相同,action属性就匹配成功。
  • 需要注意的是,在清单文件中为Activity添加<intent-filter>标签时,必须添加action属性,否则隐式Intent无法开启该Activity.

4.4.2 data属性匹配规则

  • data属性用来指定数据的URI或者数据MIME类型,它的值通常与Intent的action属性有关联。
<intent-filter>
    <data android:mimeType="video/mpeg" android:scheme="http..." />
    <data android:mimeType="audio/mpeg" android:scheme="http..." />
</intent-filter>
  • <intent-filter>标签中间可以罗列多个data属性,每个data属性可以指定数据的MIME类型和URI。其中,MIME类型可以表示image/ipegvideo/*等媒体类型。
  • 隐式Intent携带的data数据只要与IntentFilter中的任意一个data声明相同,data属性就匹配成功。

4.4.3 category属性匹配规则

  • category属性用于为action添加额外信息,一个IntentFilter可以不声明category属性,也可以声明多个category属性,在清单文件中设置category属性的示例代码如下:
<intent-filter>
	<category android:name="android.intent.category. DEFAULT"/>
	<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
  • 隐式Intent中声明的category必须全部能够与某一个IntentFilter中的category匹配才算匹配成功。需要注意的是,IntentFilter中罗列的category属性数量必须大于或者等于隐式Intent携带的category属性数量时,category属性才能匹配成功。如果一个隐式Intent没有设置category属性,那么他可以通过任何一个IntentFilter(过滤器)category匹配。

五 Activity的启动模式

  • app从第一个活动跳到第二个活动,接着结束第二个活动就能返回第一个活动,可是为什么不直接返回桌面呢?这要从Android的内核设计说起了,系统给每个正在运行的App都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息。鉴于栈是一种先进后出、后进先出的数据结构,故而后面入栈的活动总是先出栈,假设3个活动的入栈顺序为:活动A→活动B→活动C,则它们的出栈顺序将变为:活动C→活动B→活动A,可见活动C结束之后会返回活动B,而不是返回活动A或者别的地方。
  • 假定某个App分配到的活动栈大小为3,该App先后打开两个活动,此时活动栈的变动情况如图:
    在这里插入图片描述
  • 然后按下返回键,依次结束已打开的两个活动,此时活动栈的变动情况如图
    在这里插入图片描述
  • 前述的出入栈情况仅是默认的标准模式,实际上Android允许在创建活动时指定该活动的启动模式,通过启动模式控制活动的出入栈行为。
  • App提供了两种办法用于设置活动页面的启动模式:
    • 其一是修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行
    • 其二是在代码中调用Intent对象的setFlags方法,表明后续打开的活动页面采用该启动标志
<!--不添加属性的话默认就是标准模式-->
<activity android:name=".JumpFirstActivity" android:launchMode="standard" />

在这里插入图片描述

5.1 默认启动模式 standard

  • 该模式可以被设定,不在 manifest 设定时候,Activity 的默认模式就是 standard。在该模式下,启动的 Activity 会依照启动顺序被依次压入 Task 栈中:

在这里插入图片描述

5.2 栈顶复用模式 singleTop

  • 在该模式下,如果栈顶 Activity 为我们要新建的 Activity(目标Activity),那么就不会重复创建新的Activity
    在这里插入图片描述

  • 应用场景:适合开启渠道多、多应用开启调用的 Activity,通过这种设置可以避免已经创建过的 Activity 被重复创建,多数通过动态设置使用。

5.3 栈内复用模式 singleTask

  • singleTop 模式相似,只不过 singleTop 模式是只是针对栈顶的元素,而 singleTask 模式下,如果task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对应 Activity 置于栈顶,获得焦点。
    在这里插入图片描述
  • 应用场景:程序主界面
  • 对于那些及其耗费系统资源的Activity,我们可以考虑将其设为 singleTask模式,减少资源耗费

5.4 全局唯一模式 singleInstance

  • 在该模式下,我们会为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标Activity获得焦点。新的 Task 有且只有这一个 Activity 实例。 如果已经创建过目标 Activity 实例,则不会创建新的 Task,而是将以前创建过的 Activity 唤醒。
    在这里插入图片描述

5.5 综合示例

  • Activity3 设置为singleInstanceActivity1Activity2 默认(standard)。
  • 下图程序流程中,黄色的代表 Background的Task,蓝色的代表 Foreground 的Task。返回时会先把 Foreground 的Task 中的 Activity 弹出,直到 Task 销毁,然后才将 BackgroundTask 唤到前台,所以最后将Activity3 销毁之后,会直接退出应用
    在这里插入图片描述

5.6 动态设置启动模式

  • Manifest中通过launchMode属性设置的,称为静态设置,动态设置是通过 Java 代码设置的。
  • 通过 Intent 动态设置 Activity启动模式
intent.setFlags();
  • 如果同时有动态和静态设置,那么动态的优先级更高

5.6.1 FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_NEW_TASK
  • 此 Flag 跟 singleInstance 很相似,在给目标 Activity 设立此 Flag 后,会根据目标 Activity 的 affinity 进行匹配,如果已经存在与其affinity 相同的 task,则将目标 Activity 压入此 Task。反之没有的话,则新建一个 task,新建的 task 的 affinity 值与目标 Activity 相同,然后将目标 Activity 压入此栈。
  • 但它与 singleInstance 有不同的点,两点需要注意的地方:
    • 新的 Task 没有说只能存放一个目标 Activity,只是说决定是否新建一个 Task,而 singleInstance模式下新的 Task 只能放置一个目标 Activity。
    • 在同一应用下,如果 Activity 都是默认的 affinity,那么此 Flag 无效,而 singleInstance 默认情况,也会创建新的 Task。

5.6.2 FLAG_ACTIVITY_SINGLE_TOP

  • 此 Flag 与静态设置中的 singleTop 效果相同
  • 该模式比较简单,对应Flag如下:
Intent.FLAG_ACTIVITY_SINGLE_TOP

5.6.3 FLAG_ACTIVITY_CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP
  • 当设置此 Flag 时,目标 Activity 会检查 Task 中是否存在此实例,如果没有则添加压入栈。如果有,就将位于 Task 中的对应 Activity 其上的所有 Activity 弹出栈,此时有以下两种情况:
    • 如果同时设置 Flag_ACTIVITY_SINGLE_TOP ,则直接使用栈内的对应 Activity
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
    • 没有设置,则将栈内的对应 Activity 销毁重新创建。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yang2330648064/article/details/129493129

智能推荐

【SeedLab】BGP Exploration and Attack Lab_bgp seed-程序员宅基地

文章浏览阅读2.3k次。本实验需要使用SEED互联网仿真器(已集成到docker配置文件)。启动docker容器,配置文件在/Labsetup/outputs/目录下。由于要配置很多docker容器,所以构建+启动过程会比较漫长。.随着docker启动,仿真器也随之运行,仿真器所用到的设备均为docker容器。..._bgp seed

元素选择器之排除特定元素_input排他选择器-程序员宅基地

文章浏览阅读2.1k次。 需求如下:该搜索框是对整个页面的input检索 ,但与弹出层中的input冲突 博主几经辗转 简单处理 解决问题,思路如下:排除掉特定class的input。代码如下:$('input:not(.pop)', this.footer()).on('keyup change', function () { if (that.search() !== th..._input排他选择器

使用JAXB进行XML与JavaBean的转换(支持泛型)_jaxb 泛型-程序员宅基地

文章浏览阅读5.6k次,点赞6次,收藏20次。看到别人有个1024的勋章,特意留了一篇在今年的10.24日,看看会不会获得。在日常开发中可能涉及接口之间的相互调用,虽然在现在微服务的理念推广下,很多公司都采用轻量级的JSON格式做为序列化的格式,但是不乏有些公司还是有一些XML格式的报文,最近就在对接某个合作方的时候遇到了XML报文。在JSON报文爽快的转换下很难试用一个一个的拿报文参数,还是希望能直接将报文转换成Bean。接下来就了解到..._jaxb 泛型

python numpy学习笔记_ndarray的位置-程序员宅基地

文章浏览阅读1.2k次。numpy的主要数据对象是多维数组,其中包含相同类型的元素,通常是数字类型,每个元素都有一个索引。使用numpy前通常要导入包。import numpy as np目录类型维度创建运算索引和切片类型numpy的数组被称为ndarray。numpy.array只处理一维数组,而ndarray对象才提供更多功能。a = np.array([[1, 2, 3], [4, 5, 6]])type(a) # <class 'numpy.ndarray'>dtype属性可以获得元素的数_ndarray的位置

我的世界java版gamemode指令_《我的世界》Java版常用指令代码大全!你想要的都在这里了!...-程序员宅基地

文章浏览阅读1.6w次。还在苦于网上找到的一些指令已经不适用了吗?还在苦于有些地方的指令有误吗?还在苦于有些地方整理的指令不够全面吗?那么你来对地方了!小编为大家整理了《我的世界》原版游戏常用的指令,这些基本足以满足各位的基本需求了!大家来一起看看吧!注:表示的是必须输入的部分,[方括号]表示的是可选择性输入的部分基本命令列表命令描述/?/help的替代命令,提供命令使用帮助。/ban + 玩家名字将玩家加入封禁列表。/..._gamemode指令java

Spring Boot 结合shiro做第三方登录验证_shiro 第三方token登录-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏3次。Spring Boot 结合shiro做第三方登录验证1、首先,说一下我的具体实现思路。在做spring boot拦截器的过程中,开始我准备用spring security来实现,但是研究了一段时间之后发现spring security的集成度太高,需要修改的东西比较多,而且对它本身的使用方法不是很了解,后来转而使用Apache shiro。由于是第三方登录,是不需要我来验证密码的。最开始,我陷入了_shiro 第三方token登录

随便推点

代码报错原因和处理方法-程序员宅基地

文章浏览阅读8.7k次。代码错误的原因和调试方法_代码报错

深度解析Java游戏服务器开发-程序员宅基地

文章浏览阅读5.2k次,点赞9次,收藏40次。---恢复内容开始---1.认识游戏  1.1什么是游戏    1.1.1游戏的定义              任何人类正常生理需求之外的活动均可称为游戏    1.1.2游戏的分类      RPG角色扮演游戏、ACT动作游戏、AVG冒险游戏、FPS第一人称视角射击游戏、TPS第三人称视角射击游戏、FTG格斗游戏、SPT体育游戏、RAC竞速游戏、RTS即时战略游戏、STG..._深度解析java游戏服务器开发

【ThinkPHP5初体验(二)1】CSRF防范原理(thinkphp5 CSRF ajax令牌)_tp5 开启csrf令牌-程序员宅基地

文章浏览阅读4k次。CSRF是什么我就不解释了,百度一搜全是,比波姐的片源还要多,千篇一律都他么是复制粘贴。那为什么这个令牌(token)操作可以防范CSRF呢?下面我就随便说说说错了大家不要介意。首先我们要知道令牌是存储在session里面的,这个很重要 php代码如下&lt;?php namespace app\index\controller; //我直接允许跨域,因为伪装..._tp5 开启csrf令牌

市盈率、市净率、净资产收益率股息率介绍-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏6次。市盈率PE市盈率 = 市值/净利润概念解析:买入一家公司,几年回本,年化收益率:净利润/市值(市盈率的倒数)举例:砖头10万买个砖头,每年拍人带来1万利润,需要10年回本市盈率:10/1 = 10年化收益率:1/10 = 10%市净率PB市净率 = 市值/净资产净资产 = 总资产 - 负债举例:张三便利店,净资产:120万市值:1..._净资产收益率和股息率

墨器杯垫 文创商品设计特优_杯垫文创设计说明-程序员宅基地

文章浏览阅读737次。教育部昨举行「102年国立馆所文创商品设计比赛」颁奖典礼,台北科技大学创新设计研究所硕士生谢镇宇,为TW艺术教育馆设计「墨器」杯垫,取「默契」谐音,用5片压克力板,展现水墨画层层渲染效果,增加立体视觉感受,并在杯架后方加入LED光源,获评审肯定夺特优奖和奖金10万元。台南应用科技大学商品设计系学生高郁翔,为国立自然科学博物馆设计「恐龙化石钉书机」,他认为小朋友把钉书机钉下去的那一刻,会觉得像暴龙準_杯垫文创设计说明

C#中关于XML与对象,集合的相互转换-程序员宅基地

文章浏览阅读404次。XML与对象,集合的相互转化  今天小伙伴在群里问了一下关于XML与对象之间的相互转换,作为菜鸟的我正好趁着闲着的时间学习了一波,直接上代码了,有疑问或者有错误的地方还请大家指正,谢谢。。。。 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System...._c# xml转集合