Android学习(一)——四大组件之Activity

04、Android四大组件之:Activity 原本创建不能用startActivity了,先换成startActivityFormResult(虽然提示它被弃用了,后边再说这个),重写onActivityResult来处理数据回来的时候。Activity 可以由APP自己启动,也可以别的 APP启动,当然启动非本APP的Activity会有一些限制,比如权限等)。A启动B,B将被推送到栈顶部并获得焦点,A则保留在堆栈中,但它会停止,系统会保留其界面的当前状态。当从B返回到A的时候,B会从栈顶部退出,A会恢复。像之前一样,先创建个空项目,方便测试。 阅读详情

Activity基础使用

Activity 是一个Android项目页面的基础

我们自行创建的Activity本身是继承自Activity类,然而后期Android更新了AppCompatActivity,FragmentActivity等Activity的子类,这些我们有机会再说,Activity有一些方法是用来标记生命周期的

Activity的生命周期

生命周期图

之前看见过很多生命周期图,但是我还是觉得看这张更舒服,更直白一点。

其中这里面包括几个回调方法,分别代表Activity的生命周期:

  • onCreate():在这个Activity首次被创建时会调用这个方法,里面一般用来初始化一些UI元素,数据或者某些需要在页面渲染之前就初始化的东西。onCreacte方法里面有个Bundle对象的参数savedInstanceState,我们可以使用它进行Activity的状态恢复。
  • onStart():在Activity创建之后会首先执行这个方法,在执行完onStop之后重新唤起这个页面也会调用这个方法,通常在执行完onStart之后,下一步是使页面进入到运行状态,所以一般后面会紧跟着执行OnResume()方法使页面进入到Resumed状态,然而若是有什么异常状况也会导致页面失效,继而执行了onStop();你可以在这个方法里开始某些启动页面就要做的事情,比如启动某个动画,启动播放器,启动某个前台服务等需要在屏幕出现一些内容的操作。
  • onResume():在将一个 activity 移到前台之前调用。你可以在这个方法中重新播放动画、更新 UI 元素、重启相机预览、恢复音频/视频播放或者初始化你在 onPause() 中释放的组件。
  • onPause(): 在将一个 activity 移到后台之前调用。在这个方法中,应该停止和 activity 有关的展示类动作,比如动画,页面背景音效等。
  • onStop(): 在onPause()调用过后,activity 进入后台之前调用。这个方法是保存数据到磁盘的好地方。如果 activity 回到前台,它后面是 onRestart() 方法,如果它即将从内存移除,则它后面是 onDestroy() 方法。
  • onRestart(): 在关闭一个 activity且并未销毁,又重新打开它之前调用。它后面总是 onStart() 方法。
  • onDestroy(): 这是 activity 被销毁之前你能从系统接收到的最后一个回调。在这个方法中如果你在这个页面还有资源未被释放,需要在这里释放,否则会发生内存泄漏问题。

一个Activity的生命周期大致就分这几个节点,当你写一个页面的时候你首先要考虑好在每个生命周期节点应该做那些事情,这样就不会导致你的Activity看起来很乱,也要知道一些资源的生成释放的时机,防止内存泄露或者还未生成资源就调用等问题

创建一个Activity

这个很简单,AndroidStudio已经给我做好了一键生成的功能

生成一个Activity

这个不仅仅能生成一个空的Activity,还能生成很多不同功能的Activity,比如登录模块的模板LoginActivity等

但是如果你一定要手动生成一个Activity,那就要有以下操作:
1. 新建一个类继承Activity(或者其他Activity的子类)
2. 在res/layout中新建一个layout.xml文件
3. 在Activity的onCreate方法里 setContentView(R.layout.layout);
4. 在AndroidManifest.xml中的application节点下面注册。

这样你的Activity就创建好了,然而如果你创建一个新的Activity是没有地方调用的,那就没什么意义了,通常你新建一个新的项目的时候IDE会默认给你新建一个MainActivity,这个Activity是整个程序的入口你在AndroidManifest.xml文件中会看见这个Activity的节点下面有下面这样的标签

MainTag

当一个Activity带有这组标签的时候,他就被标记为APP的入口Activity,也就是APP启动的第一个Activity。

启动一个Activity

启动一个Activity方式通常有两种startActivity和startActivityForResult

