首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列。 分布式架构 我将上图进行再次更改 这里重要的就是我的队列通过什么维护?这里一般我们通过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活。并且redis是内存中的数据结构存储系统,处理速度快,提供队列集合等多种存储结构,方便队列维护 如何去重?这里借助redis的集合,redis提供集合数据结构,在redis集合中存储每个request的指纹在向request队列中加入Request前先验证这个Request的指纹是否已经加入集合中。如果已经存在则不添加到request队列中,如果不存在,则将request加入到队列并将指纹加入集合 如何防止中断?如果某个slave因为特殊原因宕机,如何解决?这里是做了启动判断,在每台slave的Scrapy启动的时候都会判断当前redis request队列是否为空如果不为空,则从队列中获取下一个request执行爬取。如果为空则重新开始爬取,第一台丛集执行爬取向队列中添加request 如何实现上述这种架构?这里有一个scrapy-redis的库,为我们提供了上述的这些功能scrapy-redis改写了Scrapy的调度器,队列等组件,利用他可以方便的实现Scrapy分布式架构关于scrapy-redis的地址:https://github.com/rmax/scrapy-redis 搭建分布式爬虫 参考官网地址:https://scrapy-redis.readthedocs.io/en/stable/ 前提是要安装scrapy_redis模块:pip install scrapy_redis这里的爬虫代码是用的之前写过的爬取知乎用户信息的爬虫 修改该settings中的配置信息: 替换scrapy调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler" 添加去重的classDUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" 添加pipeline如果添加这行配置,每次爬取的数据也都会入到redis数据库中,所以一般这里不做这个配置ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300} 共享的爬取队列,这里用需要redis的连接信息这里的user:pass表示用户名和密码,如果没有则为空就可以REDIS_URL = 'redis://user:pass@hostname:9001' 设置为为True则不会清空redis里的dupefilter和requests队列这样设置后指纹和请求队列则会一直保存在redis数据库中,默认为False,一般不进行设置 SCHEDULER_PERSIST = True 设置重启爬虫时是否清空爬取队列这样每次重启爬虫都会清空指纹和请求队列,一般设置为FalseSCHEDULER_FLUSH_ON_START=True 分布式 将上述更改后的代码拷贝的各个服务器,当然关于数据库这里可以在每个服务器上都安装数据,也可以共用一个数据,我这里方面是连接的同一个mongodb数据库,当然各个服务器上也不能忘记:所有的服务器都要安装scrapy,scrapy_redis,pymongo 这样运行各个爬虫程序启动后,在redis数据库就可以看到如下内容,dupefilter是指纹队列,requests是请求队列 所有的努力都值得期许,每一份梦想都应该灌溉!

优秀的个人博客,低调大师

深度学习入门,以及它在物联网和智慧城市中的角色

