首页 文章 精选 留言 我的

精选列表

搜索[多分片],共10000篇文章
优秀的个人博客,低调大师

谷歌做了这么多聊天应用能成功吗?

谷歌在2016 I/O开发者大会上发布了Allo和Duo两款聊天应用,由于之前已经拥有Hangouts和Messenger,所以谷歌相当于把该公司的聊天应用数量扩大一倍。 至少目前来看,谷歌计划保留所有产品,不准备放弃或合并其中任何一款。以下是谷歌针对这4款产品各自的特点给出的解释: ——Allo是一款基于手机号码的聊天应用,只能在移动设备上使用,整合了谷歌的多项机器学习、自然语言处理和人工智能技术。谷歌希望用它来测试一款移动聊天应用的极限。 ——Duo是一对一的视频聊天应用,只能在移动设备上使用,得益于WebRTC技术,它的运行速度很快。业内人士认为,这款产品的掉话率很低,甚至可以支持Wi-Fi与蜂窝网络之间的自由切换。 ——Hangouts推出至今已有3年时间,积累了很多功能,包括支持短信和视频通话。它的主要卖点是支持桌面和移动设备之间的跨平台通信。 ——Messegner是谷歌的一款运营商短信服务,也是Android手机中标配的短信应用。该公司借此推广RCS技术,以便Android手机可以提供群聊、IP电话和文件分享的功能。 请不要忘记,Allo和Duo尚未正式推出,它们将于今年夏天正式上市。这些应用都有谷歌的同一个部门管理,这个部门名为通信产品团队,大约成立于一年半之前,由该公司产品管理副总裁尼克·福克斯(Nick Fox)领导。 很多人指出,谷歌还推出了Spaces团体分享应用。但在谷歌眼中,Spaces并不是聊天应用,而是一款与Google+类似的社交应用。 多年以来,谷歌的聊天应用战略一直令人困惑(2013年时,该公司同时提供Google Talk、Hangouts和Google+ Messenger三款服务),现在仍然没有改善。谷歌在这一领域仍然需要进一步发展。与此同时,WhatsApp和FacebookMessenger这是当今全球排名前两位的聊天应用,用户总数分别高达10亿和9亿。 谷歌希望该公司的Hangouts和Messenger也能跻身“10亿用户俱乐部”。 Facebook在这一领域拥有绝对主导地位,而谷歌则需要进一步探索。从头开发一款应用是探索创新的最佳模式。 然而,即便你认为Allo和Duo有种种优势,但谷歌的战略仍然令人困惑。来看看下面两条时隔两年的传闻: 2013年10月——传谷歌Hangouts增加短信功能:向iMessage学习。 2015年12月——传Android版谷歌Hangouts将放弃短信功能。 Hangouts支持了短信,但Messenger于2014年11月发布,所以Hangouts现在或许不会继续支持短信。要不了多久,Allo和Duo也将加入战局。 本文转自d1net(转载)

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

Gradle构建变种(一份源码,多份APK)