这两中方式一个是单纯的启动这个Activity,一个是启动这个Activity并期待它有返回一些东西

startActivity(Intent intent)

  • 这是一个简单的启动方式,这个方法是Context类的,由于我们的所有Activity都继承自Activity类,Activity又是继承自Context类的,所以我们可以直接调用这个方法,他们之间的传值用Intent
    Intent intent = new Intent();
    intent.setClass(当前Activity.this,目标Activity.class);
    startActivity(intent);

Activity之间的通信只能使用Intent进行

startActivityForResult()

  • 这是一种期待下个Activity返回动作的启动方式,这个方法是Activity类的,所以如果你只是拿到Activity的Context,是不能使用这个方法的,除非你把Context实例化成Activity。
    Intent intent = new Intent();
    intent.setClass(当前Activity.this,目标Activity.class);
    startActivityForResult(intent,REQUEST_CODE);

这个时候你下一个页面如果结束有动作或者数据要传回到这个页面的时候你需要在目标Activity中使用setResult方法

    Intent data= new Intent();
    data.putExtra("tag","target")
    setResult((RESULT_CODE,data));

这样你的目标activity中的“target”字符串就通过data这个Intent传回到了你之前的Activity,如果你想要获取到这个data,你需要重写Activity里的一个方法onActivityResult:

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode = REQUEST_CODE && resultCode == RESULT_CODE){
             String tag = data.getStringExtra("tag")
         }
    }

这样就拿到了目标Activity回传回来的tag,这里面requestCode就是在startActivityForResult时传过去的自己定义的一个int值,而resultCode是你setResult时传的值,这样当你匹配到这两个值就是你之前定义的那两个值时,就说明是目标返回的了。

Created with Raphaël 2.1.0 当前Activity 当前Activity 目标Activity 目标Activity 我给你个Intent啊,还带着REQUEST_CODE(并记下了REQUEST_CODE); 我还你个data啊,这是我的RESULT_CODE; 两个都对上了,嗯,这个就是它给我返的data

大概的流程就是这样,启动方式一般就这两种

Activity的四大启动模式

Activity还有四大启动模式,分别是standard、singleTop、singleTask、singleInstance

启动一个应用,系统就会为之创建一个栈,来放置根Activity。默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个栈中的,后者被压入前者所在的栈,当用户按下后退键,或者finish()掉的时候后者就会从栈里弹出,这样一来就可以描述成Activity是像纸张一样一张一张的摞起来的你启动一个Activity,就是把他放到这个栈的栈顶,每退出一个Activity,就把他从栈里拿出来,而你拿出来的时候必须按照顺序拿,这个时候我们四大启动模式就有了用武之地。

配置Activity的启动模式是在AndroidManifest中的activity标签内添加android:launchMode属性

standard-默认模式

<activity 
    android:name=".SecondActivity" 
    android:launchMode="standard">

这个就是最标准的启动方式,系统默认也是这种,一般我们可以不写。这种方式就是正常的方式,最新的最先结束掉,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。

singleTop-栈顶复用模式

<activity 
    android:name=".SecondActivity" 
    android:launchMode="singleTop">

这种方式如果栈顶不是目标Activity的话,与standard方式一样,但是如果目标Activity在栈顶的话,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,而且它本身的onCreate()与onStart()方法不会呗调用

singleTask-栈内复用模式

<activity 
    android:name=".SecondActivity" 
    android:launchMode="singleTask">

这个模式下,如果目标Activity在栈顶,则处理方式与SingleTop相同,如果目标Activity不在栈内,则处理方式与standard相同;但是如果这个Activity在栈内却不在栈顶,那么则会把它上面的Activity全部出栈并把目标Activity置顶,同时它的onNewIntent方法会被调用。

singleInstance-全局唯一模式

<activity 
    android:name=".SecondActivity" 
    android:launchMode="singleInstance">

该模式具备singleTask模式的所有特性,然而更牛逼的是,整个系统中就会只剩这一个实例,以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

关闭Activity

通常我们关闭一个Activity的方法就是调用Activity的finish()方法

当我们调用finish()方法以后,后面的代码将不会执行,所以如果你是用startActivityForResult方式启动的Activity,那么你的setResult方法一定要放在finish()之前,否则无效。

配置变化

当发生屏幕旋转,键盘显示等操作时,会导致Activity重启,这样有些操作就会被中断

