MAUI Android 关联文件类型

实现效果

打开某个文件,后缀是自己想要的类型,在弹出的窗口(用其它应用打开)的列表中显示自己的应用图标

点击后可以获得文件信息以便于后续的操作

用其它应用打开

实现步骤

以注册.bin后缀为例,新建一个MAUI项目

调整启动模式

修改Platforms\Android\MainActivity.cs

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]

调整为

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density, LaunchMode = LaunchMode.SingleTop)]

末尾增加了LaunchMode = LaunchMode.SingleTop

更改启动模式为栈顶模式,解释如下

SingleTop模式又称栈顶模式,每次启动一个Activity的时候,首先会判断当前任务栈的栈顶是否存在该Activity实例,
如果存在则重用该Activity实例,并且回调其onNewIntent()函数,否则就创建一个新实例。

这样,我们就可以在回调函数中获得文件路径

注册关联类型

还是修改Platforms\Android\MainActivity.cs

Activevity注册的下一行添加

[IntentFilter(new[] { Intent.ActionSend, Intent.ActionView }, Categories = new[] { Intent.CategoryDefault }, DataMimeType = @"application/octet-stream")]//.bin文件关联

application/octet-streamBin的Mime类型,根据自己的文件后缀,可以查询所有官方 MIME 类型的列表

监听意图

重写OnNewIntent拿到意图,并从中获取数据,通过 Messenger 进行数据传递

也可以通过试图跳转进行传递,具体参考:MAUI文档-传递数据

新建一个消息模型

引用 CommunityToolkit.Mvvm NuGet 包

创建消息模型

namespace ITLDG.Message
{
    public class NewFileMessage : ValueChangedMessage<Android.Net.Uri>
    {
        public NewFileMessage(Android.Net.Uri uri) : base(uri)
        {
        }
    }
}

发送消息

using Android.Content;//引用这个

...

	public class MainActivity : MauiAppCompatActivity
    {
	
		...
	
        protected override void OnResume()
        {
            base.OnResume();
            //这里调用下,不然首次启动没有意图
            OnNewIntent(Intent);
        }
        protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);
            if (intent.Action == Intent.ActionView)
            {
                WeakReferenceMessenger.Default.Send(new NewFileMessage(intent.Data));
            }
        }
		
		
		...
		
    }
	
	...
	

接收消息

ViewModel中接收消息

WeakReferenceMessenger.Default.Register<NewFileMessage>(this, (r, m) =>
{
    if (m.Value == null) return;
    var intent = m.Value;
    //文件路径
    // var path = intent.Path
    //得到文件流
    var stream = Platform.CurrentActivity.ContentResolver.OpenInputStream(intent);
    var memoryStream = new MemoryStream();
    stream.CopyTo(memoryStream);
    //完整的数据
    var bytes=memoryStream.ToArray()
});

总结

起初,我使用视图跳转传递参数的方式传递获取到的Intent,尝试了几次无法传递到MainPage

后加了一个跳转页,拿到消息后传到到中转页,中专页拿到数据后再将数据回穿回来,但是这样传递,无法传递Intent类型和Uri类型,我不得不先将文件写到缓存目录,再传递缓存目录

这样的流程始终无法满意,最终改为使用Messenger 进行数据传递,问题解决

另外,起初首次打开文件唤醒APP,无法获取到Intent,APP后台运行打开文件唤醒正常

后来在stackoverflow找到了答案

本文转载于网络 如有侵权请联系删除