需求 一份源码,修改API地址,包名,替换桌面图标和一些其他资源文件,生成不同的APK卖给不同的人。 PS 篇幅略长,但是绝对全是干货 解决方案 为解决这个问题,我经历了以下三个阶段: 1. 需要几份APK就copy几份源码进行修改。 2. 将整个项目作为module来引用。 3. 使用Gradle的Product Flavors来构建变种。 第一种方案:需要几份APK就copy几份源码进行修改 这是早期做Android开发,仍然是EC横行的时候,很痛苦,需要几份就复制几份,开始简单,但是后期维护 却是特别的痛苦。原因是当出现一个BUG的时候需要修改多次,虽然说修改完成一份,后面只需要复制黏贴,但是也是痛苦,可以想象一下,被繁琐的事情缠绕。 第二种方案:将整个项目作为module来引用 这是我接触到了AS,当时考虑的就是将整个项目改造成为module,创建不同的主项目来引用同一份源码,最终改造到一半,不可行,因为要修改大量的代码,比如: 1. ID不再是final类型的了,switch view.id 之类的方法不能再使用。 第三种方案:使用Gradle的Product Flavors来构建变种 前面两种方案简直是让我生不如死,但是随着时间的积累,慢慢的发现出现一种叫做多渠道打包方法,于是我按照这个思路找下去,终于在Google的官方文档中找到了解决方案: 配置构建变体 有兴趣的小伙伴可以直接去看,里面描述了如何去使用。 实践 1.基础配置 1.创建一个普通的空白项目 这一步就不截图了,创建就可以了。 2.在manifest中进行占位符配置 ${APP_ICON} 占位启动图标 ${APP_NAME} 占位app名称 同理,其他第三方需要的相关配置也是可以使用占位符,例如极光相关和友盟相关 <permission android:name="${JPUSH_MESSAGE_VALUE}" android:protectionLevel="signature" /> <meta-data android:name="UMENG_APPKEY" android:value="${UMENG_APPKEY}" /> <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL}" /> 以上的占位符,都可以在gradle中使用其它值来替换。 清单文件配置 在Gradle中对占位符等进行配置 对defaultConfig节点做一些修改,增加manifestPlaceholders字段,来替换manifest中的占位符。为了快速演示,所以就没配置极光和友盟了,都是一样的。 defaultConfig { applicationId "com.aohanyao.product.flavorsdemos" minSdkVersion 18 targetSdkVersion 25 versionCode 1 versionName "1.0" manifestPlaceholders = [APP_ICON: "@mipmap/ic_launcher", APP_NAME: "这是默认的配置"] } 上面的配置将图标改为了ic_launcher,app的名称改为了这是默认的配置,为了保险起见,先直接运行APP,看看有没有更改成功。 ![构建默认的配置](http://upload-images.jianshu.io/upload_images/1760510-29ff843769d475b8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 从上图可以看到,已经直接运行安装成功了,可以证明我们替换占位符是正确的。 2.变种的配置,ProductFlavors配置 在android节点中配置productFlavors节点,将defaultConfig节点复制一份过来,修改一下需要修改的地方,具体如下配置: productFlavors { //变种1 flavorsdemo1 { applicationId "com.aohanyao.product.flavorsdemos.demo1"//修改了包名 minSdkVersion 18 targetSdkVersion 25 versionCode 1 versionName "1.0" manifestPlaceholders = [APP_ICON: "@mipmap/ic_launcher1", APP_NAME: "变种1"] } //变种2 flavorsdemo2 { applicationId "com.aohanyao.product.flavorsdemos.demo2"//修改了包名 minSdkVersion 18 targetSdkVersion 25 versionCode 1 versionName "1.0" manifestPlaceholders = [APP_ICON: "@mipmap/ic_launcher2", APP_NAME: "变种2"] } } 为了方便区分,我增加了ic_launcher1和ic_launcher2两个图标。 详细配置截图: 构建变种配置 在上面的配置中,分别修改了APP的包名,名称以及图标。接下来就是验证是否成功了。只要这这两个都能安装上就算是成功(同样的包名是不能安装在同一台手机上的,当然有种黑科技不算)。配置完成后同步一下。 3.选择构建变体 菜单->Build->Select Build Variant 这时候左下会出现一个窗口,如果Select Build Variant无法选中的话,请先选择app目录。 Select Build Variant 可以看到,在gradle中配置的flavorsdemo1和flavorsdemo2都出现在了了选项中,一个是debug版本,一个是release版本,不用管它,直接选择debug版本就好,选择完成后会重新创建,这里先选择flavorsdemo1Debug,等待build完成后直接运行。安装完成后再选择flavorsdemo2Debug版本,等待build,安装。见证奇迹的时候到了: 构建变种成功安装 可以看到,变种1和变种2都安装成功了,而且图标都不一样。这时候可能会有人问:包名呢?来来,使用ADM来看看正在运行中的程序: 查看两个变种的包名 看,demo1和demo2都在,而且和我们配置的一毛一样呀,看到这里,有没有朋友想到更广泛的用途呢? 到这里,构建变种的基础就算完成,接下来就是配置不同的源码和资源文件。 2.源码配置 业务场景 构建多个APP,那么其中的API的地址肯定是不一样的对吧,我的做法是将API存放在一个全局的常亮类中,那么久可以将它抽取出来,为不同的变种配置不同的地址。 权限控制,页面跳转控制。说的庸俗一点,同一个APP,有一个功能模块A是后来开发的,而前面有些客户没有给这个功能模块A的钱,那肯定是不能给他看的呀,所以可以在一个类中加个flag来控制显示与隐藏功能。 反正呢,就是用来配置少量不同源码,大多数源码是应该写在main下,变种只用来做少量配置。 实践 在这我只实现第一条,一法通百法通,其它都是一样的。 首先要使用project视图,这样才能完全的看到整个项目结构,然后在src下(和main同级)创建和变种名字相同的目录.以下: 构建变种,创建源码目录 创建包 首先在flavorsdemo1和flavorsdemo2下创建java和res文件夹,让后再java目录下创建包,这里创建的包要和main下面的一样,而且flavorsdemo1和flavorsdemo2的目录也必须一致,还有变种中存在的类,main中是不允许存在的。 先看图,再解释: 变种目录结构 三个源码下的包名都是一致的,在变种中增加了global包,并创建了一个全局类 flavorsdemo1 Constant public class Constant { public static final String API_ADDRESS="这是变种1的API地址"; } flavorsdemo2 Constant public class Constant { public static final String API_ADDRESS="这是变种2的API地址"; } 两个类的名字,变量名称都是一样的,只是值不相同,接下来在MainActivity中引用 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.aohanyao.product.flavorsdemos.MainActivity"> <TextView android:id="@+id/tv_api" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </LinearLayout> MainActivity public class MainActivity extends AppCompatActivity { private TextView tvApi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvApi = (TextView) findViewById(R.id.tv_api); tvApi.setText(Constant.API_ADDRESS); } } 直接对Constant.API_ADDRESS进行引用,来,直接启动两个变种吧。 构建变种8-源码配置 图中分别是flavorsdemo1和flavorsdemo1两个变种,可见,显示的都是对应的Constant.API_ADDRESS中的值,看到这里,配置不同源码部分就算是完成,所以应该发散一下思维,这可可以做到很多事情的。 3.资源配置 业务场景 比如,变种一和变种二的某个功能模块相同,但是名字和图标不相同 1. 大量文字变更 2. 大量图标变更 实践 替换字符串资源和图片资源 首先在两个变种的res目录下创建values目录,创建相同的资源文件fd_string.xml,各自创建相同的字符串资源名称。并在MainActivity进行了引用。 构建变种9-配置不同的字符串资源 接下来分别启动两个变种,看看结果 构建变种9-配置不同的字符串资源-结果 很明显,达到了想要的效果。 下一步就是图片资源的替换,和上面一样,创建相应的资源文件夹,放入名称一样,内容不一样的图片,并在MainActivity中引用。 构建变种10-图片资源配置 来看看结果 构建变种10-图片资源配置-结果 至此,利用Gradle构建变种就算是完全完成了。 最后 如果文中有什么不对的地方,欢迎指出! 源码地址 欢迎star 我的简书 来来扫下码,关注一下吧,或者微信搜索AndroidRookie AndroidRookie

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

