想象我们正在开发一个新闻应用,其中一个界面使用RecyclerView展示了一组新闻的标题,当点击了其中一个标题时,就打开另一个界面显示新闻的详细内容。...如果是在手机中设计,我们可以将新闻标题列表放在一个活动中,将新闻的详细内容放在另一个活动中,如图4.1所示。 ?...,并放置了一个TextView用于显示一段文本。 ...right_fragment.xml中的代码基本相同,只是将背景色改成了黄色,并将显示的文字改了改。...暂停状态 当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。
在onCreate方法里,R.layout.activity_main指的就是activity_main.xml。 现在layout中有一个TextView,它可以用来显示文字。...的finish函数处于栈顶的活动就会出栈,前一个入栈的活动就会到栈顶,系统总是显示处于栈顶的活动。...onStart()方法:活动由不可见到可见的时候被调用,表示Activity正在启动,此时Activity可见但不在前台。 onResume()方法:活动准备好和用户进行交互时调用。...表示Acitivity获得焦点,此时Activity可见且在前台。 onPause()方法:系统准备去启动或恢复另一个活动时调用。表示Activity正在停止,此时可做存储数据,停止动画等操作。...模式:该模式下,任务栈中可能有多个相同 Activity 实例,因为它只是判断当前启动的 Activity 是否在栈顶。
AndroidManifest.xml 则是 Android 应用的配置文件,像活动,权限等都要在其中注册,但不需要手动注册,编译时 Xamarin 会自动完成。...代码说明 由于空项目自动创建了一个活动和一个布局,则使用默认的模板。...这里我们需要一个 Button 用来点击,和一个 TextView 用来显示 “Hello, Android”。...每创建一个控件,相应的 id 会自动添加到 Resource.Id 中(找不到 id 的话请重新生成一下项目)。效果示意图如下 ? 界面 xml 代码如下 () 来获取控件,需要传入一个 id 值。
Activity 确保无论系统从哪个任务启动活动,都只会创建一个活动实例并将其添加到新任务堆栈的顶部,也就是说,该实例启动的其他活动将自动在另一个任务中运行。...长按Home键显示最近执行的任务列表 单击启动器或主屏幕中的应用程序图标以打开新任务或将现有任务安排到前台 在单任务模式下启动活动时,系统将搜索是否已存在合适的任务。...如果任务中已存在要启动的活动的实例,请清除该实例上方的所有活动,并向用户显示该实例。如果现有任务中没有要启动的活动实例,请在任务顶部启动一个实例。...PhoneWindow是Window的子类。在这个PhoneWindow中,有一个DecorView的内部类,它是所有应用程序窗口的根视图,直接控制是否显示活动(参考旧驱动程序的原始单词…)。...每个ViewGroup都是用于组织子视图的不可见容器。其子视图可以是在UI上绘制区域的输入控件或小部件。
你可能会觉得既然活动已经不在栈顶了,还怎么会可见呢? 这是因为并不是每一个活动都会占满整个屏幕,比如对话框形式的活动只会占用屏幕中间的部分区域。...你应该在这个方法中完成活动的初始化操作,比如加载布局、绑定事件等。 onStart() 这个方法在活动由不可见变为可见的时候调用。 onResume() 这个方法在活动准备好和用户进行交互的时候调用。...此时的活动一定位于返回栈的栈顶,并且处于运行状态。 onPause() 这个方法在系统准备去启动或者恢复另一个活动的时候调用。...我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。 onStop() 这个方法在活动完全不可见的时候调用。...可见生存期():活动在 onStart() 方法和 onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。
APP连续性:展折开合,顺畅切换 可折叠设备展开时,当前应用页面必须无缝延续到另一个屏幕,并可自动调整大小匹配新的布局,反之亦然。...2.1 什么是Multi-resume 谷歌在Android 7.0 时代便支持了多窗口分屏功能,即多个应用可同时共享屏幕,但问题是多个应用无法同时使用,只有具有焦点的应用才能保持在活动(resume)...从 Android P (9.0) 开始,谷歌提供了名为Multi-resume的新功能,允许设备厂商在多窗口模式下保持所有可见应用处于活动状态,解决了分屏的多个应用仅有一个能保持活动状态的问题。...3.2 优化内外屏布局 可折叠移动设备中,应用程序可以运行在大小不同的显示屏幕中,我们首先建议添加一个单独的资源文件夹来展示更丰富更清晰的内容。...image 在多窗口模式下运行您的应用程序 通过点击其他应用将焦点从第一个应用移动到另一个应用 检查应用程序是否仍处于resumed状态 当您的应用意外丢失资源(例如相机)时,检查应用是否有任何意外行为
在Android Studio上创建官方默认的首屏标签页面很方便,首先右击需要添加标签栏的模块,在弹出的右键菜单中依次选择“New”——“Activity”——“Bottom Navigation Activity...在创建页面的“Activity Name”一栏填写新活动的名称,再单击页面右下角的Finish按钮,Android Studio就会自动创建该活动的Java代码及其布局文件。...然后编译运行App,进入刚创建的活动页面,其界面效果如下图所示。可见测试页面的底部默认提供了三个导航标签,分别是Home、Dashboard和Notifications。 ?...注意到初始页面的Home标签从文字到图片均为高亮显示,说明当前处于Home频道。接着点击Dashboard标签,此时界面如下图所示,可见切换到了Dashboard频道。 ?...BottomNavigationView(底部导航视图),另一个是位于其上占据剩余屏幕的碎片fragment。
在Android Studio上创建官方默认的首屏标签页面很方便,首先右击需要添加标签栏的模块,在弹出的右键菜单中依次选择“New”——“Activity”——“Bottom Navigation Activity...在创建页面的“Activity Name”一栏填写新活动的名称,再单击页面右下角的Finish按钮,Android Studio就会自动创建该活动的Java代码及其布局文件。...然后编译运行App,进入刚创建的活动页面,其界面效果如下图所示。可见测试页面的底部默认提供了三个导航标签,分别是Home、Dashboard和Notifications。...注意到初始页面的Home标签从文字到图片均为高亮显示,说明当前处于Home频道。接着点击Dashboard标签,此时界面如下图所示,可见切换到了Dashboard频道。...BottomNavigationView(底部导航视图),另一个是位于其上占据剩余屏幕的碎片fragment。
它主要用于在界面上显示一段文本信息,比如你在第1章看到的“Hello world!”。下面我们就来看一看关于TextView的更多用法。...它可配置的属性和TextView是差不多的,所以下标就给出一个不同的属性设置方式: 英文组合 中文含义 android:textAllCaps=“false” 取消字体默认大写的设置 我们可以在activity_main.xml...源路径是可以通过活动中的方法修改的,那么一来可能就会导致改变显示的图片 ImageView是用于在界面上展示图片的一个控件,它可以让我们的程序界面变得更加丰富多彩。...1.5 ProgressBar以及控件的可见性 英文组合 中文含义 android:visibility 控制文件的可见性,有不可见占大小、不可见不占大小、可见等分类 setVisibility() 活动中控制可见性的方法...,调用活动的方法时就能改变拖动条的当前值,达到最大值时,拖动条相当于就到了100% ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。
采用这种界面管理方式,确保了系统每次都只有一个界面在前台运行,减少了整个系统的内存开销。 在默认情况下,当一个活动启动另一个活动时,两个活动都放置在同一个任务中,即压入同一个返回栈。...(2) 暂停状态 活动处于暂停状态时,活动界面部分可见,用户不能够对它进行操作,比如点击删除图片按钮,在图片显示界面(活动)上会弹出一个对话框,对话框让用户确认是否删除图片,对话框没有占据整个屏幕,因此显示图片的界面...通常活动在onCreate()函数中完成各种初始化操作,对应的在onDestroy()函数中释放内存和资源。onStart()函数和onStop()函数对应,它们分别使得活动可见和不可见。...碎片在运行状态是可见的,并且它所归属的活动也正在运行。当活动进入暂停状态(由于另一个未占满屏幕的活动被添加到了栈顶),它上面的碎片也会进入暂停状态。当活动停止,它上面的碎片就进入停止状态。...首先,创建一个底部导航栏的布局文件:tab_custom.xml;在这个布局文件中,要显示每个标签的图标和文字说明,因此,在线性布局中加入ImageView和TextView两个控件。
将您的应用程序命名为“MyFirstProject”,然后单击下一步。 将活动添加到 Android 应用程序 在这一步中,我们将向我们的应用程序添加一个空活动。...更新 Android 应用 XML 文件 现在在 res 文件夹中,转到 layout 文件夹中的 activity_main.xml 文件并编写以下代码。...请记住,这里我们正在创建我们的第一个项目,因此我们将创建一个显示消息“Hello World”和“单击我”按钮的屏幕。 在正文中,tab复制以下代码。...以下 .xml 文件是 MainActivity 的布局文件。您可以在此处创建交互式 UI。 该文件有一个 TextView 和一个按钮,可以通过从左侧面板拖放方法将其带到设计屏幕。...这里给出了按钮的“id”,然后设置了 Click Listener。单击此“单击我”按钮后,我们会看到一个祝酒词(一条显示“按钮已单击!”的短消息)。
onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期 可见生存期:活动在onStart()方法和onStop()之间所经历的,在可见生命期内,活动对于用户总是可见的,即便有可能无法和用户进行交互...当一个 singleTop 模式的 activity 已经位于栈顶位置时,再去启动它时,不会再创建实例,即每次只是激活但并不会创建新的 Activity 对象,如果不在栈顶,就会创建实例。...Stopped // Stopped 当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见,但是跟Paused状态一样保持着其所有状态信息及其成员变量...我们在安装这个应用的时候,系统也会启动一个PackManagerService的管理服务,这个管理服务会对AndroidManifest.xml文件进行解析,从而得到应用程序中的相关信息,比如service...(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸 Activity构造的时候会初始化一个Window,准确的说是PhoneWindow
要想把一个UI分配给一个Activity,需要在onCreate()方法中调用setContentView()方法。可以通过在java代码中创建布局,也可以通过调用xml布局资源文件来创建。...2、Activity状态 随着Activity的创建和销毁,从栈中移进移出的过程中他们经历了如下4种可能的状态: · 活动状态:当一个Activity处于栈顶是,它是可见的、具有焦点的前台Activity...· 暂停状态:Activity可见,但没有焦点,不能接受用户输入事件。(例如:当一个透明的或者非全屏的Activity位于该Activity之前时) · 停止状态:Activity不可见。... 在一个Activity从创建到销毁的完整的生存期内,它会经历活动生存期和可见生存期的一次或者多次重复。...如果Activity是有规律的创建相同的对象集,可以考虑在onCreate创建,因为onCreate只在Activity生存期调用一次。 · 可见生存期:onStart和onStop之见的时间。
OK,现在已经迫不及待想把程序跑起来了,但是这里我们还要先装一个模拟器。...了解安卓程序 还记得之前我们在AndroidManifest.xml中注册的主Activity吗?...这里Log.d表示打印的log是debug级别的,两个参数,第一个表示tag,主要用于定位打印信息,另一个就是具体的打印内容。...总结 Android程序不推荐在程序中对字符串进行硬编码,而是把字符串定义在一个XML文件中。 在XML中可以通过@string/hello_world获得这个字符串的引用。...在代码中可以通过R.string.hello_world获得这个字符串的应用。 了解了Android中打log的方式
TextView控件,并且显示Hello World这段字符 该空项目假设为攻击者欲攻击的合法App 接下来新建一个利用此漏洞的恶意软件项目,命名为Attack 布局代码 activity_main.xml...Innocent这段字符 新建一个布局,并且假设这个新建的布局为恶意活动显示的布局 attack.xml <LinearLayout xmlns:android="http://schemas.android.com..._2,并且这个任务栈<em>中</em><em>的</em>两个<em>活动</em>均在后台运行,用户不<em>可见</em> 假设Activity_1<em>的</em>allowTaskReparenting属性为true Activity_2<em>的</em>allowTaskReparenting...需要注意<em>的</em>是任务栈可以放置使用<em>相同</em><em>的</em>taskAffinity<em>的</em>Activity,即使是跨程序也可以共享同<em>一个</em>任务栈 这就可以解释为什么需要恶意<em>活动</em><em>的</em>taskAffinity属性为欲攻击应用<em>的</em>包名,这样就能让恶意<em>活动</em>与合法<em>活动</em>存在于同一任务栈中了...接着使恶意<em>活动</em><em>的</em>allowTaskReparenting属性为true,这样就能在合法应用<em>中</em><em>的</em><em>活动</em>转至前台时,使得恶意<em>活动</em>同样转至前台 至此,整个攻击流程结束 0x03 漏洞利用及其危害 <em>在</em>0x01<em>中</em>
碎片的创建 要使用碎片先要创建一个碎片,创建一个碎片很简单。 新建一个碎片布局,fragment.xml <?xml version="1.0" encoding="utf-8"?...新建一个类Fragment1.java,继承自Fragment,注意Fragment有两个不同的包,推荐使用support-v4中的,兼容性更好,另一个安卓4.2以下就会崩溃。...虽然碎片都是嵌入在活动中显示的,但他们之间的关系并不明显。 1.在活动中调用碎片的方法。...2.在碎片中调用活动的方法。可以通过getActivity()方法得到和当前碎片绑定的活动实例。 碎片的绑定 静态绑定 在活动布局中加一个碎片标签,比较简单不细说。...有三个碎片,通过点击事件在一个活动中动态切换显示的碎片。
在模拟器上运行 无论是使用 Android Studio 还是命令行,在模拟器中运行程序首先要创建一个 Android Virtual Device(AVD)。...点击这个面板中的标签,可利用 WYSIWYG(所见即所得)工具在 Design 面板看到对应的图形化效果。但在本节中,我们将学习如何直接修改 XML 文件。 删除 [] 标签。...LinearLayout 里的子布局按照 XML 里定义的顺序显示在屏幕上。...类型,代表被点击的视图) 接下来,你可以在这个方法中编写读取文本内容,并将该内容传到另一个Activity的代码。...如果使用 Android Studio开发,现在已经可以点击Send按钮启动这个activity了,但显示的仍然是模板提供的默认内容"Hello world",稍后修改显示自定义的文本内容。
对这个问题的一个较为简单解决方案是在真机上测试,那时你有这些数据,但是这样Preview的意义就失去了。 ? 在这种情况下的问题是TextView和ImageView没有任何内容可供显示。...请记住,预览不会在应用程序中运行,而是在IDE中的JVM上运行。 这将模拟在Android设备上的工作原理,你应该假设你不能访问任何数量的不在View框架内的依赖。...然而,merge的问题是,它内部的所有组件将被折叠在一起,同时显示在预览里,造成视觉混乱。如下图所示,TextView覆盖在ImageView的上面: ?...下图是使用后的效果,不再有重叠: ? 问题5:在预览时显示隐藏的视图 你的活动可能包含一些在onCreat时需要隐藏的View,但在一些事件后显示它们。...通过设置这些视图在布局中的visibility:”GONE”,可以确保它们永远不会在预览时可见。 问题是,这些视图将从预览中消失,如果一些其他开发人员打开布局,并在预览中查找它们,他们将无法找到它。
在海外应用中,由于需要适配各种语言,有些小语种的文案较长,因此当倒计时和其他文案处于同一行展示时,需要充分考虑多语言的适配,如何优雅地完成倒计时自适应显示是一个值得深思的问题。...因此,本文采用了在布局的时候同时预置两个倒计时对象的方法,一个对象位于行尾,另一个位于第二行的行首。...在measure过程中,如果测量得到控件的宽度大于某一个宽度阈值,则初始化次行行首的view,并将行尾的view可见状态置为Gone,若小于某一个宽度阈值,则初始化行尾的view,并将次行行首的view...可见状态置为Gone 首先来看一看xml布局文件,以下是标题加倒计时位于行尾的一个整体布局文件main_view_header_new_arrival <?...为了减少功耗,需要在倒计时控件不在可见范围内时,暂停倒计时;当倒计时控件重新出现在可见范围内时,重新开始倒计时。下图是倒计时暂停与开始的场景。
Fragment概述 1.1 介绍 Fragment是一种可以嵌入在活动中的UI片段,能够让程序更加合理和充分地利用大屏幕的空间,出现的初衷是为了适应大屏幕的平板电脑,可以将其看成一个小型Activity...运行状态:碎片可见时,关联活动处于运行状态,其也为运行状态 暂停状态:活动进入暂停状态,相关联可见碎片就会进入暂停状态 停止状态:活动进入停止状态,相关联碎片就会进入停止状态,或者通过FragmentTransaction...的remove()、replace()方法将碎片从从活动中移除,但如果在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。...():使用另一个Fragment替换当前的,实际上是remove()然后add()的合体 transaction.hide():隐藏当前Fragment,仅不可见,不会销毁 transaction.show...(getActivity()); textView.setText("上上下下的享受");//是电梯,别误会 4.2 传递数据给Activity 步骤流程: 在Fragment中定义一个内部回调接口
领取专属 10元无门槛券
手把手带您无忧上云