本文作者Ajit Jaokar是futuretext的创始人。 这篇文章主要讲述一个正在演化的论题。现在,我将主要解释深度学习的基础,以及深度学习算法如何应用于物联网及智慧城市等。尤其是,像我接下来论述的一样,我对于使用物联网数据来完善深度学习算法很感兴趣。我在物联网数据科学课程项目中阐述过这些想法,这个课程的目的是培养物联网数据科学家(与我在牛津大学和马德里理工大学的课程类似)。我还会在上海同济大学城市科学国际会议、旧金山物联网大会(IoTworld event)上针对这些理论进行论述。如果你希望获得最新信息,请在我的 linkedin上联系我。 深度学习 深度学习经常会被认为是模仿大脑的一系列算法。但更加精确的定义应该是「利用神经层进行学习」的算法。深度学习涉及通过让计算机从简单概念之上建立起复杂概念的神经层进行学习。 深度学习逐渐从黑暗中摸索出了光明的道路,谷歌的研究员为他们的试验性深度学习系统输入了数千万张来自于YouTube的随机图像,继而指导系统去识别图像的基本元素,以及如何将这些元素相互整合。这个有着16000个CPU的系统能够识别出有着共同特点的图像(例如猫咪的图像)。谷歌权威性的实验展示了深度学习的无限潜力。深度学习算法可以应用在多种领域,包括计算机视觉、图像识别、模式识别、语音识别以及行为识别等。 计算机如何学习? 为了理解深度学习算法的惊人之处,首先必须了解计算机如何思考和学习。从很早以来,研究员就尝试过创造可以思考的计算机。直至最近,这种努力最近已经成为了「自上而下」方法的规则。这种方法包括了为所有可能的情况写出足够的规则。但是此方法很明显受限于规则的数量,以及其有限的规则依据。 为了克服这些限制,一个由下至上的方法被提出来。这种想法是从经验中学习。「标识数据」提供这些经验。标识数据输入到系统中,系统基于回应进行训练。这种方法对过滤垃圾邮件这样的应用十分有效。然而,大部分数据(图像、视频、语言等)并没有标识,即使有,也并不完善。 另一个问题是解决无限的问题域。例如,国际象棋的问题域非常复杂,但是有限,因为它有着有限的基元(32个棋子)以及有限的可采取步骤(在64个格子上)。但是在真实生活中,无论何时,我们都有着无限多的变量。问题域因此而变得非常大。 像国际象棋这样的问题可以根据一系列形式化规则向电脑进行描述。而反过来,许多真实世界的问题能够被人们容易地理解(直觉)但是却不是那么容易地向计算机表达。像这样需要直觉的例子包括了在图片上识别文字与脸。这样的问题很难向计算机表达,因为问题域是无限的。因此,问题描述承受着维度的诅咒——当维度增加,空间的体积会增加得非常迅速,使可用的数据变得稀疏。计算机无法在稀疏数据中训练。这样的情景很难描述,因为没有足够的数据去合适地表达由维度代表的组合。即使如此,这样「无限的选择」问题在日常生活中也很常见。 深度学习算法如何学习? 深度学习涉及「困难/直觉性」的高维度无规则问题。在此,系统必须在不知道规则的前提下学习去处理未预料的情况。许多现存的系统例如Siri的语音识别与Facebook的脸部识别就在这些宗旨下运作。深度学习系统现在有着完善的可能,因为三个原因:高CPU配置,更好的算法,以及更多的数据。在接下去的许多年,这些因素会带来深度学习算法更多的应用。 深度学习算法基于大脑的运作进行模拟。大脑可能会被视为一种大规模并行模拟计算机,有着 10^10个简单处理器(神经元)——每一个都只需要几毫秒去对输入进行回应。为了从理论上模拟大脑的运行,每个神经元都被设计为一个小型电子设备,有着与生物神经元相似的传输功能。我们继而可以连接这些神经元,模拟大脑的运作方式。从实践上来说,这证明了这个模型并不是那么容易去完善,并且很难训练。 因此我们制作了一些模型的简化版本。这类神经网络叫做「前馈反向传播网络」。简化和限制在于:我们改变了神经元之间的相连方式,这样它们可以位于不同层。每层中的每个神经元都与下一层的每个神经元相连。信号只能在一个方向上传播。最终,我们简化了神经元的设计,使其基于其他神经元传来的简单、权重驱动的输入做出反应。这样简化的网络(前馈神经网络模型)在更容易构建和使用。 这样: 每个神经元都收到上一层神经元传来的信号 每个信号都乘上了一个权重 加权后的输入值加总起来,通过一个限制的功能,将输出值的范围缩小为一个固定范围。 通过限制器后的输出值继而向下一层的所有神经元传播 人工神经网络最常见的学习算法叫做反向传播(Back Propagation,简称BP),即「误差反向传播」。为了利用神经网络,我们给第一层施加输入值,让信号通过网络传播,读取输出。一个BP网络通过例子学习,也就是说,我们必须提供一套学习模式,由一些输入值和已知的正确输出值组成。这样,我们将这些输入-输出的例子展示给网络,告诉它哪些行为是我们期望得到的。BP算法通过网络反向传播误差值,调整权重值,并以此让网络适应。这些神经元的每个链接都有着独一无二的权重值。网络的「智能」就隐藏于权重的值中。随着每个误差迭代返回,权重以此得到调整。每个案例中整个过程都在重复。因此,为了检测目标函数,程序员将会通过迅速发送许多包含目标的数字化数据版本(例如图片)来训练网络。如果网络没有准确识别一个具体的模式,权重就会被调整。训练的最终目的是去让网络能始终如一地识别我们能够识别的模式(例如猫咪)。深度学习如何帮助解决直觉问题? 深度学习的总体目标还是要去解决一个「直觉」问题,也就是以高维度和无规则为特征的问题。前文介绍的机制展示了一个基于有限神经元模型的监督式学习算法——但是我们需要理解更多。 深度学习让计算机解决直觉问题,这是因为: 有了深度学习,计算机可以不仅从经验中学习,还可以根据概念的层级结构来理解世界——这个层级结构中,每个概念都由更简单的概念来定义。 概念的层级结构是通过解决「表示问题」而「自下而上」地构建,并没有提前定义好的规则。 这与孩子们学习「狗狗是什么」的方式相似,通过理解概念中的一个组成部分,如行为(例如狗吠),脑袋的形状,尾巴,皮毛等等,继而将这些概念组成为一个更大的概念,也就是狗本身。 (知识)表征问题在计算机科学中是一个重复出现的主题。 知识表征与心理学中的理论相结合,后者主要研究理解人们如何解决问题,以及表征知识。这个想法是:如果像人类一样,计算机可以从经验中整合知识,它就不再需要人类操作者正式指定解决问题所需的所有知识。 对于计算机来说,表征的选择对机器学习算法的成果有着巨大的影响。例如,基于音调的高低可以知道讲话者是一个男人、女人还是孩子。然而,对于很多应用来说,知道哪些特征表示着准确的信息并不容易。例如,在检测汽车图像中,轮子应该是圆形的——但是实际上轮子的照片有着很多不同的部分(例如金属部分)。因此,表征学习的概念就是要同时找到映射与表征。 如果我们能够自动(即没有人类的干预)找到知识的表征和它们的映射,我们就有了一个灵活的设计去解决直觉问题。我们可以适应新的任务,甚至可以不需观察就可以产生新见解。举个例子,基于音调的高低我们可以知道其主人的口音,从而了解种族。这种机制是自我学习。深度学习最适用于数据庞大、参数之间关系复杂的环境。训练一个神经网络涉及重复地向它展示:「给定一个输入,就会有一个正确的输出」。如果这个过程被进行了足够多次,这个网络就拥有了有效的训练,它就能模仿出你所模拟的方程。它会忽视与解无关的输入。但反过来,如果你没有给出关键性的输入,它就无法给出一个正确的解。这种模型可以应用于很多情况,如以下所给出的简单案例。多层学习的案例 深度学习涉及到通过神经层学习,让计算机能够基于简单概念构建起复杂概念的层级结构。这种方法对很难表达的主观与直觉问题很有用。 来看看图像数据吧。计算机无法理解像素集合的意义。从一组像素中映射出复杂的目标函数,是非常困难的事。 有了深度学习,这个问题被分解为一系列层级化的映射——每个映射都由一个具体的神经层描述。 将输入(表征我们实际观察的变量)展现给可见层。接着,一系列隐藏层从涉及到某个具体映射的输入中提取出越来越抽象的特征。然而请注意,这个过程并不是提前定义好的,也就是说,我们并不会指定每层选择的内容。 举个例子:从像素中,第一个隐藏层识别出边缘 从边缘,第二个隐藏层识别角和轮廓。 从角和轮廓,第三个隐藏层识别目标的部分 最终,从目标的部分中,第四个隐藏层识别出整个物体 对物联网的启示 让我们扼要重述: 第一,深度学习算法可应用于多个领域,包括计算机视觉、图像识别、模式识别、语音识别、行为识别等。 第二,深度学习系统现在有着完善的可能性,因为三个原因:高配置CPU、更好的算法及更多可用的数据。在接下来的几年里,这些因素会为深度学习系统带来更广泛的应用。 第三,深度学习是最适合于数据庞大、参数之间关系复杂的情况。 第四,解决直觉性问题:训练一个神经网络需要重复地向它展示:「给定一个输入,就会有一个正确的输出」。如果这个过程被进行了足够多次,这个网络就拥有了有效的训练,它就能模仿出你所模拟的方程。它会忽视与解无关的输入。但反过来,如果你没有给出关键性的输入,它就无法给出一个正确的解。这种模型可以应用于很多情况。 另外,我们在这种技术上依然还有局限性。例如,我们还要走很漫长的路,深度学习系统才能发现你因为你的猫咪死掉了而很伤心(尽管IBM的沃森所衍生的认知玩具似乎正向着这个方向前进)。目前的关注点更多在于识别图片,猜测图片中人物的年龄(基于微软的Oxford项目的API。) 正如吴恩达所提醒我们的那样,用建造火箭飞船的方法去思考人工智能。我们在这一点也的确还有进步的空间。 「我认为AI类似于建造一艘火箭飞船。你需要一个巨大的引擎和很多燃料。如果 你有一个大引擎但是燃料却很少,你就无法让它飞上轨道。如果你有一个小引擎,但是却有上吨的燃料,你甚至没法让它飞起来。这和深度学习(创造人工智能的关键过程之一)的相似点在于,火箭引擎是深度学习的模型,燃料则是我们供给算法的海量数据。 」 今天,由于技术的限制,我们仍然受限于规模化。谷歌推出的识别猫的神经网络有着16,000个节点。但是,一个人类大脑足足有着1000亿个神经元! 下列是反向传播神经网络适用于的情景: 有着大量的输入/输出数据,但是你并不确定如何与输出相关联。因此,我们有大量「给定一个输入,就有一个正确的输出」这样的情景可利用于训练神经网络,因为很容易创造出许多正确行为的样本。 问题看起来有着极端的复杂度。复杂度产生于低规则、高维度以及很难表征的数据。然而,这里肯定有一个解决方法。 问题的解决方法可能会随时间改变,在给出的输入与输出参数范围中(也就是说,今天的2+2=4,但是未来我们也许会发现2+2=3.8)。输出可能很「模糊」,或者是非数值的。 某个领域的专业技能并不是必须的,因为输出可以纯粹来源于输入:这里存在一些争议,因为建立一个输出只依赖于输入的模型并不总是可能。不过,想想预测股市的例子吧。在理论上,有了足够多的股票价格的输入和输出例子,如果利用深度学习技术进行合适的训练,你可以创造出一个能够预测未知情景的模型。 推论:我们需要在缺乏观察的情况下,也能够推出新见解。例如,基于音调的高低——我们可以推测出讲话者口音与种族。 说到物联网领域,我们要考虑的首要问题是: 哪些已有的应用可以通过增加直觉型成分(过去曾用在智慧城市),用深度学习技术来进行补充? 测量和预测时采用什么度量指标?我们如何给这个指标增加一个直觉型的成分? 哪些存在于计算机视觉、图像识别、模式识别、语音识别、行为识别等等的应用还可以应用于物联网? 现在为了更加深入该领域,下面有一些我很感兴趣且正在关注的领域。 利用物联网数据库补充深度学习算法 从根本上来说,这些技术/策略用物联网数据库来补充深度学习算法。 深度学习算法和时间序列数据:来自传感器的时间序列数据可以被认为是一种以规则的时间间隔取样的一维网络,而图像数据可以被认为是一种像素组成的二维网络。这让我们可以用深度学习算法为时间序列数据进行建模(大部分传感器/IoT数据都是时间序列)。探索深度学习和时间序列的做法不太常见,但是这种方法已经有了许多相关的案例(例如这篇论文:Deep Learning for Time Series Modelling to predict energy loads using only time and temp data)。 多模态:深度学习的多模态(multimodality)。深度学习算法中,多模态被研究得很多,尤其是交叉模态特征学习。在交叉模态特征学习中,如果在特征学习的过程中展示了多模态(如音频+视频),那么,对单一模态(例如视频)就能学到更好的特征。 深度学习的时间模式:卡耐基梅隆大学电子和计算机工程系的博士学生Huan-Kai Peng与教授Radu Marculescu在他们最近的论文中,提出了识别多时间尺度中互动模式内在动态的新方法。他们的方法需要构建一个深度学习模型,由多层组成;每一层捕捉一个具体时间尺度的相关模式。 这种新的模型还可以应用于解释短期模式与长期模式相关联的可能方式。举个例子。利用这种方法,就有可能解释Twitter上 的某个长期模式是如何保持,并由一系列短期模式来加强的——这些短期模式包括人气、忠实度、传染度和互动性等。(论文见:http://vdisk.weibo.com/s/te1d-BLdOXpEB ) 智慧城市的畅想 我把智慧城市看为一种物联网的应用领域。智慧城市/未来都市的定义有许多。从我们的角度看,智慧城市是指用数字技术来加提高人们的生活与福利,减少成本与能源消耗,并更有效更活跃地参与到居民活动中。关键的「智慧」部分包括运输、能源、医疗、水与垃圾处理等领域。 更加全面的智慧城市/物联网应用领域包括:智能运输系统(自动化交通工具),医疗、环境、废物管理、空气质量、水质量、事故与紧急服务、能源(可再生能源等)。在这些领域内,我们可以找到一些应用,添加上面所讲述的直觉型组分。 还有一些典型的领域包括计算机视觉、图像识别、模式识别、行为识别。目前人们比较感兴趣的新兴领域则有自动驾驶车——例如Lutz pod,甚至更大的汽车,例如自动驾驶卡车。 结论 深度学习设计到通过多层学习,让计算机基于简单概念构建复杂概念的层级结构。深度学习被用于解决高维度直觉性应用。它是一个新兴领域,在未来几年,由于科技的进步,我们可能会看到更多深度学习的应用。 我自己则非常感兴趣于物联网数据库如何补充深度学习算法。从上面的几个案例来看,它尚为雏形。我相信它会有着广泛的应用,并且有许多我们的探索还没有完成(例如智慧城市)。 本文转自d1net(转载)

优秀的个人博客,低调大师

Docker技术入门与实战(第2版)1.3 Docker与虚拟化

1.3 Docker与虚拟化 虚拟化(Virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化(Computing Virtualization),或通常说的服务器虚拟化。维基百科上的定义如下:“虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。” 可见,虚拟化的核心是对资源的抽象,目标往往是为了在同一个主机上同时运行多个系统或应用,从而提高系统资源的利用率,并且带来降低成本、方便管理和容错容灾等好处。 从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中,真正意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO虚拟化(Sin

优秀的个人博客,低调大师

Manifest.xml 入门基础 (五)<Activity>标签

<activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:clearTaskOnLaunch=["true" | "false"] android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "orientation", "screenLayout", "fontScale", "uiMode"] android:enabled=["true" | "false"] android:excludeFromRecents=["true" | "false"] android:exported=["true" | "false"] android:finishOnTaskLaunch=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"] android:multiprocess=["true" | "false"] android:name="string" android:noHistory=["true" | "false"] android:permission="string" android:process="string" android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nosensor"] android:stateNotNeeded=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] > </activity> A、android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true B、android:clearTaskOnLaunch 比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q C、android:configChanges 当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”. 这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢?正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等. D、android:excludeFromRecents 是否可被显示在最近打开的activity列表里,默认是false E、android:finishOnTaskLaunch 当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented F、android:launchMode(Activity加载模式) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式 Activity有四种加载模式: standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。 singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例 singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。 singleInstance:首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。 G、android:multiprocess 是否允许多进程,默认是false 在实际开发中,CP有以下两种用法: 1)和应用在一个APK包里 这种情况下和应用在同一进程中。process name和uid都一样。 2)单独在一个APK包里。 这种情况下,如果在AndroidManifest.xml文件里声明了和某个进程同属一个进程,如: package="com.android.providers.telephony" android:sharedUserId="android.uid.phone"> android:allowClearUserData="false" android:label="Dialer Storage" android:icon="@drawable/ic_launcher_phone"> android:authorities="telephony" android:multiprocess="true" 这个里面通过android:sharedUserId=”android.uid.phone”和android:process=”com.android.phone”声明了该CP是和phone进程同属一个进程,拥有同样的process name和uid. 如果没有上述声明,那么该CP是在独立的进程中,拥有属于自己的process name和uid. 以上两种用法可以总结为: 1)CP和某个进程同属一个进程 这种情况下,当该进程启动时,会搜索属于该进程的所有CP,并加载。 2)CP属于独立的一个进程。 这种情况下,只有需要用到该CP时,才会去加载。 那么,当一个进程想要操作一个CP时,先需要获取该CP的对象,系统是如何处理呢: 1)如果该CP属于当前主叫进程,因为在进程启动时就已经加载过了,所以系统会直接返回该CP的对象。 2)如果该CP不属于当前主叫进程,那么系统会进行相关处理(由ActivityManagerService进行,以下简称为AMS): 所有已加载的CP信息都已保存在AMS中。当需要获取某个CP的对象时,AMS会先判断该CP是否已被加载 —-如果已被加载,该CP和当前主叫进程不属一个进程,但是该CP设置了multiprocess的属性(如上例中的android:multiprocess=”true”),并且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。否则就需要通过IPC机制进行调用。 —-如果还未被加载,该CP和当前主叫进程不属一个进程,但是该CP设置了multiprocess的属性(如上例中的android:multiprocess=”true”),并且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。否则就需要先创建该CP所在的进程,然后再通过IPC机制进行调用。 H、android:noHistory 当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹 I、android:screenOrientation activity显示的模式 默认为unspecified:由系统自动判断显示方向 landscape横屏模式,宽度比高度大 portrait竖屏模式, 高度比宽度大 user模式,用户当前首选的方向 behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的) sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换 nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了 J、android:stateNotNeeded activity被销毁或者成功重启时是否保存状态 K、android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。 这个属性能影响两件事情: 【A】当有焦点产生时,软键盘是隐藏还是显示 【B】是否减少活动主窗口大小以便腾出空间放软键盘 各值的含义: 【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示 【C】stateHidden:用户选择activity时,软键盘总是被隐藏 【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的 【E】stateVisible:软键盘通常是可见的 【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态 【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示 【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间 【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。 一般情况下,在新建一个activity后,为了使intent可以调用此活动,我们要在androidManifest.xml文件中添加一个<activity>标签,<activity>标签的一般格式如下: <activity android:name="my.test.intents.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 其中,”android:name”是活动对应的类名称,”android:label”是活动标题栏显示的内容,<intent-filter>是意图筛选器,<action>是动作名称,是指intent要执行的动作,<category>是类别名称,一般情况下,每个<intent-filter> 中都要显示指定一个默认的类别名称,即<category android:name=”android.intent.category.DEFAULT” />,但是上面的代码中没有指定默认类别名称,这是一个例外情况,因为其<intent-filter> 中的<action>是”android.intent.action.MAIN”,意思是这项活动是应用程序的入口点,这种情况下可以不加默认类别名称。 当然,除<action>和<category>以外,<intent-filter>中还有很多其他元素,在这里不详述。 上面的代码是androidManifest.xml中定义程序入口活动的例子,下面我们写一个自定义的例子: <activity android:name=".MyBrowserActivity" android:label="My Activity" > <intent-filter> <action android:name="my.test.MyBrowser"/> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http"/> </intent-filter> </activity> 在这个<activity>标签中,我们指定活动的类为MyBrowserActivity.class,活动的标题显示为”My Activity”,<action android:name=”my.test.MyBrowser”/>意味着其他活动可以通过my.test.MyBrowser动作来调用这个活动,”my.test.MyBrowser”只是我们定义的一个动作的名称,写成包的形式是因为这样使我们更容易理解它的含义,如果我们把”my.test.MyBrowser”改成任意的内容如:”somethingelse”,同样,我们可以通过这个新的动作名称,来调用这个活动。<data> 元素指定了活动期望的数据类型,在这里,它期望的数据要以http://前缀开头。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册