谷歌 Firebase Cloud Messaging 对多浏览器开放

近日,Google表示,正在将Firebase Cloud Messaging的Web支持扩展到Chrome以外的其他Web浏览器,包括Firefox和Opera。此举,由一个新的JavaScript库启用,将允许开发人员通过浏览器将推送通知从其应用程序发送到终端用户设备。 毫无疑问,通知是非常重要的。操作系统,硬件和应用程序的提供者都希望他们的通知信息丰富,但不引人注意;有用,但可以拒绝。怎么做好这里面的平衡关系,就很重要了。 Google表示,将基于应用的通知引入自己的Chrome浏览器是一个巨大的成功。它声称每天有超过100亿条通知发送到网站。 Chrome是好用的,但在世界各地还有很多其他浏览器可能持有重要的市场份额。 此前,Firebase Cloud Messaging支持通过Android和iOS应用以及通过Chrome发送消息。现在,开发人员可以使用Firebase向大多数支持开放式Push API的浏览器发送通知。这意味着Chrome移动版和桌面版(v50 +),Opera移动版(v37 +),桌面版和移动版的Firefox(v44 +)等都可以使用。不久之后,这个功能还将登录Windows 10 PC上支持Microsoft的Edge浏览器,以及三星手机的原生浏览器。 Google表示FCM JavaScript库拥有处理复杂的服务器端功能,例如有效载荷加密和service workers。开发者愿意的话,可以使用默认的service worker,也可以用谷歌的来替换。更重要的是,谷歌还透露,使用FCM API的开发者,可以在不改变服务器设置的情况下,让谷歌管理有效载荷加密。 FCM JavaScript库提供了大量的自定义和微调功能。例如,开发者可以定位单一的设备,主题或群组。此外,对特定主题感兴趣的Android,iOS和Web用户可以选择通过Web接收基于主题的通知,从而使开发人员有更多的能力接触潜在的最终用户。这需要使用服务器端API。 Google认为吸引用户和发现他们喜欢的内容类型应该排在第一位。 Web通知的技术方面是一个开始,但不应该滥用。请注意,最终需要由用户自己来选择接收任何类型的通知。 文章转载自 开源中国社区 [http://www.oschina.net]

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

从零用 Java 实现小红书 SpringBoot Vue UniApp(23)笔记话题多对多:一条笔记进多个话题池

前言早期实现里,一篇笔记只挂一个 topic_id:运营在后台改话题、用户在发现页按话题筛,都够用。但真实社区里常见 同一篇笔记同时出现在「穿搭」和「好物分享」 两个话题池——单字段就卡住了。在不破坏旧数据的前提下,增加关联表 member_note_topic_rel,主话题仍写 member_note.topic_id(取多选列表第一个),其余话题走关联表;管理端笔记表单支持 多选话题,发现流按关联表过滤。

资源下载

更多资源
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部分的功能。

用户登录
用户注册