相关文章

  • aizuda

    自觉心是进步之母,自贱心是堕落之源,故自觉心不可无,自贱心不可有。——邹韬奋 近参与的开源项目:爱组搭这个开源项目刚起步,我是很看好它的目前有三个模块,一个限流、一个安全模块、以及一个机器人模块限流模块就不用多说了,安全模块也就是用来加密,机器人模块,就是把你的异常捕获,并推送到企业微信飞书钉钉等平台示例项目建议fork下来示例项目跑一跑玩一玩官方介绍:aizuda-components爱组搭~低代码组件化开发平台之组件库愿景:每个人都是架构师爱组搭~组件源码示例演示公共模块aizuda-common主要内容工具类等。限流模块aizuda-limiter主要内容api限流,短信,邮件发送限流、控制恶意利用验证码功能等。><dependency> <groupId>com.aizuda</groupId> <artifactId>aizuda-limiter</artifactId> <version>1.0.0</version> ></dependency>复制机器人模块aiz

  • Pve虚拟机所遇到的问题以及安装过程

    问题直通显卡显示IMMOU提示,Grub、内核、黑名单等都以及添加,但还是添加成功.折腾了三天,感觉我要放弃AllinOne的想法了.教程打开PVE节点的shell,输入命令:nano/etc/default/grub复制找到GRUB_CMDLINE_LINUX_DEFAULT="quiet"复制改为:GRUB_CMDLINE_LINUX_DEFAULT="quietintel_iommu=onvideo=efifb:off"复制编辑完文件后按“Ctrl+X”>“Y”>“回车”,继续输入以下命令。在PVE的shell中输入:nano/etc/modules复制在文件下面添加新内容vfio vfio_iommu_type1 vfio_pci vfio_virqfd复制编辑完文件后按“Ctrl+X”>“Y”>“回车”,继续输入以下命令。最后更新配置信息并重启PVE主机update-grub update-initramfs-u-kall reboot复制img镜像转格式qmimportdiskVMID路径local-lvm复制

  • 推荐一款IDEA神器!一键查看Java字节码以及其他类信息

    由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下。非常实用!你会爱上它的!开始推荐IDEA字节码查看神器之前,先来回顾一下Java字节码是啥。何为Java字节码?Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码?采用字节码的好处是什么?在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。Java程序从源代码到运行一般有下面3步:Java程序运行过程为什么要查看Java字节码?我们在平时学习的时候,经常需要查看某个java类的字节码文件。查看字节码文件更容易让我们搞懂java代码背后的原理比如搞懂java中

  • solidity struct 结构体创建与使用浅学 (四)

    环境说明:Ide:在线remixSolidityIDE 语言:soliditysolidity 版本号:0.4.20 Tip:如果一点都不懂的建议从头开始看 运行结果截图我不赘述,所有合约代码均通过个人检测。请按照标准进行操作,如出问题检测是否网络连得上外网,且操作按照第一节内容类似操作;由于版本更新,可能会出现不同,但该教材代码均适用于在0.4.20版本使用 solidity结构体使用和一些语言使用类似。 合约代码:pragmasolidity^0.4.20; contractTest{ Peoplep; structPeople{ uint256age; } //定义函数修改器 modifierage18(uint256age){ require(age>=18); _; } //set方法,用函数修改器age18修饰set函数 functionset(uint256x)publicage18(x){ p=People(x); } //返回结构体变量中的age内容 functionget()publicconstantreturns(uint256){ returnp.age

  • docker,做好你的垃圾收集!

    1查找docker文件夹find/-namedocker复制2列举文件夹大小du-h--time--max-depth=1.df-hdf-TH复制3Docker占用磁盘空间查看dockersystemdf复制4删除所有未运行的容器(也可以使用docker-gc)dockerrm$(dockerps-a|grepExited|awk'{print$1}')dockerrm$(dockerps-qfstatus=exited)复制5删除所有未打标签的镜像dockerrmi$(dockerimages-q-fdangling=true)复制6删除所有无用的volumedockervolumerm$(dockervolumels-qfdangling=true)复制7清理磁盘,删除关闭的容器,无用的数据卷和网络dockersystemprune复制8停止所有运行的容器dockerstop$(dockerps-q)复制9停止所有容器dockerstop$(dockerps-a-q)复制10删除所有容器dockerrm$(dockerps-aq)复制11删除所有镜像docker

  • Java 注解与单元测试

    注解Java注解是在JDK1.5之后出现的新特性,用来说明程序的,注解的主要作用体现在以下几个方面:编译检查,例如@Override编写文档,javadoc会根据注解生成对应的文档代码分析,通过注解对代码进行分析[利用反射机制]JDK中有一些常用的内置注解,例如:Override:检查被该注解修饰的方法是否是重写父类的方法Deprecatedd:被该注解标注的内容已过时SuppressWarnning:压制警告,传入参数all表示压制所有警告自定义注解JDK中虽然内置了大量注解,但是它也允许我们自定义注解,这样就为程序编写带来了很大的便利,像有些框架就大量使用注解。java注解本质上是一个继承了java.lang.annotation.Annotation接口的一个接口,但是如果只是简单的使用关键字interface来定义接口,仍然不是注解,仅仅是一个普通的接口,在定义注解时需要使用关键字@interface,该关键字会默认继承Annotation接口,并将定义的接口作为注解使用注解中可以定义方法,这些方法的返回值只能是基本类型、String、枚举类型、注解以及这些类型的数组,我们称这

  • WEB前端-搜索引擎工作原理与SEO优化

    一、搜索引擎工作原理搜索引擎的工作分为三个阶段,即爬行,索引和检索1、爬行 搜索引擎具有网络爬虫或蜘蛛来执行爬网,每次抓取工具访问网页时,它都会复制该网页并将其网址添加到索引中。在“蜘蛛”抓取网页内容,提炼关键词的这个过程中,就存在一个问题:“蜘蛛”能否看懂。如果网站内容是flash和js,那么它是看不懂的。相应的,如果网站内容是它的语言,那么它便能看懂,它的语言即SEO2、索引 此阶段,爬网程序会创建搜索引擎的索引。索引就像一本巨大的书,其中包含爬虫找到的每个网页的副本。如果任何网页发生更改,则抓取工具会使用新内容更新图书3、检索  这是搜索引擎以特定顺序提供最有用和最相关答案的最后阶段二、SEO简介全称:SearchEnglishOptimization,搜索引擎优化,即为了提升网页在搜索引擎自然搜索结果中的收录数量以及排序位置而做的优化。1、SEO的分类白帽SEO:起到了改良和规范网站设计的作用,使网站对搜索引擎和用户更加友好,并从搜索引擎中获取合理的流量黑帽SEO:利用和放大搜索引擎政策缺陷来获取更多用户的访问量2、白帽SEO的使用(1)对网站的标题、关键字、描述精心设置,反映

  • 兼容问题(下)

    每个浏览器不同的内核,不同的处理引擎,不同的渲染引擎就会导致写同一条样式的时候出现差异这个现象叫做做兼容浏览器:Ie(67891011)谷歌火狐苹果Ie67的常见的兼容性的问题H5标签兼容。 (js文件引入)第一块元素浮动,第二块元素加margin值等于第一块元素,在IE6下会有间隙问题; (第二块元素也float)IE6下子元素超出父级宽高,会把父级的宽高撑开 (绕过)p包含块元素嵌套规则。 (绕过)margin兼容性问题合并塌陷(传递) (floatborderoverflow:hidden)display:inline-block的问题 (display:inline;zoom:1)IE6最小高度问题 (overflow:hidden)IE6双边距 (*display:inline;)li里元素都浮动li在IE67下方会产生4px间隙问题 (*vertical-align:top;)IE67父级元素的overflow:hidden是包不住子级的relative (*position:relative;)IE6下绝对定位元素父级宽高是奇数,绝对定位元素的right和bottom值会

  • 机器人实用Python代码合集,帮你搞定自主导航 |GitHub高热

    迷之栗发自凹非寺 量子位出品|公众号QbitAI“有代码么?”每每写到某实验室的机器人,解锁了厉害的操作,评论区很容易生出这样的问题。然而,答案常常略带伤感,不好意思,暂时没有。最近,有一份机器人Python代码合集登陆GitHub,并受到了用户的热烈标星。自主导航看这里来自日本的坂井敦,是一个玩机器人的工程师。他和小伙伴们,为了能让更多的机器人,在地球上自如地游走,便为广大同行做了一次这样的Python代码汇总,大类如下——·Localization(定位) ·Mapping(地图构建) ·SLAM ·PathPlanning(路径规划) ·PathTracking(路径追踪)不难看出,这份合集非常在意,机器人的自主导航能力。第一个登场的,是“定位”分类下的扩展卡尔曼滤波器(EKF)。这是一个传感器融合的定位方法。 蓝线是真实轨迹,黑线是用航位推测法(DeadReckoning)推定的轨迹。 绿点是位置数据(比如GPS),红线是EKF估计出的轨迹。 红色椭圆是EKF估计的协方差。就像这样,每个词条下面都配了一张动图,还有动图的详解。坂井说,这样观众就可以更加直观地理解,各种方法背后

  • AI应从神经科学中借鉴想法和思路

    授权转载自OReillyData作者|JackClark编者注:在这里登记报名可以下载即将出版的由JackClark编写的报告《人工智能:教会机器像人一样思考》。本文所刊载的采访是收录在这篇报告中一系列采访之一。根据GeoffHinton(经常被誉为深度学习的“教父”)的观点,更好地理解神经元产生脉冲的原因可以带来更聪明的人工智能系统,其可以更有效地存储更多的信息。GeoffHinton是多伦多大学的荣誉退休杰出教授和谷歌的工程院士。他是神经网络的先驱者之一。作为很小一群学术人员之一,他和其他人共同哺育这项技术渡过了它所经历的研究兴趣、资金和发展的低潮期。核心内容:通过诸如奥巴马政府的“大脑计划”这样的研究项目完成的大规模大脑研究,有希望获得对大脑的新认知,从而为AI的设计人员带来新想法和思路。是可以把神经科学里的发现引入到AI相关的想法里,尽管这可能会花些时间。在1973年,Hinton首先想到去实现一个类似于神经突触在多时间尺度上变化的机制,但直到2016,才发表了这个领域的一篇主要论文。开发强大的感知系统是相对容易的,但是我们需要新的技术来构建能够推理和语言的系统。JackCla

  • 【优质题解】题号1174:【计算直线的交点数】 (C语言描述)

    题号1174,原题见下图:解题思路: 将n条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,……,直线n和其他n-1条直线最多有n-1个交点。由此得出n条直线互不平行且无三线共点的最多交点数:Max=1+2+……+(n-1)=n(n-1)/2;这些直线有多少种不同的交点数当n=1,2,3时情况很容易分析。当n=4时,我们可以按如下分类方法,逐步计算。1.四条直线全部平行,无交点。2.其中三条平行,交点数:3*(n-3)+0=3;3.其中两条平行,而另外两条直线的交点既可能平行也可能相交,因此交点数据分别为:2*(n-2)+0=42*(n-2)+1=54.四条直线互不平行,交点数为1*(n-1)+{3条直线的相交情况}:1*(n-1)+0=3 1*(n-1)+2=5 1*(n-1)+3=6即n=4时,有0,3,4,5,6个不同的交点数.所以有5种可能。从上述n=4的分析过程中,发现:m条直线的交点数=r条平行线与m-r条直线交叉的交点数+m-r条直线本身的交点数=r*(m-r)+m-r条直线之间的交点数。(1<=r<=m){m条直线的交点数

  • 微服务架构中的服务发现

    为什么使用服务发现? 我们假设您正在编写一些调用具有RESTAPI或ThriftAPI的服务的代码。为了发送请求,您的代码需要知道服务实例的网络位置(IP地址和端口)。在运行在物理硬件上的传统应用中,服务实例的网络位置是相对静态的。例如,您的代码可以从偶尔更新的配置文件读取网络位置。然而,在现代的基于云的微服务应用中,这是一个更难解决的问题,如下图所示。服务实例具有动态分配的网络位置。此外,由于自动缩放,故障和升级,服务实例集合会动态更改。因此,您的客户端代码需要使用更精细的服务发现机制。有两种主要的服务发现模式:客户端发现和服务器端发现。我们来看看客户端发现。客户端发现模式当使用客户端发现时,客户端负责确定可用服务实例的网络位置和负载均衡请求。客户端查询服务注册表,它是可用服务实例的数据库。然后,客户端使用负载均衡算法来选择一个可用的服务实例并发出请求。下图显示了此模式的结构。服务实例的网络位置在服务注册表启动时被注册。当实例终止时,它从服务注册表中删除。通常使用心跳机制周期性地刷新服务实例的注册。NetflixOSS提供了客户端发现模式的一个很好的例子。NetflixEureka是

  • angularjs和ajax的结合使用 (二)

    今天我们来继续丰富上次的例子。我们来搞些稍微复杂点的应用。 首先我们来加一个全选的功能。 上一篇的例子里我们看到分页时载入的是我们通过linq查询自定义列然后构建的匿名类。使用这种EF框架+linq查询的方式我认为不方便的一点就是要不你就只能select一个固定对应表的数据模型类名,但是序列化成json的时候对外键类引用有天然的bug ,就是框架自动序列化成json格式时会出循环引用错误。序列化类型为XX的对象时检测到循环引用。没办法我们能做的就是屏蔽某些属性。方式就是在字段属性上方加上[AjaxPro.AjaxNonSerializable]光这样还不行如果字段属性有virtual关键字还会报错,但是EF写数据模型代码的时候外键属性如果不加virtual修饰就等于废的外键抓不过来的。真是令人蛋疼的问题。大多数情况我们查询都不会只查询单一表的数据并且基本还是用匿名类的方式想用什么字段用什么字段外键也可以及时查询出来 。综合上面的问题还是用匿名类的方式。  如果你希望客户端传回来的数据对象自动序列化成你的C#数据模型类。也有些需要注意的地方除了上面我说的,还

  • entitybuilder--一个简单的业务通用框架

    关于业务通用框架的思考 业务系统是千差万别的,例如,保存、更新和删除订单,或者保存订单和保存客户,走的根本不是一个流程。但是,它们还是有共同点,它们的流程大致可以分成下面的几个部分: 拿到增删改等操作所需的基础数据; 初始化基础数据; 对基础数据进行校验; 利用基础数据,构建出要进行增删改等操作的对象; 持久化或其他操作。 基于这一点,我试着抽取出一套适用于不同业务、不同用例、不同场景的通用业务框架。刚好,去年部门开始重构订单系统,我试着将自己的想法付诸行动。经过几次调整后,总算形成了一个简单的业务通用框架--entitybuilder。 当然,我更多想表达的,是一种思想、一种规范,而非工具本身。如果真要说是框架,entitybuilder就太简陋了。 entitybuilder的结构 entitybuilder包含三个主要部分,基础数据basedata、构建器entitybuilder和结果对象resultentity。我拿到了basedata,把它丢进entitybuilder,entitybuilder就会帮我构建出resultentity,拿到resultentity后,

  • CF1696C Fishingprince Plays With Array 题解

    可能更好的阅读体验 题目传送门 题目大意 给定一个长度为\(n\)的数组\(a\)、一个长度为\(k\)的数组\(b\)和一个数字\(m\),现在对数组\(a\)进行以下操作: 选择数组\(a\)中一个\(m\)的倍数\(a_i\)替换成\(m\)个\(\dfrac{a_i}{m}\) 选择数组\(a\)中\(m\)个相同的数字\(a_i,a_{i+1},\dots,a_{i+m-1}\)替换成\(m\cdota_i\) 请问能否把数组\(a\)变成数组\(b\)。 数据范围:\(1\len,k\le5\times10^4\),\(2\lem\le10^9\),\(1\lea_i,b_i\le10^9\),\(\sumn+k\le2\times10^5\)。 题目解析 发现两个操作是互逆的,所以我们判断是否可以把数组\(a\)和数组\(b\)通过这两个操作来转化成同一个数组。 所以我们只需要把两个数组中所有\(m\)的倍数都拆开,然后判断两个数组是否相同即可。 显然可能会拆出很多项,所以需要开一个结构体来表示数组,里面的两个变量分别代表这个数字和它的重复次数。 intn,m,k,a

  • Windows守护进程简单示例

    转载: https://blog.csdn.net/kikaylee/article/details/51395360 /* @描述:一个简单的Windows守护进程的例子(C++版本) @作者:kikaylee @日期:2016-05-1310:30 */ #include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<io.h> #include<iostream> usingnamespacestd; //隐藏DOS黑窗口 #pragmacomment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"") //定义路径最大程度 #defineMAX_PATH4096 //定义守护进程名称 #definePROCCESS_NAME"test.exe" //定义写入的注册表路径 #defineSELFSTART_REGEDIT_PATH"Software\\Microsof

  • 深入理解TCP协议的三次握手及其源代码

    三次握手 相信大部分人都知道TCP三次握手的机制是什么,流程及客户端和服务器端状态如下图: 关于客户端、服务器状态解析的可以参考之前写的博文Linux下netstat命令详解 TCP的三次握手从用户程序的角度看就是客户端connect和服务端accept建立起连接时背后的完成的工作,在内核socket接口层这两个socketAPI函数对应着sys_connect和sys_accept函数,进一步对应着sock->opt->connect和sock->opt->accept两个函数指针。 进行源代码分析,在net/ipv4/tcp-ipv4.c文件下的结构体变量structprototcp_prot查看了TCP协议栈的访问接口函数,可以看到实际的调用关系,在TCP协议中这两个函数指针对应着tcp_v4_connect函数和inet_csk_accept函数。 structprototcp_prot={ .name ="TCP", .owner =THIS_MODULE, .close =tcp_close, .pre_connect =tcp_v

  • scrum冲刺博客

    scrum冲刺博客 项目 内容 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 这个作业的目标 scrum冲刺博客 项目地址:https://gitee.com/kly99/mini-selection 任务总时间表 总时间:54小时 时间 计划 第1天 1.编写团队项目Alpha任务分配计划(区德明)(2小时)2.团体架构初始设计(全体)(4小时)3.团队讨论程序编码规范,搭建工作平台(全体)(2小时) 第2天 1.UI界面初始设计(彭正嵩)(4小时)2.数据库初始设计(李文静)(4小时)3.前端界面初始设计(沈权斌,杜维佳)(4小时) 第3天 1.数据库改进(李文静,区德明)(4小时)2.UI界面改进(彭正嵩)(4小时)3.前端界面改进(沈权斌,杜维佳)(4小时) 第4天 1.小程序原型测试(全体)(4小时)2.对BUG进行改正(全体)(4小时) 第5天 1.小程序初版测试(全体)(4小时)2.邀请用户参加测试并反馈(全体)(2小时)3.对BUG进行改正(全体)(4小时) 第6天 1.邀请用户参加测试并反馈

  • bootstrap-popover的配置与灵活应用

    首先罗列一下配置参数: 1、animationtrue/false是否动画 2、placement'right'/'left'/top/bottom/function(){return'right'}弹出提示的位置 3、selector目标对象 4、trigger'hover'/'click'...触发方式 5、title标题如果元素没有指定data-original-title属性,则使用这个默认值 6、content内容如果元素没有指定data-content属性,则使用这个默认值 7、delay显示和隐藏的时间20/{show:200,hide:300}   然后列举一下,我们日常开发中会遇到的问题: 1、如果我要默认为鼠标点击触发事件如何处理? $('a').popover({ trigger:'click' });复制   2、如果我要点击非目标对象关闭提示层怎么办? 说明:每个提示会生成一个class为popover的div容器,因此只需要在body上绑定一个click事件实现对class为popover的div销毁即可。值得注意的是,目标对象的cl

  • Node.js 创建HTTP服务器

    Node.js创建HTTP服务器 如果我们使用PHP来编写后端的代码时,需要Apache或者Nginx的HTTP服务器,并配上mod_php5模块和php-cgi。 从这个角度看,整个"接收HTTP请求并提供Web页面"的需求根本不需要PHP来处理。 不过对Node.js来说,概念完全不一样了。使用Node.js时,我们不仅仅在实现一个应用,同时还实现了整个HTTP服务器。事实上,我们的Web应用以及对应的Web服务器基本上是一样的。 基础的HTTP服务器 在你的项目的根目录下创建一个叫server.js的文件,并写入以下代码: varhttp=require('http'); http.createServer(function(request,response){ response.writeHead(200,{'Content-Type':'text/plain'}); response.end('HelloWorld\n'); }).listen(8888); console.log('Serverrunningathttp://127.0.0.1:8888/');复制

  • 颜色

    调色网址:https://www.fontke.com/tool/rgb/01407a/ 光学三元色:红(R),绿(G),蓝(B)   红色(R)   绿色(G)   蓝色(B)   两色混合   黄色(R+G)   青色(G+B)   品红(R+B)   三色混合   白色(R+G+B)   颜色三要素:色相(H),饱和度(S),明度(V) 色相(H),是这个颜色是由那两种颜色混合。   注:通常,软件中所使用的RGB也是由R,G,B三个值组成,每个值的取值范围为0到255的整数,因此RGB能表示的颜色总共有256^3(=16777216)个。           明暗程度   色相(H)是由两元色按一定比例混合后的颜色,例如:   #FF0000(100%,0%,0%,0 )红色   #FF5500(75%,25%,0%,20)   #FFAA00(60%,40%,0%,40)   #FFFF00(50%,50%,0%,60)黄色   #AAFF00(40%,60%,0%

相关推荐

推荐阅读