处理方式推荐两种:

1.重写onConfigurationChanged() 方法
2.重写onSaveInstanceState()方法

重写onConfigurationChanged() 方法

首先在AndroidManifest的activity节点内添加android:configChanges属性

<activity 
    android:name=".newprogressplayer.MusicPlayerActivity"
    android:configChanges="orientation|screenSize"
    />

然后在该Activity类内部重写onConfigurationChanged方法

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

你可以对 newConfig对象进行检查,读取 configuration 的字段,进行适当的修改界面上所用的资源。

重写onSaveInstanceState()方法

持有一个状态对象,将它传递给 activity 的重建的实例。你可以实现 onSaveInstanceState() 回调来达到这个目的

 @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

在这种方式下,Bundle只能储存序列化的对象,而在配置变化发生时进行序列化和反序列化数据会导致较大的性能开销。它会消耗大量内存,并降低 activity 的重启速度。

总结

这里只是简单介绍了一下Activity的基础知识,编程里面水深了去了,总有一些神奇的操作能让你重新认识这个你本来认为你已经会的东西,所以,活到老学到老,我先记一笔,回头忘了或者不清晰的时候再看看。

Robocup3d 一、 比赛介绍 RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑, 阅读详情

相关推荐

Netron显示自定义属性,按属性设置不同节点的颜色

本文介绍了一种让Netron显示自定义颜色的方法,可根据某些属性,调整节点的颜色 需求背景: 在分析AI模型精度误差时,用不同等级的红色,表示误差的大小.可以直观地看到误差的传递关系

Hi20240217的博客 1514

第一行代码 开始创建一个activity

创建activity

程序员养成中~ 477

嵌入式GUI显示驱动配置实战:从emWin硬件接口到SPI屏驱动优化

在嵌入式系统开发中,显示驱动是连接GUI库与物理屏幕的核心底层模块,其本质是CPU与显示控制器之间的数据“翻译”与“传输”系统。其工作原理是通过实现特定的硬件抽象层接口,将GUI生成的图形数据转换为屏幕能识别的时序和协议。这项技术的核心价值在于,它允许开发者在资源受限的MCU上,通过适配不同的硬件接口,以最小的硬件开销实现稳定的图形输出。其典型应用场景包括智能家居面板、工业HMI、可穿戴设备等嵌入式图形界面开发。本文将深入解析emWin GUI库的驱动框架,重点探讨如何针对SPI、I2C等串行接口进行高效的

weixin_29159711的博客 343

Android Studio 小提示,新建Activity

Android Studio是在google I/O大会上新发布的一个IDE,基于IntelliJ,Android开发除了Eclipse之外又多了一种选择。 在Android Studio中如何在当前项目中添加一个Activity? 右键点Java或者包名, new -- Android Component 在Kind默认是Activity 不过这只是创建了java代码,还没有给这个act...

weixin_34414650的博客 137

腾讯文档API逆向分析:不用Selenium也能批量导出的黑科技

本文揭秘了如何通过Python逆向分析腾讯文档的隐藏API,实现无需Selenium即可批量导出在线表格的高效方法。详细解析了API调用流程、Cookie维护及异常处理技巧,相比传统方案性能提升显著,适用于大量文档导出的自动化场景。

h9j8k7l6m5n的博客 1202

ESP32系列之LVGL(四):输入设备(外部按键)对接

本文详细介绍了如何在ESP32上使用LVGL库对接外部按键作为输入设备,包括硬件连接、驱动层实现和LVGL输入设备移植。通过具体代码示例和实战案例,帮助开发者快速实现按键控制UI界面,解决常见问题如按键无反应和控件跳转不正常。

weixin_30907935的博客 242

android创建工程界面,Android简单创建一个Activity的方法

本文实例讲述了Android简单创建一个Activity的方法。分享给大家供大家参考,具体如下:1) 创建一个android项目填写项目信息2) 创建一个新Activity右键点击Eclipse左边(默认)你要加入Activity的包,比如,我的包是com.INdroid.layout。然后选New->Class,输入类名后(注意首字母大写),在Superclass的Browse那里点击。最...

weixin_34722747的博客 1412

【微服务】Spring Aop原理深入解析

spring原理深度解析

congge 1万+

在Android项目中新建一个Activity

Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是 Android 应用程序的基本功能单元。Activity 本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloat

baidu_37684155的博客 2748

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 260

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

Android Studio中创建项目时,activity_main.xml不显示的解决方法

解决方法如下:

qq_34330187的博客 2万+

YOLO26改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 359

Android 四大组件学习之Activity一

Activity是Android四大组件中最基础也是最常用的组件之一。Activity作为一个应用程序组件,提供了一个与用户交互的界面。可以这么说Activity是和用户操作有密切相关的的,常用来负责与用户交互,可以通过setContentView来显示组件。 今天我们学习如何去创建一个Activity 第一步: 创建一个Android Application Project, 填入应

半月旋空 1642

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android四大组件之Activity的学习(四大组件之路:一)

以下是自己在学习中对于Activity理解Activity的生命周期一:正常情况下的activity生命周期Android里所有程序的流程都运行在Activity之中,Activity有自己的生命周期。程序无法改变Activity的生命周期,Activity的生命周期由系统控制。下图基本说明了Activity在正常和异常情况下的生命周期Activity中常用的函数有SetContentView()...

kkabout的博客 1107

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android四大组件学习笔记(一)_Activity

文章目录Android四大组件1.1 活动——Activity Android四大组件 活动:Activity,用于表现功能 服务:Service,后台运行服务,不提供界面呈现 广播接收器:BroadcastReceiver,用于接收广播 内容提供商:ContentProvider,支持在多个应用中存储和读取数据,相当于数据库 1.1 活动——Activity 通俗理解: 一个界面对应一个Activity Activity(界面)中可以使用安卓官方提供的丰富控件来美化(Button等控件) 总结

秀才恶霸的博客 309

2024年Android最全Android四大组件(一) Activity,2024年最新Android开发学习视频

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

2301_82243733的博客 1073

Android 学习之Android四大组件(一)——Activity

Android 学习之Android四大组件  (一) Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。1.Activity详解1.1什么是Activity 在应用程序中,一个Activity通常就是一个单独的屏幕(窗口),它上面可以显示一些控件也可以监听并处理用户的事件做出响...

紫雾凌寒 1041

安卓学习日记(二)四大组件(一)活动——Activity详解

Android系统四大组件分别是活动、服务、广播接受器、内容提供器。其中活动是所有Abdroid应用程序的门面凡是在应用中你看得到的都是放在活动中的,服务是无法看到的但是它会一直在后台默默的运行即使用户退出了应用服务仍然可以继续运行,广播接受器允许你的应用接受来自各处的广播消息,当然你的应用同样也可以向外发出广播消息,内容提供器则为应用程序之间共享数据提供了可能。 经过了上面的简单了解,现在

ZytheMoon的博客 1507

Android学习之路——Android四大组件之activity(一)

一、什么是Activity? Activity简单的说就是一个界面,我们在Android手机上看到的每一个界面就是一个activity。

Micheal_Yang's Blog 1440

Android初级学习路线一 四大组件 之Activity

知识点:Activity生命周期、Activity启动模式  Activity的onSaveInstanceState和onRestoreInstanceState()调用   一 Activity生命周期 onCreate() &gt;onStart()&gt; onResume()&gt; onPause()&gt;onStop()&gt;onDestory(). 启动Activit...

qq_16176969的博客 194

Android四大组件学习(一)---Activity

本文并不是要详细复述activity的知识,目的在于总结一些编程是需要注意和理解的知识点: (1)一般情况下我们并不需要显式地调用finish()或finishActivity()结束一个失去焦点的activity,当系统因为设备资源不够用时会自动结束它。主动的调用finish()或finishActivity()很多时候会降低用户体验。

tyhj_sf的博客空间 675

android学习笔记(一)四大组件activity详解

一、Activity详解二、Service详解三、Broadcast Receiver详解四、Content Provider详解外加一个重要组件 intent的详解。   一、Activity详解Activty的生命周期的也就是它所在进程的生命周期。    一个Activity的启动顺序:onCreate()——>onStart()——>onResume()当另一个Activity启动时

eric_hwp的专栏 522

Android四大组件基础学习之Activity

Android四大组件基础学习之Activity

Y3036359510的博客 1700
上一篇: Android数据库基础用法
下一篇: Android学习(二)——四大组件之Service
豪利丶王
博客等级 码龄11年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值