关于android-studio:Android-Studio如何修改JDK版本和获知使用的Java版本

嗨,各位小伙伴们,我是你们的好敌人咕噜铁蛋!明天,咱们要来聊一聊对于《Android Studio如何批改JDK版本和获知应用的Java版本》这个话题。把握如何批改JDK版本以及理解以后应用的Java版本是十分重要的一项技能,它将帮忙咱们更好地进行Android利用开发。什么是JDK和Java版本?首先,让咱们简略理解一下什么是JDK和Java版本。JDK(Java Development Kit)是Java开发工具包的缩写,它蕴含了Java的运行环境(JRE)和开发工具,用于开发Java应用程序。而Java版本是指Java编程语言的不同版本,每个版本都会有一些新的个性和改良。Android Studio中如何批改JDK版本?在Android Studio中,咱们能够通过以下步骤来批改JDK版本: 关上Android Studio,点击菜单栏中的“File” -> “Project Structure”。在弹出的窗口中,抉择“SDK Location”选项卡。在该选项卡中,找到“JDK location”一栏,点击旁边的“…”按钮。在弹出的窗口中,抉择新的JDK门路,而后点击“OK”保留设置。重新启动Android Studio,使批改失效。通过以上步骤,咱们就能够轻松地批改Android Studio中应用的JDK版本,以便更好地适配咱们的开发需要。如何获知以后应用的Java版本?在Android Studio中,咱们能够通过以下形式来查看以后应用的Java版本:关上Android Studio,在菜单栏中抉择“Help” -> “About”。在弹出的对话框中,能够看到“About Android Studio”页面上列出了以后应用的Java版本信息。通过查看这些信息,咱们能够分明地理解以后Android Studio所应用的Java版本,以便咱们进行相应的调整和优化。为什么要关注JDK版本和Java版本?关注JDK版本和Java版本的抉择是十分重要的,因为不同的版本可能会有不同的个性和兼容性。抉择适合的JDK版本能够帮忙咱们更好地开发和调试Android利用,进步开发效率和代码品质。同时,理解以后应用的Java版本能够帮忙咱们及时更新和优化开发环境,放弃利用的稳定性和性能。总的来说,把握如何批改JDK版本和获知以后应用的Java版本是Android开发者必备的技能之一。通过本文的介绍,心愿可能帮忙大家更好地了解和利用这些常识,晋升本人在Android利用开发畛域的能力和程度。如果有任何问题或倡议,欢送在评论区留言,咱们一起学习提高!感激大家的浏览,咱们下期再见!

March 4, 2024 · 1 min · jiezi

关于android-studio:Android-studio-下的APK打包失败问题解决办法

嗨,各位小伙伴们,我是你们的好敌人咕噜铁蛋!作为挪动利用开发者,在应用Android Studio进行APK打包时,有时候可能会遇到各种问题导致打包失败,这给咱们的开发工作带来了肯定的挑战。明天,我将和大家分享一些解决Android Studio下APK打包失败问题的妙招,心愿可能帮忙到正在遇到困难的开发者们,让你的开发之路更加畅通!一、查看Gradle配置首先,当遇到APK打包失败的状况时,咱们能够先查看Gradle配置是否正确。确保Gradle插件版本、依赖库版本等都是最新的,并且与我的项目中的代码兼容。有时候,因为Gradle配置不正确导致打包失败是很常见的状况。二、清理我的项目缓存有时候,我的项目中的缓存文件可能会导致APK打包失败。咱们能够尝试清理我的项目缓存,包含删除build文件夹、革除Gradle缓存等操作,而后从新构建我的项目进行打包。三、查看代码问题打包失败还可能是因为代码中存在一些问题,比方语法错误、依赖库抵触等。咱们能够通过查看Android Studio的Build日志来定位具体的错误信息,而后针对性地批改代码或者解决依赖库抵触问题。四、减少内存和堆栈大小有时候,APK打包失败也可能是因为内存不足或者堆栈大小设置不合理导致的。咱们能够尝试减少Android Studio的内存和堆栈大小,以进步打包过程的稳定性和效率。五、应用命令行打包如果在Android Studio中无奈解决APK打包失败的问题,咱们还能够尝试应用命令行工具进行打包。通过命令行能够更加灵便地管制打包过程,有时候可能躲避一些Android Studio中的打包问题。六、更新Android Studio版本最初,如果以上办法都无奈解决问题,咱们能够思考更新Android Studio版本。新版本的Android Studio通常会修复一些Bug和优化打包流程,有可能可能解决咱们遇到的问题。要解决Android Studio下APK打包失败的问题并不难,关键在于咱们要急躁排查问题、寻找解决办法。心愿明天分享的这些妙招能帮忙到正在遇到困难的开发者们。如果你有其余解决办法或者遇到其余技术问题,欢送留言给我,咱们一起交流学习吧!感激大家的浏览,咱们下期再见!

February 24, 2024 · 1 min · jiezi

关于android-studio:App-Store上架流程苹果app发布流程

第一步:领有本人的苹果开发者账号:开发账号分为两类:99美元(公布App Store用的,也就是上架苹果商店用这个);299美元(企业授信证书,不必上架appstore 亦可应用。弊病:证书容易被封,证书包月在500元左右)开发申请详情见链接:第二步:创立相干证书和配置文件:一、理解相干证书之间的区别:登录开发者账号:https://developer.apple.com/account/overview.action进入该页面,左侧一栏是相干证书栏目: Certificates: 证书,罕用的证书类型有4种:真机调试证书、推送调试证书,公布证书、推送生产证书。Identifiers: App ID,跟我的项目工程的 Bundle Identifier(也就是bundle id),此id是app的惟一的辨认符。Devices: iOS设施在真机调试、AdHoc公布时都须要蕴含设施的UDID才能够装置。Provisioning Profiles: 配置文件(形容文件),不同类型的开发者账号都蕴含 Development、AdHoc 这两种 Profile,不同的是集体、公司开发者账号有公布到 App Store 的 Profile,而企业开发者账号则是 InHouse 企业内公布的 Profile。 建证书(Certificates):创立证书文件: 创立证书申请文件(必须应用Mac电脑):关上后,抉择 钥匙串拜访--证书助理--从证书颁发机构申请证书,如下图所示:填写好证书信息,保留该证书。留神:用户电子邮件地址是必填项,ca电子邮件地址是选填项,罕用名默认呈现的能够不必填;申请是:抉择“存储到磁盘”,存储到电脑桌面上,不便是一个。点击“持续”,抉择存储该证书的地位,即可生成证书申请文件,如下图所示: 后盾生成相干证书:开始创立证书: 开始创立证书:在开发者账号的证书栏目下,点击右上角的“创立证书”按钮。抉择“公布到 App Store”,并填写好相干信息,如下图所示:证书有两大类,开发证书(Development,也称为调试证书)和公布证书(Production)上架配置这个证书。罕用的有以下几种:① iOS App Development:真机调试证书。② Apple Push Notification service SSL (Sandbox

April 28, 2023 · 1 min · jiezi

关于android-studio:YonBuilder移动开发移动原生插件开发环境配置教程

YonBuilder挪动开发能够实现一套代码,多端生成,疾速构建企业级挪动利用。挪动插件市场中有许多性能插件,可增加到利用中应用,进步开发效率。如果插件市场中没有满足需要的插件,能够用平台提供的插件开发sdk进行定制插件的开发。本文介绍挪动插件开发环境的搭建。 1.  Android  studio 下载安装     从官网下载最新版本。下载地址: https://developer.android.google.cn/studio/     下载后,双击安装包进行装置,按疏导装置实现即可。 2.  Android SDK 下载     关上Android studio, 菜单栏找到偏好设置选项,如下图:      关上偏好设置界面后,在搜寻框输出SDK, Android SDK Location 处抉择sdk 要下载的目录,能够先在电脑磁盘上新建一个目录。SDK Platforms  处选中Android 11.0 。 SDK  Tools  栏下选中 30.0.0  和 30.0.2  。点击OK 开始下载。 3.  插件开发SDK 下载,并用Android studio 关上。      下载地址:https://developer.yonyou.com/developer/documentCenter#download           把下载的插件开发SDK 压缩包解压: 上图红框标注局部是一个残缺的Android 我的项目,能够导入Android studio 。 在Android studio 顶部菜单 File 找到导入我的项目,选中上图AndroidPluginDevSDK_androidStudio 文件夹即可。  ...

March 14, 2023 · 1 min · jiezi

关于android-studio:Android-Studio-Gradle编译输出信息乱码

有时候Android Studio Gradle编译时输入的信息是乱码,这是因为输入信息和信息的窗口不对立。首先,咱们先批改设置里的文件编码 Settings->Editor->File Encodings关上都改成UTF-8 办法一Android Studio help 菜单中“Edit Custom VM Options” 增加如下代码 -Dfile.encoding=UTF-8增加后从新编译工程,如果还是乱码,须要敞开Android Studio重新启动无效。 办法二在对应的module的build.gradle 中增加如下代码 tasks.withType(JavaCompile) { options.encoding = "UTF-8"}毛病是如果module比拟多就挺麻烦 办法三减少环境变量关上电脑高级设置在环境变量中减少一个GRADLE_OPTS,值为-Dfile.encoding=UTF-8,记得保留留神:保留实现后,如果还是乱码,须要敞开Android Studio 重新启动无效

December 14, 2022 · 1 min · jiezi

关于android-studio:如何实现数据库读一致性

1 导读 数据的一致性是数据精确的重要指标,那如何实现数据的一致性呢?本文从事务个性和事务级别的角度和大家一起学习如何实现数据的读写一致性。2 一致性 1.数据的一致性:通常指关联数据之间的逻辑关系是否正确和残缺。 举个例子:某零碎实现读写拆散,读数据库是写数据库的备份库,小李在零碎中之前录入的学历信息是高中,通过小李努力学习,胜利取得了本科学位。小李及时把信息变成成了本科,可是因为明天零碎备份工夫较长,小李变更信息时,数据曾经开始备份。公司的HR通过零碎查问小李信息时,发现还是本科,小李的申请被驳回。这就是数据不统一问题。 2.数据库的一致性:是指数据库从一个一致性状态变到另一个一致性状态。这是事务的一致性的定义。 举个例子:仓库中商品A有100件,门店中商品A有10件。上午10点,仓库发送商品A50件到门店,最初仓库中有商品A50件,门店有商品A60件,这样商品的总是是不变的。不能门店收到货后,仓库的商品A还是100件,这样就呈现数据库不统一问题。仓库和门店商品A的总数是110才是正确的,这就是数据库的一致性。3 数据库事务 数据库事务( transaction)是拜访并可能操作各种数据项的一个数据库操作序列,这些操作要么全副执行,要么全副不执行,是一个不可分割的工作单位。事务由事务开始与事务完结之间执行的全副数据库操作组成。 事务的性质:https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...https://weibo.com/a/hot/76279...

September 27, 2022 · 1 min · jiezi

关于android-studio:秒验丨Android客户端集成指南

开发工具:Android Studio 集成形式:Gradle在线集成 安卓版本反对:minSdkVersion 19 集成前筹备注册账号应用秒验SDK之前,须要先在MobTech官网注册开发者账号并注册利用获取Mob提供的AppKey和AppSecret,详情能够点击查看创立利用流程 提交审核一键登录是运营商提供的能力,在应用秒验SDK之前,您须要在Mob开发者后盾提交秒验审核,详情能够点击查看秒验审核流程 秒验SDK流程图 增加配置在我的项目Gradle文件中注册MobSDK buildscript { repositories { // 1.增加MobSDK Maven地址 maven { url "https://mvn.mob.com/android" } ... } dependencies { ... // 2.注册MobSDK classpath "com.mob.sdk:MobSDK:2018.0319.1724" }} 在我的项目App Module的Gradle文件中增加插件和扩大 apply plugin: 'com.mob.sdk'MobSDK { appKey "您的appkey" appSecret "您的appsecret" SecVerify {}}在gradle.properties中增加代码MobSDK.spEdition=FP AndroidManifest 增加配置(3.1.2版本必须配置) <activity android:name="com.mob.tools.MobUIShell" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="standard"/>增加混同代码SecVerify曾经做了混同解决,再次混同会导致不可预期的谬误,请在您的混同脚本中增加如下的配置,跳过对SecVerify的混同操作: -ignorewarnings#敞开某个运营商性能时编译通不过能够加上上面的代码#-dontpreverify# for SecVerify-keep class com.mob.**{*;}# for CTCC-keep class cn.com.chinatelecom.account.**{*;}-keep class cn.com.chinatelecom.account.api.ClientUtils{*;}# for CUCC-keep class com.sdk.**{*;}# for CMCC-keep class com.cmic.sso.sdk.**{*;}-keep class com.unicom.xiaowo.account.shield.**{*;}另如有用到AndResGuard混同资源问题,请在whiteList中增加如下混同配置: ...

August 17, 2022 · 1 min · jiezi

关于android-studio:京东云分布式链路追踪在金融场景的最佳实践

微服务是近几年最风行的软件架构设计理念,和容器、devops一起形成了云原生的技术根底。微服务源于对产品疾速交付的市场诉求,通过采取一系列的自动化测试、继续集成等麻利开发实际,激活了组织效率,也加强了软件的可复用性,无形中为中台化演进铺平了路线,大量国内外互联网公司因而取得了技术红利。 然而很多企业在引入微服务架构后,并没有达到预期成果。热力学第二定律通知咱们,一个孤立零碎肯定会向熵增的方向,也就是越来越简单的方向演进。服务划分过细,单个服务的复杂度升高了,整个零碎的复杂度却指数级回升。实践上计算,n个服务的复杂度是n×(n-1)/2,微服务将零碎内的复杂度转移为零碎间的复杂度,因而团队陷入混沌,反倒拖慢了交付速度。 如何解决“熵增”的窘境,真正享受微服务带来的红利呢?一方面须要通过一系列devops工具和办法使组织架构匹配软件架构,使新技术为我所用而不是成为工具的奴隶;另一方面则须要在运维畛域引入上帝视角,即分布式全链路追踪技术,齐全掌控微服务间的调用关系。 京东云SGM(Service Governance And Monitoring)产品承载了京东每天万亿级别的调用链数据分析和查问,护航双十一和618大促流量,让每一笔交易有迹可循,每一个故障无处遁形,具备极高的稳定性和极低的资源耗费。金融业始终是引入IT技术的急先锋,京东云将SGM产品和实际输入给业界大量银行和消金公司,赋能金融业数字化转型,获得了很好的成果,然而咱们也发现局部客户的应用成果不够顺畅,究其原因,一方面是受限于用户技术环境,特地是传统金融客户,其技术栈偏差单体利用,关闭的商业软件产品较多,客户本身对产品利用的掌控度比拟低,反观在偏互联网技术栈的生产金融畛域,利用成果则绝对比拟好。除技术环境的制约因素外,另外一方面因素在于组织内是否具备构建全套监控体系的根底能力和对整个监控体系的认知水平,任何监控产品解决的是监控体系的一个方面,而不是全副,所有繁多监控产品都存在盲点和局限性,就比方心愿NPM(Network Performance Monitor)监控能达到APM(Application Performance Monitor)利用级监控的灵活性一样,这是不事实的。 在技术交融的背景下,京东云和某头部生产金融公司单干,在生产金融畛域发展了云原生和全链路追踪的最佳实际。某生产金融公司是一家持牌生产金融机构,其普惠金融APP产品注册人数过亿,后端通过风控、智能客服等重量级业务零碎进行撑持。前端用户活跃度高,流量大,APP服务端和后端各类业务零碎数量泛滥、场景简单,整个零碎经营与技术运维团队压力很大。 在任何组织里,监控应该是一项综合立体化的、体系化的大平台,须要多种监控工具的合作。SGM全链路监控零碎在整个监控体系占据两头偏差下层业务监控的地位,发力点是利用级性能监控、服务调用关系的监控、流量监控,次要特色是面向服务接口和办法,扩大点是基于办法监控实现多维度的业务监控,底层还须要有零碎级的监控,根底主机监控、网络监控、数据库监控(偏物理资源和数据库自身治理维度)、日志监控零碎等组件的配合,将粗粒度监控和细粒度监控相结合,自上而下把被监控对象组织起来。很多用户不能齐全利用好SGM产品,往往存在监控盲点,而某消金公司自建了一套FASTX根底监控体系,交融了根底网络、主机、设施层的监控和告警模块,同时也基于开源框架Pinpoint二次开发搭建一套全链路监控零碎,实现了利用级的链路监控。但受制于Pinpoint性能损耗大、监控范畴较窄、监控粒度太粗、不能灵便启停监控项、短少丰盛的监控指标和业务监控体系,pinpoint利用监控获得的成果不是很现实。 第一步:对接管控,体验统一 消金公司有独立的告警通道治理,用户/利用/设施的根底信息平台NCMDB、AD域控等管理系统,新产品须要交融到这个环境里。SGM的认证模块及告警模块具备可插拔个性,通过OPEN API实现对接,实现用户治理与认证体系、告警体系与SGM产品深度协同,磨平零碎间差别,造成对立的应用环境。业务利用方的接入门槛升高了,根底用户和告警交融到现有技术体系,保障一致性的应用体验。 第二步:分批接入,疾速奏效 消金公司外部利用较多,单方依据利用技术框架特点进行分级、分批次接入。SGM对业务利用代码没有任何侵入革新,接入简略,适配了常见的开源技术框架,经梳理后分三批接入。 ● 第一批以面向C端的APP利用为主,后端服务基本上都是JAVA SpringCloud技术体系的利用,监控项是app后端服务,对响应工夫和用户体验较为敏感,优先接入。● 第二批以根底服务类零碎为主,Java为主。● 第三批当前端业务管理类的大型利用、大数据利用为主,Java、Python共存,逐渐随同零碎迭代节奏陆续上线。 获得成果: ● 一周内实现第一批零碎的接入和生产环境的上线。● 一个月实现了70%的利用接入。● 三个月实现大部分的利用接入,整体接入利用数量靠近700个,实时监控的办法数量达到6.6万个,平峰监控TPS达到 16W,后期接入工夫管制比拟现实,接入老本较低,实现了管理层预期的监控治理指标。 第三步:抓住痛点,劣势冲破 新产品在推广初期比拟艰巨,业务方的排挤和现有习惯的扭转都是推广的阻力,尤其在外部还存在可用的自研链路监控零碎的状况下。 SGM产品自身的性能项十分多,在初期没有必要全面铺开,所以针对某消金公司已有pinpoint链路监控零碎的特点,举荐给业务方一个最佳性能应用路线,通过两轮专场培训辅导业务方实现利用-服务-办法-实例四层细粒度的监控体系,确定要害办法的返回码和自定义业务字段,构建可用的业务成功率观测指标,帮助业务方关注重点告警项和告警策略。 SGM产品在业务方接入后,无需过多的人工配置就疾速为业务方实现利用-服务-办法-实例四层细粒度的监控体系,同时疏导业务梳理要害进去须要被监控的外围办法,通过观测业务成功率指标,顺利引入到调用查问、调用链路、耗时剖析、日志联动查问这条SGM外围性能主线上。这在SGM产品导入后期,起着至关重要的作用,利用的接收和宽泛的应用积淀下来无效的数据,促使着监控零碎衰弱运行,很顺利也很安稳地度过了SGM这个新事物染指期最艰难的时刻,为后续深刻利用奠定了松软的根底。 第四步:循序渐进,全面推广 实现第一阶段初步推广和被业务方接收后,如何让业务方、监控团队、零碎运维团队在同一个监控平台取得更大的收益?单方团队协商了推广思路,立足于深度利用,充沛开掘体现监控数据的价值点,从开发视角、利用运维视角、利用经营分层指标监控、大屏态势感知等更深刻应用的方向制订推广策略,造成可落地执行的计划全面推广SGM监控。 用户在深度应用过程中取得良好的收益和正向反馈,同时贴合消金公司的业务场景和技术特点,向咱们SGM产品团队反馈了几个问题点,包含在京东外部场景未遇到的Kafka JMXClient抵触问题、Tomcat Request信息经验Recycle后提取自定义业务字段生效的问题,促使SGM产品与客户独特成长,在更多金融场景中千锤百炼更加欠缺。 在长期服务外部利用与内部客户的过程中,咱们总结了分布式链路追踪的几个最佳实际场景,用上帝视角鸟瞰全局,充分发挥微服务架构的麻利威力: 一、面向研发排障的问题解决 1.典型问题:如何精准定位故障? 业务利用性能问题频发、流量稳定频繁、突发异样排查过程艰难,故障暴发时的现场环境没有快照,预先只能依赖系统日志和团队成员技能进行排查,没有一套卓有成效,可反复利用的剖析套路和技术撑持伎俩,对于谋求服务SLA保障能力的消金公司技术团队来说,如何精准定位问题,缩短排查问题的工夫,是个微小的考验。 解决方案:得益于SGM全链路监控零碎实时日志的采集能力和高效的解决能力,在利用被监控办法产生异样之初,会通过SGM内置的告警模块将告警信息及时推送到业务利用相干方,告警将提醒利用的办法耗时、均匀响应工夫、频率频次、JVM监控以及多维度的TP9XX/AVG/MAX系列性能指标,同时告警信息将相干的排查线索入口组织到一起,不便业务工程师染指排查。通过告警入口串联起SGM提供的一系列排查工具,调用查问、耗时详情、调用链、拓扑图谱、拓扑调用链性能散布、JVMGC剖析、网络连接、JVM内存工具箱等,整个排查过程顺畅,操作简略又无效。 成果:通过内置到SGM的功能模块造成一套标准化的排查步骤和工具集,贴合被动告警模块,由SGM聚合一系列排查问题的小工具,疾速还原问题现场,无效地辅助研发精准定位问题,疾速排查问题。  2.典型问题:如何解决底层IO级别的问题? 利用零碎在运行过程中,经常出现底层IO级别的谬误,包含关系型数据库,NoSQL数据库、缓存、Logger框架、MQ框架等,高频呈现的问题常常混淆在日志文件里,容易被疏忽最终导致生产事变。 解决方案:疏导用户用好SGM告警模块,SGM一站式内置底层IO各类异样的探测规定和阈值,利用接入即享有规范的探测告警能力,从容应对生产零碎的异样。 成果:对底层IO类型的问题进行独自解决,晋升告警等级,帮忙业务利用建设起分层监控的认知体系,辨认问题源头,及时优化告警策略,变被动为被动,进步底层IO问题的预警与解决能力,联合SGM排查问题工具箱疾速处理。 3.典型问题:如何剖析服务耗时? 在微服务架构体系下,调用耗时散布如何监测是一个难点,除了服务自身的开销外,网络开销、跨机房延时、网络丢包、服务端线程池阻塞、服务链路的熔断、限流等措施的影响、服务端GC影响、客户端GC的影响,都形成整个分布式调用的开销,某消金公司技术架构以spring cloud微服务为主,服务调用耗时散布以及呈现问题时如何疾速断定异样服务的归属是技术团队最为关注的问题。 解决方案:通过协同底层主机监控和SGM的链路跟踪,造成了全局视角的调用耗时监控,实现了针对微服务时代跨主通信模式服务耗时的精准统计和问题定位。SGM提供利用、服务、办法、实例等多种级别的监控,同时基于每笔调用能够反查调用起源,追踪上下游的服务状态,观测服务性能稳定的曲线,及时锁定问题服务,协调服务归属方进行联结问题排查。 成果:通过SGM产品能够清晰取得服务间依赖关系的信息,精准把握服务调用耗时散布状况,对于消金公司团队来说,疾速理清了业务依赖,定位问题服务,疾速协同上下游服务一起排查问题,简略又高效。 二、面向架构治理的问题解决 4.典型问题:如何利用运行态数据进行服务治理? 业务疾速迅猛,一直有新利用呈现,理论运行态的服务运行状态可能曾经偏离过后的架构布局,传统形式是基于架构文档进行服务治理,在迭代节奏放慢,变更频繁的现状下,如何疾速发现服务依赖问题,并且依靠最实在的运行态数据进行服务治理?是消金公司团队最为关怀的内容。 解决方案:SGM产品给出的答案就是基于利用零碎实时采集的日志,用监控日志数据辅助服务治理,深刻利用调用全链路的泛滥信息造成分层的全局视图,裸露服务间实在的调用关系、调用频率、调用强度、上下游流量稳定状态,SGM提供了调用全链路剖析性能和分层下钻、上钻,调用起源剖析、调用拓扑、拓扑性能监测、实时调用拓扑图等工具集,重点破解服务瓶颈点,拆解不合理的服务模块,组合处于扩散游离的服务,一直摸索调整,并及时观测变更数据再优化的新模式。 成果:在消金公司外部服务治理场景失去一直的深刻利用,且技术团队在继续摸索中造成一个无效的治理思路和计划,在SGM根底上二次开发SRE业务级指标评估零碎,该零碎基于SGM产品的各类监控数据,无效监测各个利用的服务状态和业务指标,从数据使用上满足了公司管理层对技术可视化水平晋升的要求。 5.典型问题:如何评估可用率、失败率? 如何评估利用的衰弱状态、业务成功率和零碎可用率?某消金公司外部大部分利用都是通过申请的状态码来判断业务是否失常,粒度比拟粗,无奈准确识别方法级别,各个利用对业务衰弱识别方法了解也不统一,如何统一口径,屏蔽差别成为架构治理的一个重要课题。 解决方案:构建对立可信的可用率与失败率(成功率)监测体系,SGM产品默认提供一套惯例识别码标准用来标记被监控对象的衰弱度,同时也提供了业务自定义规定的入口。SGM具备全局、利用级、办法级的三层识别码机制,通过对利用运行态的调用链进行实时监测,开掘执行过程突发异样信息,造成零碎实时可用率监测后果。基于对立的后果标记,屏蔽了具体方法返回码的差异性,利用办法级返回码的动静监控后果,联结可用率指标独特构建起办法级别、服务级别、利用级别、实例级别、机房级别等五个维度的利用成功率检测体系。消金公司技术团队能够通过成功率和可用率来主观评估利用的实时衰弱状态,通过返回码分类监控观测业务运行是否合乎预期指标。在SGM产品中,除了失败率、可用率指标,同时附加性能指标稳定变动的数据、日志和容量的数据,构建一个多维的、面向利用的综合衰弱度评估指标体系。 成果:在某消金公司的实际中,各个业务方对利用衰弱度的了解和对被监测的办法、返回码的定义标准化定义过程经验了从凌乱、接收治理到清晰有序的进化历程。深刻理解办法监控和返回码标识的精华是SGM产品在消金公司落地宽泛的良好支撑点。 ...

July 21, 2022 · 1 min · jiezi

关于android-studio:Android-Studio-Bumblebee-202111-稳定版正式发布

作者 / Android 产品经理 Adarsh Fernando 就像怠惰的小蜜蜂一样,Android Studio 团队始终忙于 Android Studio Bumblebee (2021.1.1) 和 Android Gradle 插件 (AGP) 7.1.0 的稳定版,即最新版 Android 官网 IDE 和构建零碎的相干工作。咱们已针对泛滥典型开发工作流中波及的性能进行了改良: 包含 构建和部署、剖析和查看,以及 设计。 一些值得注意的新增性能包含: Android Studio 和您的继续集成 (CI) 服务器之间的对立测试作业 ✅、便捷的配对流程 (通过 Wi-Fi 即可连贯 ADB)、通过改良的性能分析工具以帮忙您辨认和剖析利用中的卡顿 ️,以及无需将利用部署到设施即可预览动画 和界面互动。 像平常一样,如果没有预览版用户的晚期反馈,就不会有这个稳定版。请持续浏览本文或观看 这个视频,以进一步理解此稳定版的亮点和新性能。欢送大家返回官方网站下载 Android Studio Bumblebee (2021.1.1) 亲自上手体验。 Android Studio Bumblebee (2021.1.1) 的新增性能以下是按三大主题整顿的 Android Studio Bumblebee (2021.1.1) 新增性能残缺清单。 构建和部署 全新的设施管理器 (Device Manager) - 您可应用 Bumblebee 的这个新工具窗口更轻松地查看和治理虚构和实体测试设施。只需通过主菜单抉择 视图 (View) > 工具窗口 (Tool Windows) > 设施管理器 (Device Manager) 即可应用。您可在 虚构 (Virtual) 标签页中创立新设施、查看设施详细信息、删除设施或执行您过来在 AVD 管理器 (AVD Manager,现已删除) 中执行的任何其余操作。您可在 实体 (Physical) 标签页中,应用 ADB Wi-Fi 疾速与新设施配对,并高深莫测地查看每个实体设施的详细信息,或应用 设施文件浏览器 (Device File Explorer),微微一点,疾速查看每个设施的文件系统。请返回 版本阐明 具体理解全新的设施管理器。 ...

February 24, 2022 · 3 min · jiezi

关于android-studio:Android-Studio-对现代-WorkManager-的支持

在 上一篇文章 中,咱们提到了古代 WorkManager API 对工具反对方面也进行了改良,本文咱们将结合实际案例来看看具体有哪些改良。如果您更喜爱通过视频理解此内容,请在此处查看: https://www.bilibili.com/vide... △ Android Studio 对古代 WorkManager 的反对 从 Android Studio Arctic Fox 开始,您能够间接 在 Android Studio 内应用后台任务查看器检查和调试 Worker。 后台任务查看器是利用查看套件的一部分,它针对利用的几个方面提供更丰盛具体的信息。为了充分利用查看器,您的利用须要应用 WorkManager 2.5 或更新的版本。 利用查看器启用办法首次关上利用查看器的最快办法是: 间断按两下 "Shift" 键,而后在弹出对话框中输出 App Inspection 并按回车键确认。您也能够从菜单栏顺次抉择: View → Tool Window → App Inspection 来关上利用查看器面板。 △ 关上 App Inspection 面板 示例演示本次演示应用了 Android Studio Bumblebee 和 GitHub 上公开的 WorkManager 示例。 在 App Inspection 面板中切换到后台任务查看器 (Background Task Inspector) 标签,勾选利用中的 Filter,而后点击 Apply 按钮。能够看到在随着过滤的继续进行,每个 Worker 在其生命周期中的状态也在继续变动着。因为这些 Worker 依照程序运行,所以 CleanupWorker 须要在下一个 Worker 开始之前实现。其余的所有 Worker 此时要么处于排队状态,要么处于阻塞状态。 ...

February 22, 2022 · 1 min · jiezi

关于android-studio:android生命周期

前言android与angular有很多相似之处。正所谓学会了一门语言,其余语言都是相似的。 Activity 生命周期咱们能够将android中的activity类比于angular中的组件与组件的生命周期相似,activity中也有很多状态,在这些状态产生变更时会回调函数。Activity类提供六个外围回调:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。而咱们发明的每一个本人的activity都会继承Activity类,咱们能够笼罩这些办法。 onCreate()onCreate()办法会在activity创立时触发,用于进行初始化设置。咱们必须实现此办法,他会进行创立视图工作。他会传递一个Bundle参数,提供之前保留的活动状态。 onStart()此时Activity曾经可见了,然而还没呈现在前台,咱们还看不到,无奈与Activity交互。如果Activity变得可见,零碎接下来会调用onResume()办法,如果Activity变得不可见,接下来会调用onStop()办法。 onStop()此时Activity曾经不可见了,然而Activity对象还在内存中,没有被销毁。例如,当新启动的 Activity 笼罩整个屏幕时,可能会产生这种状况。如果流动再次可见,接下来会调用onRestart()办法。 onResume()Activity在前台时,会调用此办法。利用会始终放弃这种状态,直到某些事件产生,让焦点远离利用。此类事件包含接到复电、用户导航到另一个Activity,或设施屏幕敞开。 onPause()此办法示意Activity不再位于前台。这个办法实现之前,不会持续运行下一个流动,如果流动返回到前台,接下来会调用onResume(),如果流动变得不可见,接下来会调用onStop()。 onDestroy()Activity将要完结(用户敞开Activity),或者配置变更(如旋转屏幕),零碎将要销毁流动。 保留Activity状态比如说旋转屏幕时,将会触发Activity的onDestroy()办法并从新加载Activity,如果咱们想要保留Activity的状态,咱们须要用到onSaveInstanceState()办法,他会在onDestroy()办法之前被调用。 @Overridepublic void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("seconds", seconds); savedInstanceState.putBoolean("running", running); savedInstanceState.putBoolean("wasRunning", wasRunning);}Bundle类型相似于容器,外面保留着键值对,咱们往参数外面put键值,在onCreate()办法里可通过键获取值。 @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { seconds = savedInstanceState.getInt("seconds"); running = savedInstanceState.getBoolean("running"); wasRunning = savedInstanceState.getBoolean("wasRunning"); }}

February 20, 2022 · 1 min · jiezi

关于android-studio:解决AndroidStudio第一次运行出现some-licences-have-not-been-accepted

Failed to install the following Android SDK packages as some licences have not been accepted. 运行环境:Android Studio 2021.1Apple M1 arm64MacOS Menterey报错信息:Failed to install the following Android SDK packages as some licences have not been accepted. build-tools;30.0.3 Android SDK Build-Tools 30.0.3To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.htmlUsing Android SDK: /Users/lyx/Library/Android/sdk遇到问题马上翻译: ...

February 17, 2022 · 1 min · jiezi

关于android-studio:20220126RecyclerView上拉和下拉

RecyclerView上拉和下拉最近为了写一个繁难的多选列表性能,应用了RecyclerView,发现如果数据太多的话会产生卡顿,所以决定应用分页,也就是大家常见的上拉加载数据,也有下拉刷新数据,咱们这里应用滚动事件addOnScrollListener来实现这个性能。上拉加载在RecyclerView上增加监听事件 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); }});当咱们无奈上拉当前,以及松开手指当前,触发数据加载 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // canScrollVertically参数是1是无奈上拉 if (!recyclerView.canScrollVertically(1) && newState == RecyclerView.SCROLL_STATE_IDLE) { // 实现数据加载 } }});下拉刷新原理跟上拉一样,只是判断无奈下拉后,刷新数据 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // canScrollVertically参数是-1是无奈上拉 if (!recyclerView.canScrollVertically(-1) && newState == RecyclerView.SCROLL_STATE_IDLE) { // 实现数据加载 } }});

January 26, 2022 · 1 min · jiezi

关于android-studio:Android-Studio-新特性详解

在 2021 年早些时候举办的 Google I/O 大会上,咱们具体介绍了 Android Studio Arctic Fox 的次要性能,该版本目前曾经位于 稳定版 的公布渠道供大家下载应用。Android Studio Arctic Fox 次要聚焦于以下三个方面的改良: 设计 : Arctic Fox 是首个蕴含 Jetpack Compose 的反对工具及大量设计工具和查看器的稳固版本,从而让您能够更轻松地创立和预览界面。Android 设施反对 : Arctic Fox 蕴含大量针对 Android 设施的性能,如 Wear OS 上的心率传感器,以及反对 Google TV 的新版 Android TV 模拟器等性能。开发效率改良 : 咱们对 Android Studio 的底层进行了改良,同时也带来了 WorkManager 工具,以帮忙开发者进步开发效率。您可能曾经留神到,Arctic Fox 的继任者 Android Studio BumbleBee 目前曾经能够在 Beta 版 公布渠道下载应用了。咱们在这个版本退出了许多激动人心的改良,包含首次反对了 Material You、进一步优化了 Jetpack Compose 工具以及更多的开发效率改良,您还能够通过 BumbleBee 针对应用了 Android 12L 的大屏设施缩放您的利用。接下来,咱们将会为您具体介绍此版本的代表性能与改良,并带您一窥咱们为将来版本的 Android Studio 所开发的最新性能。 ...

January 18, 2022 · 3 min · jiezi

关于android-studio:flutter文章测试

测试文章呀 本文由博客一文多发平台 OpenWrite 公布!

June 26, 2021 · 1 min · jiezi

关于android-studio:Android-Studio-Arctic-Fox-202031-Beta-版发布

△ Android Studio Arctic Fox 启动画面 作者 / Paris Hsu, Product & Design, Android 注: 正如咱们 去年年底发表 的那样,咱们曾经扭转了版本编号计划,以配合 Android Studio 所基于的 IntelliJ IDE 编号,即 2020.3,再加上咱们本人的补丁编号,以及一个便于记忆和应用的代号。咱们将按字母程序安顿代号,第一个便是 Arctic Fox,它当初处于 Beta 版;下一个代号是 Bumblebee,当初则还在 Canary 渠道中。 当初,咱们很快乐向大家颁布 Android Studio Arctic Fox (2020.3.1) Beta ❄️ : 官网 Android IDE 的最新版本,专一于设计、设施和开发者生产力。您当初就能够在 Beta 版渠道 下载,以尝试在 Google I/O 2021 期间公布的所有新性能: 世界各地的开发者社区只管在过来的一年里不得不适应各种挑战,但仍在持续发明令人惊叹的翻新利用。得益于社区的反馈,咱们为大家提供并更新了这套工具,旨在赋能三大主题: 疾速 UI 设计 - 应用 Jetpack Compose,创立古代 UI 从未如此简略。咱们提供各种工具以帮忙您实现设计之旅: 在不同的配置中创立预览,用 Compose Preview 导航您的代码,用 Deploy Preview to Device 进行独自测试,用 Layout Inspector 查看整个利用。在整个迭代过程中,您能够疾速编辑字符串和数字,并看到即时更新。此外,通过 Layout Editor 中的 Accessibility Scanner,您能够查看基于 View 的布局是否存在无障碍问题。笼罩新设施,无论大小 - 将您的利用扩大到更广大的舞台,不仅仅限于手机。无论是 Wear OS、Google TV 还是 Android Auto,咱们都筹备了新的模拟器和零碎映像,甚至还有针对不同测试场景的实在模仿: 用 Wear OS Pairing 配对您的手表和手机模拟器,用 Wear OS 心率传感器进行一场虚构的跑步,用 Google TV Remote Control 近程管制切换频道,用 Automotive OS Sensor Replay 进行驾驶。晋升开发者生产力 - 咱们心愿确保您的工作空间和环境为最新的零碎做好筹备,并优化速度和品质。当初,您能够享受 Intellij 2020.3 重大更新带来的一大批新性能和改良,在利用中测试 Android 12 所带来的新性能,用 Memory Profiler 的新 UI 晋升利用性能,用 WorkManager Inspector 捋清后台任务关系,并应用 Non-Transitive R 类 IDE Refactoring 来进步构建速度。简而言之,这是一次不容错过的降级!✨ 围绕这些主题,Beta 版中还有很多性能和改良供您体验,请持续浏览本文或观看上面的演讲,以理解更多亮点。您也能够先跳过浏览,间接去 Beta 渠道 下载 Android Studio Arctic Fox (2020.3.1) Beta,当初就上手尝试一下最新的性能吧!请向咱们提交反馈,帮忙咱们在下一个版本的 Android Studio 中持续聚焦您最关怀的畛域。 ...

May 25, 2021 · 4 min · jiezi

关于android-studio:一把双刃剑-融云即时通讯sdk中的自定义消息使用心得指南-上

一把双刃剑 -- 融云即时通讯sdk中的自定义音讯应用心得&指南 (上)背景:最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 他家的官网和文档地址: 官网:https://www.rongcloud.cn/文档:https://docs.rongcloud.cn/v4 这个工作当然还是落在我的头上. 我是应用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都须要开发者自定实现, 带UI的sdk封装了一些根本的界面,例如会话列表, 和他人聊天的会话界面). 需要:融云的体系中默认的音讯类型只有9种. 性能形容文字音讯用来发送文字类音讯,其中能够包含表情、超链接(会自动识别),客户端收到音讯后计入未读音讯数、进行存储。语音音讯发送高质量的短语音音讯,录制的语音文件存储到融云服务端,语音文件格式为 AAC,时长下限为 60 秒,客户端收到音讯后计入未读音讯数、进行存储。图片音讯用来发送图片类音讯,客户端收到音讯后计入未读音讯数、进行存储。图片缩略图格局为 JPG,大小倡议不超过 100k。GIF 图片音讯用来发送 GIF 动静图片音讯,客户端收到音讯后计入未读音讯数、进行存储。图文音讯用来发送图文音讯,蕴含一个题目,一段文字内容和一张图片,客户端收到音讯后计入未读音讯数、进行存储。文件音讯用来发送文件类音讯,客户端收到音讯后计入未读音讯数、进行存储。地位音讯用来发送地理位置音讯,客户端收到音讯后计入未读音讯数、进行存储。小视频音讯用来发送小视频音讯,反对录制发送及抉择本地视频文件发送两种形式,录制时长不超过 10 秒,本地抉择视频文件形式时长不超过 2 分钟,小视频音讯小视频文件格式为 .mp4,客户端收到音讯后计入未读音讯数、进行存储。合并转发音讯IMKit SDK 中反对将多条音讯合并为一条音讯进行发送,合并后的音讯以 HTML 文件的形式存储到融云服务端,客户端收到音讯后计入未读音讯数、进行存储。这9种音讯其实曾经满足大部分的即时聊天场景了, 无论是打字聊天最一般的文本音讯, 还是长按录制发送的语音音讯, 以及图片音讯, 分享地位的音讯. 基本上微信有的场景, 都笼罩到了. 然而因为各家的产品各不相同, 有人须要一个比微信性能更简洁的聊天工具, 有人则须要一个像QQ那般功能强大的聊天工具. 总是有千奇百怪不同的需要的. 像咱们的app就是这样, 总有场景是这里无奈满足的. 好比QQ是能够把图片和文本音讯放入同一个音讯气泡中的(相似于富文本音讯), 那么这样的状况下, 默认的几类音讯就不够用了. 不过融云还是把这块做的很到位的, 裸露了类和接口让用户去对音讯做自定义, 基本上能够做到, 想把音讯定义成什么样就定义成什么样子. 心得(上)这里就举一些我在开发咱们公司app时, 用到的自定义音讯, 以及应用心得和指南. 只发给以后在线用户的限时处分告诉只给以后在线用户发送音讯, 咱们有一种游戏处分是只发放给非凡时段在线的用户的, 只有以后在线的用户能力接管到这种音讯来支付处分, 其余在该时段未在线的用户, 不能接管到, 且再次登录后也不能接管到保留的离线音讯. 这个需要就是做了一个自定义音讯来实现的. 把自定义音讯类的 MessageTag 中 flag 值设置为 MessageTag.STATUS。此音讯类型即为状态音讯,状态音讯不存储不计数,并且当接管方不在线时,此音讯会间接抛弃,用户再上线也不会收到该音讯。 有须要的同学能够看他们家对于自定义音讯的文档:https://docs.rongcloud.cn/im/... ...

March 10, 2021 · 1 min · jiezi

关于android-studio:Android-Studio的安装及SSL-peer-shut-down-incorrectly问题

装置Android Studio可参考:android studio的装置,史上最具体(超多图)!!装置胜利后、第一次运行程序会进行gradle,可能产生报错:SSL peer shut down incorrectly "SSL peer shut down incorrectly"的解决办法解决办法可参考:①联网:AndroidStudio SSL peer shut down incorrectly 问题②本地:Android Studio应用本地Gradle的配置 联网法在侧边文件栏在Gradle Scripts下找到build.gradle这个文件,双击编辑。在以下两处增加maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { repositories { google() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } //此处增加 jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.1.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects { repositories { google() maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } //此处增加 jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}保留后,点击上方Try again或敞开Android Studio再关上,期待下载实现即可。 ...

January 29, 2021 · 1 min · jiezi

关于android-studio:Android-Studio-和-Gradle-插件使用全新版本编号

作者 / Jamal Eason, Product Manager 第一版 Android Studio Arctic Fox (2020.3.1) 以及 Android Gradle 插件 (AGP) 的 7.0.0-alpha01 版双双在 Canary 通道已正式公布。在此版本中,咱们调整了 Android Studio 和 Gradle 插件的版本编号计划。此项变更将 Gradle 插件从 Android Studio 的版本编号计划中剥离,并使 Android Studio 的每个版本对应于哪个年份和 IntelliJ 版本变得更加清晰。 Android Studio 的新版本编号计划从 Arctic Fox (2020.3.1) 开始,Android Studio 的版本号零碎将以年份为根底,从而更加合乎 IntelliJ IDEA 的版本模式——Android Studio 正是基于这个 IDE 构建的。新的版本编号计划会引入几项重要属性: 年份、所基于的 IntelliJ 版本以及性能和补丁程序级别。这种命名模式的变更使您可能疾速确定您在 Android Studio 中应用的 IntelliJ 平台版本。此外,每个次要版本都将具备规范代号,从 Arctic Fox 开始,之后会按字母程序顺次命名,以帮忙用户轻松分别新老版本。 咱们建议您应用最新版本的 Android Studio,以体验最新性能和品质改良。为便于更新,咱们对版本进行了更改,将 Android Studio 与 Android Gradle 插件版本进行了明确的拆散。须要记住的一个重要细节是,更新 IDE 时,构建零碎执行编译和打包利用的形式不受影响。相同,利用构建流程变更和 APK/Bundle 则会受到您的我的项目 AGP 版本影响。因而,即便在开发周期的前期,您也能够平安地更新 Android Studio 版本,因为您的我的项目 AGP 版本与 Android Studio 版本能够采纳不同的节奏进行更新。最初,在新的版本零碎中,只有您的 AGP 版本放弃在稳定版,您或您的团队就能够在利用我的项目中更加不便地 同时运行 稳定版和预览版 Android Studio。 ...

December 11, 2020 · 2 min · jiezi

关于android-studio:Android-Studio-中的-Motion-Editor-用法详解

作者 / Scott Swarthout 在同 Android 开发者社区交换之中,咱们深知动画成果的退出对于 UI 来说至关重要,它能够让 UI 看起来更加直观,同时还利于用户了解其所要表白的用意。然而,开发者们在 Android 利用中增加简单的动画成果却有着较大的工作量。为了解决这一问题,咱们应用 Motion Layout 构建了一组功能强大的 API,并为之提供了 Motion Editor 工具,组合应用时能够轻松构建出像素级别完满的动画成果。 本文会带您疾速理解新的 Motion Editor 工具,以及如何在开发过程中应用其最新性能。此外,咱们还专门制作了一系列 视频 来领导您对于蕴含 Motion Layout 在内的一系列 API 的常识。 Motion Editor 是一款专门针对 MotionLayout 布局类型所构建的可视化编辑器,通过它能够轻松地创立和预览动画成果。自 Android Studio 4.0 版本开始,咱们公布了稳固版本的 Motion Editor,许多开发者曾经在应用它创立动画成果。 Motion Editor 中运行的动画 Motion Editor 是 Android Studio Layout Editor (布局编辑器) 的一个扩大,当您在一个蕴含 MotionLayout 的 XML 文件中抉择 Design 或 Split 视图 时,会主动关上 Motion Editor。您能够应用已在布局编辑器中所熟知的交互方式来编辑布局和 Motion Scene 文件,并能够间接在 Android Studio 预览界面中对动画成果进行预览。 ...

December 6, 2020 · 2 min · jiezi

关于android-studio:Dagger-导航从未如此简单-Android-Studio-41

在应用 Dagger 的我的项目中,您是否因为要弄清楚 Dagger 的依赖关系而产生纳闷?依赖项来自 @Inject 润饰的结构器、@Binds 还是 @Provides 润饰的办法?它有限定符吗?要搞清楚这个并非易事。 难道不能一键获取相干信息甚至失去更多内容吗?当然能够! Android Studio 4.1 版本为咱们带来了一个新的 "间距图标" (在编辑器和代码行号之间的图标,如下图所示),通过点击这个图标,咱们能够轻松地在 Dagger 的关联代码间进行导航,包含依赖项的生产者、消费者、组件、子组件以及模块。您同样能够在 Find usages 中获取雷同的信息。 △ 在 Android Studio 中新增的 Dagger 导航反对 正如您所看到的,在 Android 利用中 Dagger 关系的导航从未如此简略。新版本 Android Studio 将反对一键准确查找提供依赖项办法的性能。 特地阐明: 以后的性能将会在行将公布的 AS Canary 版本中失去优化。命名和图标可能会更改。在下文 "后续布局" 局部获取更多信息。实际在 Android Studio 4.1 Canary 7 之后,您能够在应用 Dagger 的我的项目中看到一个新的间距图标: △ Android Studio 中新的 Dagger 间距图标 此 Canary 版本的规范如下: 向上箭头的图标: 提供类型的中央 (即依赖项来自何处)向下箭头的图标: 类型被当作依赖项应用的中央让咱们通过 GitHub 上的示例利用 Dagger branch (dev-dagger) of the architecture-samples,来演示新性能的应用。 ...

December 3, 2020 · 1 min · jiezi

关于android-studio:使用-Android-Studio-Profiler-工具解析应用的内存和-CPU-使用数据

为了帮忙开发者开发出更加轻快高效的利用,咱们在 Android Studio 3.0 以及更高版本中退出了 Android Profiler 工具,用于利用的 CPU、内存、网络和能耗剖析。 在 Android Profiler 提供的这四种性能数据中,绝大多数场景下咱们都更关怀 CPU 和内存的应用状况。本文将介绍对应的两种剖析工具 —— Memory Profiler 和 CPU Profiler。 Memory Profiler许多开发者应用 Memory Profiler,是心愿发现和定位内存透露问题。在介绍 Memory Profile 如何解决这一问题之前,我想先明确 "内存透露" 这一概念。无论您以后是否理解内存透露,都将帮忙我更好地解释 Memory Profile 的工作原理。 内存透露什么是内存透露? 通常咱们认为,在运行的程序中,如果一个无法访问的对象却依然占用着内存空间,即为此对象造成了内存透露。如果您应用过 C 语言或 C++ 的指针,您会很相熟这个概念。 然而在 Kotlin 和 Java 的世界中,事件有些许不同。因为这两种语言是运行在 Java 虚拟机 (JVM) 中的。在 JVM 中,有个重要的概念,就是垃圾回收 (GC)。当垃圾回收运行时,虚构机会首先辨认 GC Root。GC Root 是一个能够从堆内部拜访的对象,它能够是本地变量或运行中的线程等。虚构机会辨认所有能够从 GC Root 拜访的对象,它们将会被保留。而其余无奈从 GC root 拜访的对象,则会被认为是垃圾并回收掉。 所以,个别意义上的内存透露在 JVM 中并不存在。在 JVM 中的内存透露通常是指: 内存中含有那些再也不会被应用、然而依然可能拜访的对象。 ...

November 17, 2020 · 3 min · jiezi

关于android-studio:flutterbloc使用解析骚年你还在手搭bloc吗

前言首先,有很多的文章在说flutter bloc模式的利用,然而百分之八九十的文章都是在说,应用StreamController+StreamBuilder搭建bloc,晋升性能的会加上InheritedWidget,这些文章看了很多,真正写应用bloc作者开发的flutter_bloc却少之又少。没方法,只能去bloc的github下来找应用形式,最初去bloc官网翻文档。各位靓仔,就不能好好说说flutter_bloc的应用吗?非要各种搬运bloc模式提出作者的那俩篇文章。当初,搞的杂家要本人去翻文档总结(手动滑稽)。 我的项目成果(倡议PC浏览器关上) Bloc范例成果Cubit范例成果上面是Flutter_Bloc历程的一系列链接 Flutter_Bloc起源Flutter_Bloc模式优化Flutter_Bloc诞生Flutter_Bloc官网文档后面三个,是bloc作者写的bloc模式文档,典型的观察者模式的利用,最原始的就是java中CallBack模式。前俩篇文章就是咱们这些搬运工的次要“参考”的材料起源,这三篇文章在掘金上有翻译版,搜下bloc就能找到。最初一篇文章就是我次要总结演绎的源泉,作者在官网上写了好几个demo:计时器,登录,Todos,天气等等,大家能够本人去看看。 问题首次应用flutter_bloc框架,可能会有几个疑难 state外面定义了太多变量,某个事件只须要更新其中一个变量,其它的变量赋雷同值麻烦进入某个模块,进行初始化操作:简单的逻辑运算,网络申请等,入口在哪定义成果好了,哔哔了一堆,看下咱们要用flutter_bloc实现的成果。 间接开Chrome演示,大家在虚拟机上跑也一样。援用先阐明下,bloc给的api很多,不同的api针对与解决场景不同,我要是把官网那些api全抄过也没啥意义;不,也有可能能够装币,我要是不阐明,大家说不定认为是我本人总结的呢!哈哈。OK,大家要是想晓得全场景的应用,能够去官网翻翻文档,我感觉学习一个模式或者框架的时候,最次要的是把主流程跑通,起码能够符合标准的堆页面,这样的话,就能够把这玩意用起来,再遇到想要的什么细节,就能够本人去翻文档,毕竟大体上曾经懂了,写过了几个页面,也有些领会,再去翻文档就很快能了解了。库flutter_bloc: ^6.0.6 #状态治理框架equatable: ^1.2.3 #加强组件相等性判断看看flutter_bloc都推到6.0了,别再用StreamController手搭Bloc了!插件在Android Studio设置的Plugins里,搜寻:Bloc 装置重启下,就OK了 右击相应的文件夹,抉择“Bloc Class”,我在main文件夹新建的,填入的名字:main,就主动生成上面三个文件;:main_bloc,main_event,main_state;main_view是我本人新建,用来写页面的。 是不是感觉,还在手动新建这些bloc文件low爆了;就如同fish_redux,不必插件,让我手动去创立那六个文件,写那些模板代码,真的要原地爆炸。Bloc范例初始化代码来看下这三个生成的bloc文件:main_bloc,main_event,main_state main_bloc:这里就是咱们次要写逻辑的页面了 mapEventToState办法只有一个参数,前面主动带了一个逗号,格式化代码就分三行了,倡议删掉逗号,格式化代码。class MainBloc extends Bloc<MainEvent, MainState> { MainBloc() : super(MainInitial()); @override Stream<MainState> mapEventToState( MainEvent event, ) async* { // TODO: implement mapEventToState }}main_event:这里是执行的各类事件,有点相似fish_redux的action层@immutableabstract class MainEvent {}main_state:状态数据放在这里保留,直达@immutableabstract class MainState {}class MainInitial extends MainState {}实现阐明 这里对于简略的页面,state的应用形象状态继承实现的形式,未免有点麻烦,这里我进行一点小改变,state的实现类别有很多,官网写demo也有不必抽象类,间接class,相似实体类的形式开搞的。老夫在代码关键点写上"///"类型正文,大家认真看看,拷进Android Studio外面,这些中央会变绿!大家好好领会下绿色代码!main_bloc state变量是框架外部定义的,会默认保留上一次同步的MainSate对象的值class MainBloc extends Bloc<MainEvent, MainState> { MainBloc() : super(MainState(selectedIndex: 0, isExtended: false)); @override Stream<MainState> mapEventToState(MainEvent event) async* { ///main_view中增加的事件,会在此处回调,此处解决完数据,将数据yield,BlocBuilder就会刷新组件 if (event is SwitchTabEvent) { ///获取到event事件传递过去的值,咱们拿到这值塞进MainState中 ///间接在state上扭转外部的值,而后yield,只能触发一次BlocBuilder,它外部会比拟上次MainState对象,如果雷同,就不build yield MainState() ..selectedIndex = event.selectedIndex ..isExtended = state.isExtended; } else if (event is IsExtendEvent) { yield MainState() ..selectedIndex = state.selectedIndex ..isExtended = !state.isExtended; } }}main_event:在这里就能看见,view触发了那些事件了;保护起来也很爽,看看这里,也很快能懂页面在干嘛了@immutableabstract class MainEvent extends Equatable{ const MainEvent();}///切换NavigationRail的tabclass SwitchTabEvent extends MainEvent{ final int selectedIndex; const SwitchTabEvent({@required this.selectedIndex}); @override List<Object> get props => [selectedIndex];}///开展NavigationRail,这个逻辑比较简单,就不必传参数了class IsExtendEvent extends MainEvent{ const IsExtendEvent(); @override List<Object> get props => [];}main_state:state有很多种写法,在bloc官网文档上,不同我的项目state的写法也很多 ...

November 13, 2020 · 4 min · jiezi

关于android-studio:调用HMS-SDK接口报错6003

集成华为HMS SDK的游戏或一般利用,调用接口(比方getCurrentPlayer登录接口)总是报错6003。该错误码官网文档示意:签名证书指纹谬误,签名证书指纹次要用于校验利用的真实性,确保利用来自可信起源。 针对此问题,能够从以下4点排查: 查看以后利用应用的证书签名是否与华为后盾配置统一。查看manifest文件中的appid参数是否失常。查看是否有二次签名或者加固。查看是否应用了华为签名服务。检查点一:查看利用的签名证书信息是否与华为后盾配置统一。关上利用的APK,将其中“META-INF”文件夹解压进去,失去其中的“CERT.RSA”文件,通过keytool -printcert -file META-INF/CERT.RSA命令打印签名证书信息。参考配置签名证书文档,查看后盾配置的SHA256证书指纹,如果信息和下面的统一,则失常。留神:不要应用debug版本的keystore签名打包,请应用正式版本打包并应用真机(非模拟器)进行测试。 检查点二:查看manifest文件中的appid参数是否正确能够通过以下几种形式自行查看: 间接查看我的项目中manifest文件中配置的appid是否正确。将打包后的APK文件应用反编译工具查看manifest文件appid参数。工具自行百度。检查点三:查看利用是否有二次签名或者加固以后华为渠道是不会做二次签名的,因而如果利用有做二次签名或者加固,须要自行解决该问题。 检查点四:查看是否应用了华为的利用签名服务以后华为还提供了利用签名服务,开发者能够将利用的签名秘钥托管给华为,并应用该秘钥为最终分发给用户的APK签名。 利用签名官网文档:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-appsigning-newapp 依照官网要求,如果应用了该服务,须要将此处生成的证书指纹追加至检查点一:查看利用的签名证书信息是否与华为后盾配置统一中的华为后盾配置处。 欲了解更多详情,请参见: HMS Core SDK框架错误码:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-References-V5/error-code-0000001050045846-V5 新利用应用利用签名服务:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-appsigning-newapp 原文链接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203363619150710071&fid=18作者:鼓楼赵又廷

October 10, 2020 · 1 min · jiezi

关于android-studio:上手做一个华为鸿蒙手表应用-4-生命周期事件

接上一篇:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202356576775850798&fid=0101303901040230869本节内容: 生命周期事件源码仓库地址:https://gitee.com/zhaoquan/harmonyoswatchdemo 生命周期文档: Page 生命周期,AbilitySlice 生命周期,Page 与 AbilitySlice 生命周期关联:https://developer.harmonyos.c...JS API 的生命周期接口:https://developer.harmonyos.c...这里咱们先从 JS API 的生命周期接口开始这里就不画图了,间接用张荣超老师视频教程上的截图,没有哪帧图片没有字幕,道歉了这里生命周期跟,小程序很像 app.js为了不便看生命周期,将 app.js 的console.info("Application onCreate"); 改为:console.log("利用创立")'console.info("Application onDestroy");改为:console.log("利用销毁"); // app.js// 批改后的代码如下export default { onCreate() { console.log("利用创立"); }, onDestroy() { console.log("利用销毁"); }};index.js为了不便看生命周期,应用console.log打印`onInit(){console.log("index 页面的 onInit() 被调用");},onReady(){ console.log("index 页面的 onReady() 被调用");},onShow(){ console.log("index 页面的 onShow() 被调用");},onDestroy(){ console.log("index 页面的 onDestroy() 被调用");},` // index.js// 在 index.js 增加生命周期函数,留神 data:{} 前面要增加英文逗号import router from '@system.router'export default { data: { title: 'World' }, onInit(){ console.log("index 页面的 onInit() 被调用"); }, onReady(){ console.log("index 页面的 onReady() 被调用"); }, onShow(){ console.log("index 页面的 onShow() 被调用"); }, onDestroy(){ console.log("index 页面的 onDestroy() 被调用"); }, clickAction(){// console.log("我被点击了") router.replace({ uri:'pages/xunlian/xunlian', }); }}启动 Debug 看看调试信息 ...

October 10, 2020 · 1 min · jiezi

Android-Studio-上的-HttpClient-插件

使用过 IDEA / PyCharm /... (JetBrains家的大部分产品)专业版 的同学可能会知道它们内置了一个叫 HttpClient 的插件。 具体像下面这样使用: 新建 xxx.http 文件 ###POST http://localhost:8080/xxxxContent-Type: application/jsonCache-Control: no-cache{"a":1, "b":2} ###GET http://localhost:8080/xxx?pageNo=2&pageSize=1Accept: */*Cache-Control: no-cache在 POST/GET URL 行左侧会有绿色执行图标,点击即可测试接口。 可在社区版和 Android Studio 上没有内置这个插件,经过搜寻找到一个:idea-rest-client 图片来自此插件仓库 此插件能够满足基本功能,但是有次想要传递表单数据,姿势一直不正确导致一直发送失败。所以开始进行插件改造道路。 首先是使用 OkHttp 进行请求重写支持更清晰的数据样式。支持环境设置,参数动态填充。 后期考虑到此插件大多是在Android Studio上使用,对于 Android 开发网络框架一般有Retrofit,所以进行 Retrofit 接口类一键生成支持,且支持 Java 和 Kotlin: 但数据量较大时,支持下载到文件,再进行预览。以及大文件下载功能。。。 最后插件仓库地址:Vove7/retrofit-rest-client 你可以在IDEA 社区版 和 Android Studio 插件库上进行搜索安装:retrofit-rest-client,或仓库内下载插件文件,进行本地安装。

June 1, 2020 · 1 min · jiezi

reactnative-apk打包-android

找到 javajdkxx.xx.xxxxbin 的安装路径如图我这里是 C:Program FilesJavajdk1.8.0_221bincd C:Program FilesJavajdk1.8.0_221bin 进入到C:Program FilesJavajdk1.8.0_221bin下, 执行 keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 这样应该就成功了,会生成一个叫做my-release-key.keystore的密钥库文件 2.设置 gradle 变量把刚刚生成的my-release-key.keystore文件放到你工程中的android/app文件夹下。然后编辑c:/users/用户名/.gradle/gradle.properties(全局配置,对所有项目有效)或是项目目录/android/gradle.properties(项目配置,只对所在项目有效)。如果没有gradle.properties文件你就自己创建一个,添加如下的代码(注意把其中的**替换为相应密码)如我的3.把签名配置加入到项目的 gradle 配置中编辑你项目目录下的android/app/build.gradle,添加如下的签名配置:这个是官网上的我的是 4.生成apk$ cd android$ ./gradlew assembleRelease(cd android表示进入 android 目录(如果你已经在 android 目录中了那就不用输入了)。./gradlew assembleRelease在 macOS、Linux 或是 windows 的 PowerShell 环境中表示执行当前目录下的名为 gradlew 的脚本文件,且其运行参数为 assembleRelease,注意这个./不可省略;而在 windows 的传统 CMD 命令行下则需要去掉./。)如图下 生成的 APK 文件位于android/app/build/outputs/apk/release/app-release.apk,它已经可以用来发布了。

October 16, 2019 · 1 min · jiezi

2019年Android开发者常见面试题二

上一篇主要介绍的是Java相关的面试题,其实已经重复的说过,在Android面试中,Java相关的面试大概要占到20%,甚至是大于20%,所以不得不显得尤为重要,毕竟目前的开发中,Java语言开发毕竟还是占到绝大部分的。 这篇继续Java相关的面试题分享: 问题 8:抽象类的意义答案【答案不唯一,可自己衡量】:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。具体分析如下: 1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。 比如本科和研究生可以抽象成学生,他们有相同的属性和方法。这样当你对其中某个类进行修改时会受到父类的限制,这样就会提醒开发人员有些东西不能进行随意修改,这样可以对比较重要的东西进行统一的限制,也算是一种保护,对维护会有很大的帮助。 2.当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。 比如学校又新产生了专科生这类学生,那么专科生直接继承学生,然后对自己特有的属性和方法进行补充即可。这样对于代码的重用也是很好的体现。 所以,Java中抽象类对于代码的维护和重用有很好的帮助,也是Java面向对象的一个重要体现。   问题 9:抽象类与接口的应用场景答案【答案不唯一,可自己衡量】:应用都是基于规则的应用,也就是基于语法的应用,我们可以根据语法上的异同点来总结抽象类和接口的应用场景 相同点没有什么可说的,我们从不同点下手。 1、第一个重要的不同点抽象类中不一定都是抽象的方法,也可以有具体实现的方法,这样就可以把大家公用的方法提升到抽象类中,然后具体的方法可以留给子类自己实现(此处经典的应用,模板方法设计模式)。所以抽象类可以更好的实现代码的复用 2、另一个重要的不同就是类可以实现多个接口。接口和抽象类的概念不一样。这个可以理解为接口是对动作的抽象,抽象类是对根源的抽象(即对本质的抽象与其他类的本质不同)。 抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。 所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。 另一个重要的概念就是多态,多态通过分离做什么和怎么做,从另一个角度将接口和实现分离出来。多态不但能够改善代码的组织结果和可读性,还能创建可扩展的程序----即无论在项目最初创建时还是在需要添加新功能时都可以“生长”的程序。由于接口更关注于动作的实现,多态主要是分离“做什么”和“怎么做”,所以接口的另一个重要的应用就是多态的实现(当然抽象类也可以实现多态,但是接口更加合适)。 抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。   10:抽象类是否可以没有方法和属性答案【答案不唯一,可自己衡量】:答案是肯定的,可以。 抽象类中可以没有抽象方法,但有抽象方法的一定是抽象类。所以,java中 抽象类里面可以没有抽象方法。注意即使是没有抽象方法和属性的抽象类,也不能被实例化。   问题 11:接口的意义答案【答案不唯一,可自己衡量】:1、定义接口的重要性:在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才使得Java成为面向对象的编程语言。 2、定义接口有利于代码的规范:对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。 3、有利于对代码进行维护:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现现有的类已经不能够满足需要,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。 4、保证代码的安全和严密:一个好的程序一定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。   问题 12:泛型中extends和super的区别答案【答案不唯一,可自己衡量】:<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型 <? super T> 限定参数类型的下界:参数类型必须是T或T的超类型 总结为: <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入 <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收 ? 既不能用于入参也不能用于返参   问题 13:父类的静态方法能否被子类重写答案【答案不唯一,可自己衡量】:首先答案是不能! 这个问题有两个关键字,一个是静态方法,一个是重写。 我们来先说说重写,可能很多初学的朋友分不清重写和重载的区别。 重写:子类继承父类后,定义了一个和父类中的一模一样方法,这个一模一样是值方法名和参数的定义一模一样。这时候子类要实现这个方法,就称为对父类方法的重写。 重载:子类继承父类后,定义了一个和父类中相同名字的方法,但是参数不一样(必须),实现也不同(可选),这就是重载。 静态方法:java中,static修饰符修饰的方法就是静态方法。所谓静态就是指:在编译之后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。 在java中,所有的东西都是对象,对象的抽象就是类,对于一个类而言,如果要使用他的成员(类中的属性,方法等),一般情况下,必须先实例化对象后,通过对象的引用才能访问这些成员。 但是,如果要使用的成员使用了static修饰,就可以不通过实例化获得该成员。 就比如,现在有个桌子,我想吃苹果,一般情况下,我需要先拿个盘子(对象的实例化)去装苹果才能吃到苹果,现在有个苹果直接放在桌子上(用static修饰过的静态方法),这样我就可以直接从桌子上拿到苹果。可能大家会有疑问,既然静态方法(能不通过实例化就使用成员)这么方便,为什么不都使用静态方法。 大家回到static这个修饰符的功能定义:所谓静态就是指:在编译之后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。 java的回收机制会定时的回收已经使用过的对象的内存来释放内存给应用程序。如果全部都是静态变量和静态方法,内存都被占用了,java程序哪里还有运行的空间呢?就好比,你回家就看到桌子上摆满了苹果,那你买的梨子就没地方放了。 现在回到题目中来,父类的静态方法能不能被重写。答案是不能。 因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。   问题 14:进程和线程的区别答案【答案不唯一,可自己衡量】:1. 定义进程是一个术语,用来描述一组资源和程序运行所需的内存分配。对于每一个被加载到内存的exe,在它的生命周期中操作系统会为之创建一个单独隔离的进程。一个进程的失败不会影响其他的进程。每个进程是由私有的虚拟地址空间、代码、数据和其他各种系统资源组成的。 ...

June 27, 2019 · 1 min · jiezi

修改AndroidStudio缓存目录

文章首发自公众号: nullobject 。个人站点:https://www.nullobject.cn这篇文章主要介绍如何修改Android Studio缓存目录1 说明修改Android Studio缓存目录,主要是修改.AndroidStudio文件夹和m2文件夹所在目录。.AndroidStudio主要用于保存AS的配置以及插件。默认情况下,.AndroidStudio 默认的目录位于C盘系统用户文件夹下: AS默认会为每个版本都生成一个.AndroidStudio目录,当然这可以在安装和更新AS时指定。m2文件夹为AS本地仓库缓存,在使用远程仓库时会先缓存到本地的仓库之后才添加到项目。这两个文件夹会随着使用日渐膨胀,占用C盘空间,因此C盘容量小的朋友可以通过这个方法转移AS缓存目录以减缓系统盘压力。 开始配置之前,建议先关闭所有Android Studio实例。Android Studio基于IntelliJ IDEA开发,可以通过修改Android Studio可执行文件目录下的idea.properties文件实现修改缓存目录。该方法理论上同样适用于修改JetBrains家其他的软件缓存目录。备份idea.properties文件开始配置之前,建议备份一份原始的idea.properties文件,以确保发生意外时候能够快速地恢复原有配置(相信细心的Coder们不会犯这种错误)。 2 修改idea.properties如果您是初次修改idea.properties,建议先熟悉该属性文件中的配置选项,一定程度上这也能够达到知其所以然的效果。idea.properties部分内容如下: 图中箭头所指的内容就是用于修改AS缓存目录的四个选项。可以看到,被注释掉的这四个选项即AS默认的缓存目录配置,要修改AS缓存目录为指定的目录,只需要去掉这四句的注释,并修改为目标路径即可。例如,笔者希望将AS缓存目录修改为D:/Android/.AndroidStudio目录,可以按以下方式修改: 修改完成后保存并关闭文件,重启Android Studio既可生效。 注意:修改完成后,重新打开AS会出现配置引导界面让用户重新配置。想沿用原有的配置,只需要将旧的缓存目录内容复制到新的路径下即可: 3 修改m2文件夹m2文件夹默认的路径为C:/Users/username/.m2 ,其中username即系统用户名。将m2文件夹复制到新的缓存目录下,例如D:/Android。接下来需要打开AndroidStudio配置其路径的环境变量: 配置好之后,重启AS生效。

June 19, 2019 · 1 min · jiezi

Android-Studio-内建立适配折叠屏的虚拟机

目前,本人能找到创造折叠屏虚拟机有如下两种方案。1、用android-studio内置的虚拟机,不过要下载canary版本的android-studio。 在canary10的版本中,安卓官方就已经出了折叠屏模拟器。 官方教程如下:https://androidstudio.googleb... 2、用三星的折叠屏模拟器。该方法比较简单,不用下载canary版本的android-studio,只需要建立一个平板模拟器即可。但安卓的镜像得是x86_64的(因为要安装一个三星模拟器的APP)。 然后安装一个名字为:FoldableEmulator_1.01.apk。的APP。 官方教程如下:https://developer.samsung.com...

June 11, 2019 · 1 min · jiezi

Android-Studio启动虚拟器报错VTx-is-disabled-in-BIOS惠普电脑解决方案

在Android Studio中创建好一个模拟器后,启动时报如下错误:“Intel HAXM is required to run this AVD,VT-x is disabled in BIOS”。 检查Android Studio中是否装好了HAXM installer首先检查一下Android Studio中是否装好了HAXM installer,如果没有安装,则到SDK Manager中下载安装Download Intel x86 Emulator Accelerator (HAXM installer),然后到sdk的目录下沿着 extras > intel > Hardware_Accelerated_Execution_Manager 目录找到intelhaxm-android.exe这个文件安装定并运行。 修改BIOS权限如果上一步没有解决问题,就需到BIOS界面里修改VT-x设置了。对于惠普电脑,进入BIOS的方法是:1、关机2、开机,在屏幕刚刚亮,显示HP的时候点击esc键盘,然后按F10进入设置界面(这一步需要在屏幕亮的第一时间点击esc键,否则不成功)3、按照以下步骤设置VT-x权限

May 12, 2019 · 1 min · jiezi

Android-复盘你真的了解-setContentView-吗

1. AppCompatDelegate 的 setContentView()分析 Android 中的 View,我们先从进入应用的看到的的一个 View 入手,第一个 View 就是 通过 setContentView() 这个方法进行加载的。我们来看 setContentView() 的源码: public void setContentView(@LayoutRes int layoutResID) { this.getDelegate().setContentView(layoutResID);}AppCompatActivity 中的 setContentView() 又调用了 AppCompatDelegate 中的 setContentView() 方法,那 AppCompatDelegate 是做什么的呢? AppCompat 出现在 v7 包,它的作用是让 API 等级在 7 之上的设备也能使用 ActionBar,在 v7:21 之后,AppCompat 可以让 API 在 7 之上的设备使用 MD、ToolBar 等效果。之前的 ActionBarActivity 也被取代为 AppCompatActivity。但 AppCompatActivity 的内部回调是由 AppCompatDelegate 来实现的。AppCompatDelegate 是一个抽象类,它的实现类是 AppCompatDelegateImpl,现在看 AppCompatDelegateImpl 中的 setContentView() 方法: public void setContentView(int resId) { // 创建 DecorView,DecorView 是视图中的顶级 View this.ensureSubDecor(); // 获取 DecorView 中的 content 部分 ViewGroup contentParent = (ViewGroup)this.mSubDecor.findViewById(16908290); contentParent.removeAllViews(); // 将我们编写的界面填充到 content 中 LayoutInflater.from(this.mContext).inflate(resId, contentParent); this.mOriginalWindowCallback.onContentChanged();}2. DecorView在 AppCompatDelegateImpl 的 setContentView() 中,通过 ensureSubDecor() 方法为视图创建 DecorView, ...

May 3, 2019 · 9 min · jiezi

Android-反编译指南

我们下载到的 App 安装包是 Apk 文件(Android Application Package) 。通过 Apk 文件,我们也可以得到这个应用的代码和资源文件,对应用进行修改。 那么我们如何获取这些文件呢?这就需要 Android 反编译技术。 01 所需要的软件Apktool反编译 xml 文件和 dex 文件,并可以将编译后的项目重新打包成 apk。官方下载地址: Apktool官方的速度有时候不稳定,也可以从我的网盘中下载: 链接 密码:xkao dex2jar将 classes.dex 转换为「.jar」文件)官方下载地址: dex2jar我的网盘: 链接 密码:xkao jd-gui查看「.jar」文件官方下载地址: jd-gui我的网盘: 链接 密码:xkao 02 Apktool我们可以通过 Apktool 可以将 apk 文件进行反编译,但是直接把 apk 的扩展名改成「.zip」也可以对其进行解压并得到一些资源文件。 META-INF 里保存 App 的签名信息classes.dex.dex 是 Dalvik 虚拟机上的可执行文件,需要使用 dex2jar 将其转换为 jar 文件 AndroidManifest.xmlAndroid 清单文件,向 Android 系统提供应用的必要信息。 assets存放一些资源文件字体,声音等。 lib存放第三方库 original存放未经过反编译的等 AndroidManifest.xml 文件 res存放资源文件,例如图片,颜色,字符等。 smalismali 里存放的是 java 编译成的 smali 代码,smali 相当于 Android 虚拟机上运行的语言。 ...

April 30, 2019 · 2 min · jiezi

Ionic4 cordova混合开发的开发调试环境搭建

Ionic4混合开发首选应该是capacitor,但capacitor刚推出不久还不够成熟,所以选择使用传统的cordova方式开发。基本上,Ionic native5和之前版本使用方式上变化不大,但cli有些选项上有些区别。1.创建platform添加android平台ionic cordova platform add android删除android平台ionic cordova platform remove android2.编译ionic项目源文件到www目录只有在Android studio中运行调试ionic项目才需要执行cordova的prepare命令,用于ionic源代码被修改之后,更新Android studio中相应的原生项目。ionic cordova prepare android如果要编译release版本,可以添加参数:ionic cordova prepare android –release –prod3.ionic模拟器或者真机调试以下命令在模拟器上运行app,最好在运行命令之前启动模拟器。ionic cordova emulate android -l注意,原先3.x版本的–consolelogs参数在4.x版本已经不支持,至少在4.1版本不支持,也不知道以后是否会支持。因此,调用console.log等方法输出到浏览器控制台的信息,无法通过ionic输出到命令行。要查看console.log等方法输出到浏览器控制台的信息,目前只能进入模拟器的Extended controls窗口的Bug report选项卡,然后在Bug report data下方窗口复制日志信息到记事本中,然后查找"SystemWebChromeClient"或者"I chromium"定位console信息。这个方法比较麻烦,所以建议采用第4步的方法,使用Android studio调试app。连接真机运行调试app的cli:ionic cordova run android -l4.在Android studio中运行调试ionic项目(真机或者模拟器调试)如果项目之前曾经使用ionic在模拟器和真机上调试运行,Android studio导入项目可能会失败,此时需要用ionic cordova platform remove android删除android平台,然后再次使用ionic cordova platform add android添加。运行Android studio,导入项目platformsandroid,可能会提示配置gradle.wrapper,点击确定。配置过程中,可能会发生build失败,提示gradle版本过高,可以点击自动修改配置。然后还可能出现android sdk版本缺失,可以按照提示下载安装android sdk。点击 Run/Edit configurations菜单,点击+号,添加一个android app配置;在Gerenal选项卡的Module下拉框中选择app,点击确定创建配置。然后可以运行或者调试配置。之后修改ionic源代码,只需要重新执行第2步的ionic cordova prepare命令,就可以同步到android studio项目。调试之前,最好先把模拟器运行起来,运行模拟器之前最好wipe data。在下方的Logcat窗口中,筛选框中输入 I/chromium,可以查看ionic项目中调用console.info/debug等方法输出到浏览器console中的消息。真机调试时比较有用。

March 27, 2019 · 1 min · jiezi

windows系统安装配置react-native运行环境

最近公司要开发react-native项目,自己在windows系统上练习了一下,过程中发现好多问题,在这里整理出来供大家参考;一、首先来看一下reactNative官网官网上的教程很详细,介绍了IOS和Android的环境搭建、示例教程等等,建议大家先按照官网的环境搭建教程尝试搭建,遇到问题再上网搜索答案,这样印象会深刻一些;下面就按照官网教程来详细讲解一下IOS和Android的环境搭建二、IOS和Android的环境搭建稳定的-Fan Qiang-工具安装 Android Studio 需要-Fan Qiang-才能下载,安装配置 Android Studio 的时候也要用到-Fan Qiang,所以你需要有一个稳定的-Fan Qiang-工具;(注意稳定,否则会出现下载失败、链接超时的情况)我用的是小飞机,就不在这里多说了,大家自行搜索;NodeJs下载Node版本必须高于8.3。Python2下载Python 的版本必须为 2.x(不支持 3.x)JDK下载JDK 的版本必须是 1.8(目前不支持 1.9 及更高版本)- 下载安装Android Studio 上步操作完成就开始下载 Android Studio; 官网上介绍安装是这样说的: 安装界面中选择"Custom"选项,确保选中了以下几项: Android SDK Android SDK Platform Performance (Intel ® HAXM) (AMD 处理器看这里) Android Virtual Device 然后点击"Next"来安装选中的组件。 如果选择框是灰的,你也可以先跳过,稍后再来安装这些组件。 我安装的时候,这几项确实是不能选中的,所以直接“Next” ,如果你的-Fan Qiang-工具足够稳定,那就不用担心,后面的步骤中会让你安装这些的,所以按照官网教程往下走就可以了;- 配置 ANDROID_HOME 环境变量这里直接从官网copy了React Native 需要通过环境变量来了解你的 Android SDK 装在什么路径,从而正常进行编译。打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 高级 -> 环境变量 -> 新建,创建一个名为ANDROID_HOME的环境变量(系统或用户变量均可),指向你的 Android SDK 所在的目录(具体的路径可能和下图不一致,请自行确认):SDK 默认是安装在下面的目录:c:Users你的用户名AppDataLocalAndroidSdk你可以在 Android Studio 的"Preferences"菜单中查看 SDK 的真实路径,具体是Appearance & Behavior → System Settings → Android SDK。你需要关闭现有的命令符提示窗口然后重新打开,这样新的环境变量才能生效。- 把 platform-tools 目录添加到环境变量 Path 中打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 高级 -> 环境变量,选中Path变量,然后点击编辑。点击新建然后把 platform-tools 目录路径添加进去。此目录的默认路径为:c:Users你的用户名AppDataLocalAndroidSdkplatform-tools - 安装 Android SDK在 Android Studio 的欢迎界面中找到 SDK Manager。点击"Configure",然后就能看到"SDK Manager"在 SDK Manager 中选择"SDK Platforms"选项卡,然后在右下角勾选"Show Package Details"。展开Android 9 (Pie)选项,确保勾选了下面这些组件(重申你必须使用稳定的-Fan Qiang-工具,否则可能都看不到这个界面): Android SDK Platform 28Intel x86 Atom_64 System Image(官方模拟器镜像文件,使用非官方模拟器不需要安装此组件)然后点击"SDK Tools"选项卡,同样勾中右下角的"Show Package Details"。展开"Android SDK Build-Tools"选项,确保选中了 React Native 所必须的28.0.3版本。你可以同时安装多个其他版本。最后点击"Apply"来下载和安装这些组件。- 安装安卓虚拟机不建议使用Android Studio自带的虚拟机,因为据说是性能较差、操作不方便等问题;推荐使用Genymotion,企业版是收费的,但是个人版本是免费的,大家可以选择个人版本进行下载;1、首先注册2、选择个人版本(免费),下载vbox版本3、下载、安装完成后登录:4、登录成功后会出现安卓机型列表,点击想要安装的虚拟机后面的“三个点”进行下载安装;虚拟机启动成功!三、一切准备就绪,现在开始创建reactNative项目**使用 React Native 命令行工具来创建一个名为"AwesomeProject"的新项目:1、react-native init AwesomeProject创建成功后在文件资源管理器中会看到 AwesomeProject 这个文件夹2、cd AwesomeProject3、react-native run-android运行这一步骤的时候后会打开node界面第三步很容易出现问题,这一步严重依赖-Fan Qiang-工具,建议在确保工具正常巡行的情况下执行此步骤,如果出现失败等问题,请检查工具是否运行正常;项目运行成功!参考文档:https://reactnative.cn/docs/g… ...

February 27, 2019 · 1 min · jiezi

Android Studio 安装后必做的配置

在上一文:Android Studio 超详细安装教程 中,我们已经成功的安装了 Android Studio 开发工具,并进行了第一次启动前的初步设置。然而这点设置是远远不够的,为了让我们的开发工具能够使用得更加得心应手,还需要更多的设置。一、系统环境及下载资源1.1 安装环境电脑系统 : Windows 10JDK 版本 : 1.8Android Studio : 3.2.11.2 下载资源官方下载地址(需翻墙)国内Android Studio下载地址(不需翻墙)官方下载地址是需要翻墙才可以进入并且下载的,国内下载地址虽然可以不用翻墙,但是国内的往往不是最新版本的Android Studio ,如果需要体验最新版本的 Android Studio 还请前往官方下载地址进行下载安装。二、设置2.1 自动导包在日常编程中,我们可以使用 Alt + Enter 进行导包,使用 Ctrl + Alt + O 来清除无用包,但是这些事情其实都是可以自动完成的。File -> Settings 打开设置选择 Editor -> General -> Auto Import勾选 Add unambiguous imports on the fly勾选 Optimize imports on the fly(on current project)点击 Apply 进行应用2.2 字体大小Android Studio 的界面 UI 中的字体大小和代码中的字体大小都是 12 。对于我们来说可能有点小了,看着不是很舒服。所以我们需要对字体大小进行设置。修改代码字体大小:File -> Settings 打开设置选择 Editor -> Font修改 Size 后的值,如: 14点击 Apply 进行应用修改软件界面 UI 中的字体大小:File -> Settings 打开设置选择 Appearance & Behavior -> Appearance勾选 Override default fonts by (not recommended):修改 Size 后的值,如: 14点击 Apply 进行应用2.3 命名前缀在 Android 开发中我们常常遵循一些代码开发规范,在Android 源码中我们可以看到通常成员变量都是以‘m’开头。其实在 Android Studio 中可以在自动生成字段名称的时候加上自定义的前缀。比如:非共有,非静态的成员变量以’m’开始静态成员变量以’s’开始File -> Settings 打开设置选择 Editor -> Code Style -> Java选择 Code Generation 标签给Field 添加一个’m’前缀,给Static filed 添加一个’s’前缀点击 Apply 进行应用2.4 Log 颜色Darcula 主题中 Logcat 的默认配色只有红白两种颜色,非常不便于我们区分 Log 的类型。所以我们可以通过修改不同级别的 Log 的颜色来加以区分。File -> Settings 打开设置选择 Editor -> Code Scheme -> Android Logcat选择一个级别名称,如:Assert取消勾选 Inherit values from在 Foreground 后面选择对应的颜色(可以按照下面的颜色表进行设置,也可自行设置)依次设置其他级别的 Log 的颜色点击 Apply 进行应用点击 Foreground 后面的颜色,进行颜色选择。选择好颜色之后,点击 Choose 即可。其他级别的颜色设置同上。Log 颜色表:Log 级别颜色Assert#AA66CCDebug#33B5E5Error#FF4444Info#99CC00Verbose#FFFFFFWarning#FFBB33修改前的 Log 的颜色:修改后的 Log 的颜色:2.5 设置代码警示线在 Android Studio 安装完成之后,打开文件进行代码编辑时,你会发现编辑区域中间有一条从上到下的白线。这条白线其实是 代码警示线 ,用来提醒你代码长度最好不要超过这条线。如果你是强迫症,想要去掉这条白线,该怎么做呢?File -> Settings 打开设置选择 Editor -> General -> Appearance取消勾选 Show hard wrap guide (configured in Code Style options)点击 Apply 进行应用如上图所示,在代码编辑区域有一条从上到下的白线,其关联设置选项为 Show hard wrap guide (configured in Code Style options) 。如需去除白线,取消此选项勾选并应用即可,如上图所示。当然官方建议不去除此白线,用以提醒自己一行代码的长度不要过长。2.6 设置快捷键在几年前,Android 应用大多还是使用 Eclipse 进行开发,后来出了 Android Studio ,以其良好的界面,优异的特性迅速取代了 Eclipse ,目前 Android Studio 基本已经完全取代了 Eclipse 。但是还是有一些小伙伴可能是从 Eclipse 转到 Android Studio ,更熟悉 Eclipse 的快捷键,而对 Android Studio 的快捷键非常陌生,甚至别扭,所以 Android Studio 贴心的提供了多个版本的快捷键方案给用户做选择,让你更好的融入 Android Studio 的开发。File -> Settings 打开设置选择 Keymap在下拉框中选择 Eclipse 或其他你更熟悉的快捷键方案点击 Apply 进行应用虽然可以选择其他快捷键方案,但是建议使用 Android Studio 默认的快捷键方案,这才是最适合它的。同时在这里你也可以对任一快捷键做修改,设置为你更习惯的快捷键,对此不再赘述。2.7 动态模板 - Live TemplatesLive Templates 是动态模板、活动模板或代码模板,它的作用是:代码快速补全提高写代码的速度系统中有很多自带的模板,我们可以使用这些模板来快速生成所需要的代码。比如:如上图所示,输入 sout 就会出现提示,对应生成的代码就是 System.out.println("") 。我们在打 Log 时经常需要定义 TAG 私有静态常量用以标记位置,使用 logt 则可以快速生成 private static final String TAG = “ClassName” 。在 Android Studio 中还有很多很多好用的动态模板,在此就不一一介绍了,感兴趣的小伙伴可以自行去查看。在系统提供了众多的动态模板后,有一些我们常用的代码也可以将其定义为动态模板,提高我们的工作效率。其中 Handler 是 Android 中非常常用的组件,但是使用不当则会造成内存泄漏,下面就以创建一个通过弱引用的方式解决 Handler 的内存泄漏问题并将其自定义为动态模板,方便我们的日常使用。File -> Settings 打开设置选择 Editor -> Live Templates点击右侧 + 按钮,选择 2. Template Group… 创建一个新的模板组假设新的模板组取名为:Custom,输入名称完成创建选中新建的 Custom 模板组,点击右侧的 + 按钮,选择 1. Live Template 创建一个新的动态模板输入此动态模板的各项参数。点击 Apply 进行应用并测试是否生效点击右侧 + 按钮,选择 2. Template Group… 创建一个新的模板组,名为:Custom.选中新建的 Custom 模板组,点击右侧的 + 按钮,选择 1. Live Template 创建一个新的动态模板设置动态模板的缩写 Abbreviation ,描述 Description, 以及模板内的代码内容 Template test,此处按照如下配置即可。Abbreviation:handlerDescription: Self-defined Handler without Memory Leakage.Template test: 见下方代码private static class MyHandler extends Handler { private WeakReference<$ClassName$> mActivityWeakReference; MyHandler($ClassName$ activity) { mActivityWeakReference = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); $ClassName$ activity = mActivityWeakReference.get(); if (activity != null) { switch (msg.what) { default: break; } } }}如上图所示点击下方的 Define 并勾选 Java,以设置此代码的语言。如上图所示,在代码块中,有 $ClassName$ 参数,此参数对应的是 Handler 所在的 Activity 的类名。为了适配所有的类,所以可以使用绑定参数的方式在自动生成代码时,将 $ClassName$ 参数替换成其所在类的类名。点击 Edit variables 按钮,在弹出框中,点击 Expression ,在下拉列表中找到并选择 className() 即可。点击 OK 完成配置。参数含义:NameExpressionDefault valueSkip if defined名称表达式默认值是否略过定义ClassNameclassName() 配置完动态模板后,我们来新建一个 TestActivity 测试一下。如上图所示,只要输入 handler 就会出现动态模板,选择之后就会自动生成下方的代码,再也不用一次又一次的重复敲代码了。其他章节Android Studio 超详细安装教程Android Studio 中那些最好用的插件阅读原文 ...

January 29, 2019 · 2 min · jiezi

Android Studio 中那些最好用的插件

在日常的 Android 开发中,为了可以减少工作量和更好的使用 Android Studio,插件是必不可少的工具。我们可以使用插件来为我们节约开发时间,用插件帮助我们生成代码,用插件来协助我们更好的开发。下面将列举部分我个人使用过并且觉得很不错的一些插件,如果你有其他好的推荐,欢迎在评论中分享。插件的安装在 Android Studio 中安装插件非常简单,步骤如下:File -> Settings 打开设置选择 Plugins搜索框中输入你要安装的插件,如果还未安装,会提示你在仓库中搜索,点击Search in repositorirs在左侧选中你要安装的插件,在右侧点击 Install 安装按照以上步骤安装其他插件所有插件安装完成之后,重启 Android Studio 即可搜索插件,如果插件已安装,将会显示,如果未安装,点击 Search in repositorirs,在仓库中搜索插件。搜索在插件之后,点击安装即可。GsonFormatGsonFormat 插件是用来将 JSON 字符串快速转化为 JavaBean 实体类的一个插件,免去了我们自己手写的过程。在 Android Studio 中需要先创建一个 JavaBean 的实体类,然后在类中按下快捷键 Alt + S 打开 GsonFormat 弹出框,将 JSON 字符串复制进去即可。Android ButterKnife ZeleznyAndroid ButterKnife Zelezny 是开源工具 ButterKnife 的相关插件。ButterKnife 将字段和方法与 view 进行绑定,通过注解的方式生成样板代码,使用 @BindView 字段代替 findViewById。而 Android ButterKnife Zelezny 插件则可以帮助我们从选定的布局XML中直接生成 ButterKnife 的注入。鼠标在布局文件上右键,选择 Generate -> Generate ButterKnife Injections 即可生成。Android Parcelable code generatorJavaBean 序列化代码生成插件,可以快速实现 Parcelable 接口,实现序列化。只需在 JavaBean 实体类中右键,选择 Generate -> Parcelable 即可生成。ADB WiFi ConnectAndroid 开发,真机调试必不可少,但是总是通过连线进行调试会很不方便,所以我们可以使用无线的方式进行调试,会方便很多,只要保证手机和电脑在同一个局域网中即可。使用下面的命令即可远程连接到手机进行调试:# 连接到 IP 为 192.168.1.101 的手机$ adb connect 192.168.1.101connected to 192.168.1.107:5555 # 出现此提示说明连接成功,默认端口为 5555# 断开连接$ adb disconnect 192.168.1.101disconnected 192.168.1.107 # 出现此提示说明断开连接成功# 更多用法在此不再赘述ADB WiFi Connect 插件的功能在于当你使用 USB 线将手机接到电脑上之后,可以通过界面进行无线连接并备份、管理等操作,更直观,也更易于操作。插件安装好之后,需要重启 Android Studio,重启之后在工具栏最后面有上图所示图标,点击图标即可打开插件。连接过的设备,可保存在 Saved devices 中,如果IP不变的话,下次可直接连接。Markdown NavigatorMarkDown 文档编辑插件,开发中可以用来编辑 README 或是其他开发文档都很好用。Translation一个功能非常强大的翻译插件,支持的IDE也很多,具体请查看 Translation 的 GitHub 仓库安装完成后,重启 Android Studio,选中英文,右键 -> Translate 即可翻译。功能较多,不好一一说明,更多用法及功能请见 Translation 的 GitHub 仓库,文档为中文,阅读无障碍。Android Material Design Icon GeneratorAndroid Material Design Icon Generator 是一个自动生成 Material Design 风格的图标的插件,相对于插件 Android Drawable Importer 来说,个人更喜欢这个插件,个人觉得这个插件更好用一点。在任意地方 右键 -> New -> Material Design icon 打开面板即可,在面板中对图标进行选择及设置。GenymotionGenymotion 是一款速度较快的 Android 模拟器,以前单独安装使用过,效果很不错,现在已经可以直接在 Android Studio 的插件中进行了。插件资源站可在下面的插件资源站搜索更多插件,查看插件资源等信息。JetBrains 插件总站JetBrains 总站下 Android Studio 插件其他章节Android Studio 超详细安装教程Android Studio 安装后必做的配置阅读原文 ...

January 29, 2019 · 1 min · jiezi

Android Studio 超详细安装教程

作为 Android 开发者,Android Studio 是我们必不可少的开发工具之一,甚至是最重要的开发工具。那么了解 Android Studio 并熟悉其各种配置是居家旅行并不可少的技能之一了。本文将详细介绍 Android Studio 的下载安装,以及一些必要的设置。一、安装环境及下载资源1.1 安装环境电脑系统 : Windows 10JDK 版本 : 1.8Android Studio : 3.2.1注:安装环境一般来说不影响 Android Studio 的安装。1.2 下载资源官方下载地址(需翻墙)国内Android Studio下载地址(不需翻墙)官方下载地址是需要翻墙才可以进入并且下载的,国内下载地址虽然可以不用翻墙,但是国内的往往不是最新版本的Android Studio ,如果需要体验最新版本的 Android Studio 还请前往官方下载地址进行下载安装。二、安装 Android Studio2.1 安装 Android Studio下载完了 Android Studio 的安装包之后,双击打开进行安装。点击 Next 进行下一步。勾选 Android Virtual Device 选项,然后点击 Next 进行下一步。选择 Android Studio 安装的本地路径,个人建议不要安装在C盘。前面的安装设置完成之后,直接点击 Install 进行安装即可,然后就是等待安装完成了。安装完后之后点击 Finish 将会启动 Android Studio,此时将会进行一些第一次启动前的初步设置。2.2 初步设置第一次启动 Android Studio 将会进行一些初步的设置。现在的 Android Studio 安装包仅包含其本身,并不包含 Android SDK, 所以在第一次启动时告诉你无法访问 Android SDK 加载项列表,此时点击 Cancel 退出即可,后面会下载 SDK 的。点击 Next 进行下一步。这里是选择 Android Studio 的设置类型,Standard 为标准模式,想省事的可以选择这个选项,会跳过后续的一些设置步骤。这里我们习惯性选择 Custom 自定义模式。这里是选择软件的界面主题,一种偏暗的 Darcula,和一种偏亮的 Intellij,按照自己的习惯选择就好,个人比较喜欢 Darcula 主题。这里是进行 SDK 组件设置,因为我已经安装了 Android SDK 和 Android Virtual Device 所以这里已经不需要再进行安装了。如果你没有安装的话,在左侧选项中勾选你需要安装的项目,建议全部勾选。同时在下面的 Android SDK Location 中设置 Android SDK 的本地路径。设置完毕后点击 Next 进行安装。这里是对你之前的选择,进行确认的,如果需要修改设置的话,点击 Previous 返回上一条进行修改。如果确认如此设置的话,点击 Finish 进行设置,等待完成即可。因为我已经提前安装完了 Android SDK 所以这里显示 “Nothing to do!”, 如果你并没有安装过 Android SDK的话,此时将会下载 Android SDK 相应的资源。下载完成后点击 Finish 完成。到此已经完成了 Android Studio 的下载安装及初步设置。我们可以愉快的使用 Android Studio 进行 Android 开发了。后续章节安装完 Android Studio ,必不可少的要做一些设置,添加一些好用的插件,让我们的开发工具更加好用,更加得心应手,详情请见以下后续章节。Android Studio 安装后必做的配置Android Studio 中那些最好用的插件阅读原文 ...

January 29, 2019 · 1 min · jiezi

Flutter v1.0 踩坑记

前面的安装这里就不叙述了。看这里:技术胖的Flutter(http://jspang.com/post/flutte…)按照步骤安装后,还是一直报错,到绝望。。。错误代码如下:Error running Gradle:ProcessException: Process “D:\project\Flutter\flutter_app\android\gradlew.bat” exited abnormally:> Configure project :appChecking the license for package Android SDK Platform 27 in C:\Users\Administrator.WINMICR-H4QQDHF\AppData\Local\Android\Sdk\licensesWarning: License for package Android SDK Platform 27 not accepted.FAILURE: Build failed with an exception.* Where:Build file ‘D:\project\Flutter\flutter_app\android\build.gradle’ line: 26* What went wrong:A problem occurred evaluating root project ‘android’.> A problem occurred configuring project ‘:app’. > Failed to install the following Android SDK packages as some licences have not been accepted. platforms;android-27 Android SDK Platform 27 To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager. Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html Using Android SDK: C:\Users\Administrator.WINMICR-H4QQDHF\AppData\Local\Android\Sdk* Try:Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output. Run with –scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 1s Command: D:\project\Flutter\flutter_app\android\gradlew.bat app:propertiesFinished with error: Please review your Gradle project setup in the android/ folder.解决办法:把项目的android/app目录下的build.gradle文件中的sdk版本号改掉,原本是27,改成28.路径:代码如下: ...

January 23, 2019 · 1 min · jiezi

mac上搭建flutter开发环境并运行第一个程序

什么是flutter官方是这么解释的:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。(闲鱼APP就是用的flutter)一、安装flutter#切换到准备安装flutter的目录cd project#有两种方法安装flutter SDK#1、使用git clonegit clone -b beta https://github.com/flutter/flutter.git#2、直接在github下载压缩包,下载地址https://github.com/flutter/flutter/releases#在目录下解压zip文件#配置环境export PATH=pwd/flutter/bin:$PATH #如果下载太慢或者失败,那么需要先配置中国镜像,然后再clone项目export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn#切换到项目目录cd ./flutterflutter doctor不出意外的话,应该会报错,提示你安装android studio、Xcode、install dart和flutter插件等。按照提示逐个安装就行。需要注意的是,你可能会遇见pod setup这个步骤,但是却一直卡着进度条不动,快速的解决办法是,打开手机热点,mac连接手机的热点进行下载安装,5分钟内能够安装好(大小应该在500多M)二、安装android studio及插件android studio 下载地址打开android studio, 打开plugin输入flutter搜索,点击中间的 Search in repositories点击install,顺利的话安装完毕之后重启android studio三、运行第一个项目新建一个Flutter打开android studio后 会看到可选项多了一个 Start a new Flutter project创建成功后在终端中输入open -a Simulator则可以启动ios模拟器,然后在android studio 控制台中输入 flutter run 就能够看到安卓真机和ios模拟器了flutter run -d <设备id>就能够启动对应的平台了如我这里启动ios模拟器就输入flutter run -d B21和运行android项目一样的操作流程,连接安卓真机后在手机上能看到默认的项目

January 21, 2019 · 1 min · jiezi

Flutter 环境搭建以及创建第一个APP遇到的坑

win10 64位 安装Flutter一、Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中:export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn二、获取Flutter SDK://git 拉取flutter sdkgit clone -b dev https://github.com/flutter/flutter.git//配置path 变量(clone项目下的bin文件地址)export PATH="$PWD/flutter/bin:$PATH"cd ./flutter//安装下载依赖flutter doctor//会有错吴如下[-] Android toolchain - develop for Android devices• Android SDK at D:\Android\sdk✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ• Try re-installing or updating your Android SDK, visit https://flutter.io/setup/#android-setup for detailed instructions.三、上面报错原因是没有下载安装Android sdk,Android设置。1、下载android studio2、安装3、安装过程中会遇到downloading components慢的问题 [解决方法][1]4、配置好了镜像后 注释掉disable.android.first.run=true 再启动android studio downloading components就会下载好了5、[设置android studio 模拟器][2]6、配置环境变量 android sdk export ANDROID_HOME 例如SDK装在D:\androidSDK中7、解决第二步 报错 android studio 安装flutter和dart插件四、vscode编辑器配置1、安装flutter和dart插件2、调用 View>Command Palette…3、输入 ‘doctor’, 然后选择 ‘Flutter: Run Flutter Doctor’ action没问题就执行如下:4、调用 View>Command Palette…5、输入 ‘flutter’, 然后选择 ‘Flutter: New Project’ action6、新建项目后F5,这里会报错,问题是之前用镜像下载sdk的问题 要删除之前的代理 android sdk路径的gradle.properties 删除代理7、再按f5就ok了 ...

January 9, 2019 · 1 min · jiezi

ButterKnife使用详解

以前的话经常使用findViewById()来绑定布局中ID,这样写不仅麻烦而且还没有什么效率,今天推荐一款由JakeWharton大神写的框架Butterknife用来绑定ID。导入依赖既然是是一个第三方的开发库,让先让我们把导入项目中:Module的build.gradle文件中:apply plugin: ‘com.jakewharton.butterknife’dependencies { compile ‘com.jakewharton:butterknife:8.6.0’ annotationProcessor ‘com.jakewharton:butterknife-compiler:8.6.0’}Project的build.gradle文件中:buildscript { repositories { mavenCentral() } dependencies { classpath ‘com.jakewharton:butterknife-gradle-plugin:8.6.0’ }}这里需要特殊说明一下,如果按照官方网站上面的方式导入的话,会报这个错误(需要升级你的Gradle插件):To use the DSL implementation() you have to use:所以只用按照我上面的方式导入即可。使用方法绑定View@BindView(R.id.tv_butter) TextView tv_butter; @BindView(R.id.et_butter) EditText et_butter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butter); //首先将ButterKnife注入,这行代码要在setContentView()之后执行。 ButterKnife.bind(this); tv_butter.setText(“绑定TextView”); et_butter.setText(“绑定EditText”); }绑定事件@OnClick(R.id.btn_butter) public void onBtnClick(View view) { Toast.makeText(this, “btn_butter被点击了”, Toast.LENGTH_SHORT).show(); }绑定资源 @BindString(R.string.app_name) String app_name; @BindColor(R.color.colorAccent) int colorAccent;还有很多各种场景下的绑定,其实套路都一样,这里主要举例三个应用场景。Zelezny插件如果你像我一样懒的连这些代码都不想写的话,下面推荐一款Zelezny插件(Android Studio),这个插件会自动在布局中查找控件的id,然后直接绑定,你说爽不爽。安装插件使用插件在代码中双击选中布局//通过插件生成的代码 @BindView(R.id.tv_butter) TextView tvButter; @BindView(R.id.et_butter) EditText etButter; @BindView(R.id.btn_butter) Button btnButter;OK,接下来就让我们愉快的使用这个第三方插件吧。最近我会写很多关于Android常用控件的使用,里面都是一些很有用的知识,如果你感觉有用,请给我一个star,谢谢。实例代码 ...

December 30, 2018 · 1 min · jiezi

一篇文章让你了解Android各个版本的历程

2008年–至今Android 1.5(Cupcake纸杯蛋糕):智能虚拟键盘;使用widgets实现桌面个性化;在线文件夹(Live Folder)快速浏览在线数据;视频录制和分享;图片上传;更快的标准兼容浏览器;Voice search 语音搜索;立体声蓝牙和免提电话 Android 1.6(Donut甜甜圈):完全重新设计的Android Market,可以显示更多的屏幕截图;手势支持,可以让开发者生成针对某个应用程序的手势库;支持CDMA网络:中国电信的用户可以期待EVDO的Android手机了;TXT-2-Speech,支持了更多语言的发音,包括英语、法语、德语、意大利语等快速搜索框,可直接搜索括联系人,音乐,浏览历史,书签等手机内容;全新的拍照界面:新版相机程序启动速度快了39%,拍照间的延迟减少了28%;应用程序耗电查看:这下好了,哪个软件耗多少电,现在一见了然了;新增面向视觉或听觉困难人群的易用性插件;Linux内核升级到2.6.29;其他:支持更多的屏幕分辨率,如WVGA,QVGA等Android 2.0 (2.0~2.1 Eclair松饼(闪电泡芙)):由于文件结构的改动优化,使得整个操作流畅性得到了很大的提升;自带的Chrome Lite浏览器现在加入了对双击屏幕进行缩放的支持;加强了网络社交功能,比如Facebook好友整合至联系人功能;强化了语音识别的搜索控制。整个系统多处都支持语音控制,并拥有独立的控制面板;谷歌地图服务更新,加入了全新的导航系统,甚至比转业的导航软件更为先进;加入了原生微软Exchange邮件服务支持;提供了多个不同帐户,统一的邮件收件箱;只需双击就能上传图片至YouTube;优化了驾车时的体验,新的“Car Home”应用程序为各功能提供了易于操作的快捷链接,还能方便地使用语音控制功能,便于用户驾车时使用 Android 2.1可以同时绑定多个Google账号;无线控件里有了VPN设置;增加了连接到PC设置;增强了语言和声音的转换功能,并加入了文字到语音转换;全新的拨号界面,按键更大,更易于操作;更多桌面Widget;新的Google地图可以使用谷歌地图导航功能;新的浏览器版本,加强了稳定性和网页渲染能力;全局搜索功能加强;全新的Market程序,搜索更快布局更合理 Android 2.2(Froyo冻酸奶):全面支持Flash 10.1;应用程序自动升级,让升级更加人性化;支持应用程序安装在外置内存上;Linux内核将升级为最新的2.6.32版本,系统更加稳定;对系统性能进一步优化,让手机有更多的运行内存;增加了轨迹球LED指示灯变色这个新功能;增加了对3D性能的优化,3D性能更加强大;FM功能也将在新系统中得到全面支持 Android 2.3(2.3 Gingerbread姜饼)用户界面更美观;提升游戏体验;提升多媒体能力;增加官方进程管理;改善电源管理;NFC近场通信;全局下载管理;全新虚拟键盘;原生支持前置前置摄像头;SIP网络电话 Android3.0到3.1(3.0 Honeycomb 蜂巢):安卓3.0系统主要用于安卓的平板产品,画面动感,可操控性更强,代表有摩托罗拉的平板产品XOOM,3.1也已经发布,也主要用于平板产品。Android4.0(4.0 Ice CreamSandwich)1、单一系统Android 4.0将只提供一个版本,同时支持智能手机、平板电脑、电视等设备。2、一流的新UI3、开源此前Android 3.0曾一度宣布不采取开源措施,然而谷歌深知Android系统一大成功特性就是开源。平板上吃到的苦头势必在全新的Android 4.0上避免,用户为中心的刷机资源一定会让Android 4.0锦上添花。 Android5.01、android 5.0 Hello 5.05.0的版本号就能告诉我们,这是一个大的升级版本。2、基于Linux内核3.0Linux刚刚发布Linux 3.0内核没多久,后来又更新到了3.0.1 。3、通过Android Market购买音乐谷歌已经试水性质的推出了Google Music Beta ,允许上传2万首音乐到Google的云端服务器,自动创建播放列表在任何支持flash的设备上回放,我们有理由相信这种在Appstore影响下的数字视频、音频服务内容的提供也将会出现在Android上。4、多核处理器优化现在各厂商都在推双核的智能手机,实际的效果如何我们不予评说,但Android 4.0将特别为使用双核乃至多核处理器的手机进行专门的优化。5、运行速度比3.1提高1.8倍Google的人员只是这么一说,并没有提及这个性能具体体现在什么方面,因此我们不知道这是关于浏览器、GPU还是整体性能,只有等待。6、集成Google电视和Chrome OS的智能停放7、为OEM提供了官方的主题引擎有了这个引擎,便可通过Google的升级程序更新到这些第三方的主题。8、苹果游戏中心的一个真正的竞争者9、支持现有的智能手机据称现行所有运行Android 2.3的手机都有可能升级到4.0版本,这条消息是我喜闻乐见的,而Google官方的Nexus One和Nexus S将是第一批升级到4.0的手机。10、新的摄影技巧以及虚拟摄像机这将为开发者提供更丰富的摄像头控制API。android 6.0 锁屏下语音搜索用户可以直接在锁屏状态下进行语音搜索,虽然现在的一些安卓手机支持语音唤醒功能,但这些语音唤醒都是第三方厂商开发的,而此次的Android 6.0在系统层面加入锁屏下语音搜索,这无疑会在体验上有一个明显的提升。指纹识别说到指纹识别,很多用户都会觉得现在的中高端安卓手机都支持,但事实上这些安卓手机的指纹识别都是各个厂商自行开发的并没有系统底层的支持。Android 6.0则在系统层面加入指纹识别,能提供原生指纹识别API,这不但降低了厂商开发指纹识别模块的成本,最重要的是原生指纹识别将会大大提升安卓手机的指纹识别支付安全性。更完整的应用权限管理在此前的原生安卓系统中有应用通知管理功能,但更为深入的应用权限管理只能靠第三方应用实现。Android 6.0进一步强化应用权限管理,应用权限管理也成为系统级的功能,不过这对于那些权限管理软件来说并不是什么好消息。Doze电量管理Android 6.0自带Doze电量管理功能,在“Doze”模式下,手机会在一段时间未检测到移动时,让应用休眠清杀后台进程减少功耗,谷歌表示,当屏幕处于关闭状态,平均续航时间提高30%。Now on Tap功能Now on Tap功能是和Google搜索紧密结合的功能,它可以让谷歌从任何应用中进行搜索。例如,在微信中聊天的时候提到餐馆,那么就可以在不跳转的情况下进行谷歌搜索。App Links通过App Links功能,Android平台能够向网络服务器提出申请,自主识别链接内容。直接跳转到App客户端中,改善用户体验,有利于让用户在体验更完善的App客户端完成更多操作。此外,在Android 6.0谷歌还加入了Android Pay进一步强化移动支付,同时也是为了对抗Apple Pay。在发布会上谷歌表示Android 6.0将在下周开始推送,Nexus5/6/7/9以及Nexus Player将能够在第一时间得到升级。Android7.0分屏多任务进入后台多任务管理页面,然后按住其中一个卡片,然后向上拖动至顶部即可开启分屏多任务,支持上下分栏和左右分栏,允许拖动中间的分割线调整两个APP所占的比例。目前,安卓7.0开发者预览版支持全部第三方应用尝试分屏操作,但个别应用适配可能存在问题,分屏后可能导致界面显示不全等问题.全新下拉快捷开关页在安卓7.0中,下拉打开通知栏顶部即可显示5个用户常用的快捷开关,支持单击开关以及长按进入对应设置。如果继续下拉通知栏即可显示全部快捷开关,此外在快捷开关页右下角也会显示一个“编辑”按钮,点击之后即可自定义添加/删除快捷开关,或拖动进行排序。通知消息快捷回复安卓7.0加入了全新的API,支持第三方应用通知的快捷操作和回复,例如来电会以横幅方式在屏幕顶部出现,提供接听/挂断两个按钮;信息/社交类应用通知,还可以直接打开键盘,在输入栏里进行快捷回复。通知消息归拢安卓7.0会将同一应用的多条通知提示消息归拢为一项,点击该项即可展开此前的全部通知,允许用户对每个通知执行单独操作。夜间模式安卓7.0中重新加入了夜间深色主题模式,该功能依然需要在系统调谐器中开启,从顶部下划打开快捷设置页,然后长按其中的设置图标,齿轮旋转10秒钟左右即可提示已开启系统调谐器,之后用户在设置中即可找到“系统调谐器”设置项。点开其中的“色彩和外观”,即可找到夜间模式,开启后即可使用全局的深色主题模式,同时亮度和色彩也会进行一定的调整,该功能可以基于时间或地理位置自动开启。另外,系统调谐器中也提供了RGB红绿蓝三色调节滑动条,允许用户手动精细调节,例如减少蓝色或增加红色以提供类似护眼模式的效果。流量保护模式安卓7.0新增的流量保护模式不仅可以禁止应用在后台使用流量,还会进一步减少该应用在前台时的流量使用。其具体实现原理目前尚不清楚,推测其有可能使用了类似Chrome浏览器的数据压缩技术。此外,谷歌还扩展了ConnectivityManager API的能力,使得应用可以检测系统是否开启了流量保护模式,或者检测自己是否在白名单中。安卓7.0允许用户单独针对每个应用,选择是否开启数据保护模式。全新设置样式安卓7.0启用了全新的设置样式,首先每个分类下各个子项之间的分割线消失了,只保留分类之间的分割线。全新的设置菜单还提供了一个绿色的顶栏,允许用户通过后方的下拉箭头,快速设定勿扰模式等。除了勿扰模式外,顶栏菜单还可以显示诸多其他的设置状态,例如数据流量的使用情况,自动亮度是否开启等。谷歌也在安卓7.0的设置中加入了汉堡菜单,在二级设置界面中的左上角,你就会看到这个汉堡菜单,点击后即可看到所有设置项,方便用户快速跳转。改进的Doze休眠机制谷歌在安卓7.0中对Doze休眠机制做了进一步的优化,在此前的安卓6.0中,Doze深度休眠机制对于改善安卓的续航提供了巨大的作用。而在安卓7.0中,谷歌对Doze进行了更多的优化,休眠机制的使用规则和场景有所扩展,例如只要手动在后台删掉应用卡片,关屏后该应用就会被很快深度休眠。系统级电话黑名单功能安卓7.0将电话拦截功能变成了一个系统级功能。其它应用可以调用这个拦截名单,但只有个别应用可以写入,包括拨号应用、默认的短信应用等。被拦截号码将不会出现在来电记录中,也不会出现通知。另外用户也可以通过账户体系备份和恢复这个拦截名单,以便快速导入其它设备或账号。菜单键快速应用切换双击菜单键,就能自动切换到上一个应用。此外,如果你不停地点击菜单键的话,就会在所有应用中不间断地轮换,应用窗口会自动放大,顶部还会出现倒计时条,停止点击且倒计时结束后,当前应用会自动放大并返回到前台。Android8.0的正式版 Android Oreo(奥利奥)1.通知中心用户在通知界面可以发现顶部的快捷键有了更充裕的空间,并且根据网络大数据的用户使用频繁度调整了这几个快捷键的顺序;并且长按推送消息可以看到一个开关,操作它可以开启和关闭这个该应用的未来所有通知。2.设置菜单在新的AndroidO系统中,设置的界面有了大幅变化,主菜单的覆盖性变得更广,更多的功能将在子菜单中体现,并且在菜单界面中重新设计了很多图标。3.PinnedShortcuts安卓创造出了PinnedShortcuts功能,类似苹果的3DTouch,长按一个软件后可以弹出子菜单,然后就可以通过这个方式快捷的使用该应用的部分功能。4.图标形状新的系统中开发者可以使用不同的应用图标,比如圆角矩形或者圆形图标,不过所有的图标需要保证是同一个形状,不能有一个方一个圆这样“个性”的样式出现。5.后台限制AndroidO将进一步优化后台程序,减少应用在没完全退出后占用系统的资源,并且减少电量的消耗。6.安装限制新系统中用户可以在权限设置中添加安装限制功能,这样可以有效的避免带有中国特色的“全家桶”行为。7.TensorFlowLite这个新功能并不会直接体现在手机和系统中,它是谷歌的一项新技术,用来把人工智能在更多的软件上继续拓展,并提高工作处理的效率,让你的手机更“聪明”。8.分屏在AndroidO中,分屏画中画功能得到了强化,变得更加流畅,而且悬浮窗可以随意拖动位置,然后在主屏幕中继续工作9.NotificationDots在谷歌的Pixel手机上,安卓8还新加了通知功能Notification Dots,会标出用户的行程、信息等,有些通知还可以被设定为稍后提醒。此外长按某个应用图标现在可以显示一些信息,与iOS上的3D Touch类似,这项功能在安卓7.0上已经有所体现10.SmartTextSelection系统将会预测用户将使用某些电话或者其他选项出现在将会用到的应用中,举个例子就是如果邀请朋友来吃饭,系统会根据发送的地址来开启地图并且导航 。11.自动保存密码这个功能将会保存用户的部分帐号和密码,用于在网站或者应用中的快速登录,效率提升了不少 。12.GooglePlayProtect这个功能主要用于GooglePlay中,下载的应用和游戏将会经过它的排查,来看看是否是有害甚至携带病毒的应用,不过国内用户可能不能访问GooglePlay 。13.应用加速在AndroidO中,大部分应用的启动速度将会快上一倍,这个要归功于新系统的优化,使后台占用资源减少,并且对并发进程等问题的处理更加出色,也是个相当有用的功能 。14.字体优化AndroidO中谷歌还增加了对系统字体的更多支持,开发者可以自行更改字体样式,让用户有了更多字体的选择 。15.表情符号安卓8还带来了符合Unicode 10标准的表情符号,比原来新加超过60个表情符,这也是比较明显的改变之一AndroidP 9.0新功能包括:谷歌统一推送升级、深度集成Project Treble模式、更加封闭、原生支持通话录音等。1.全面屏的全面支持2.通知栏的多种通知3.多摄像头的更多画面4.GPS定位之外的WiFi定位5.网络还有神经网络6.Material Design迎来2.0时代新设计Android 9.0将会新增支持类似于iPhone X的刘海屏设计,具体体现为优化屏幕内容显示,能够让系统或者应用充分利用整块屏幕,尤其是两只“猫耳朵”位置。在Android 9.0系统当中,谷歌还会进一步将谷歌助手集成到应用中、进一步优化电池续航、支持多屏和可折叠屏等。新特性全局黑夜模式为具备Always-on display(屏幕常显)功能手机加入原生的天气支持。参考阅读https://blog.csdn.net/u012758…阅读更多面试官:请你介绍一下你的项目经验Android面试整理(附答案)亡羊补牢,面试时如果发现回答不好,该怎么办?Android快速启动——黑白屏最优解决方案 ...

December 20, 2018 · 1 min · jiezi

2018年Android的保活方案效果统计

一、常见保活方案1、监听广播:监听全局的静态广播,比如时间更新的广播、开机广播、解锁屏、网络状态、解锁加锁亮屏暗屏(3.1版本),高版本需要应用开机后运行一次才能监听这些系统广播,目前此方案失效。可以更换思路,做APP启动后的保活(监听广播启动保活的前台服务)2、定时器、JobScheduler:假如应用被系统杀死,那么定时器则失效,此方案失效。JobService在5.0,5.1,6.0作用很大,7.0时候有一定影响(可以在电源管理中给APP授权)3、双进程(NDK方式Fork子进程)、双Service守护:高版本已失效,5.0起系统回收策略改成进程组。双Service方案也改成了应用被杀,任何后台Service无法正常状态运行4、提高Service优先级:只能一定程度上缓解Service被立马回收二、保活1、AIDL方式单进程、双进程方式保活Service2、降低oom_adj的值:常驻通知栏(可通过启动另外一个服务关闭Notification,不对oom_adj值有影响)、使用”1像素“的Activity覆盖在getWindow()的view上、循环播放无声音频(黑科技,7.0下杀不掉)3、监听锁屏广播:使Activity始终保持前台4、使用自定义锁屏界面:覆盖了系统锁屏界面。5、通过android:process属性来为Service创建一个进程6、跳转到系统白名单界面让用户自己添加app进入白名单三、复活1、JobScheduler:原理类似定时器,5.0,5.1,6.0作用很大,7.0时候有一定影响(可以在电源管理中给APP授权)2、推送互相唤醒复活:极光、友盟、以及各大厂商的推送3、同派系APP广播互相唤醒:比如今日头条系、阿里系方案实现效果统计1、双进程守护方案(基于onStartCommand() return START_STICKY)1、原生5.0、5.1:原生任务栏滑动清理app,Service会被杀掉,然后被拉起,接着一直存活2、金立F100(5.1):一键清理直接杀掉整个app,包括双守护进程。不手动清理情况下,经测试能锁屏存活至少40分钟3、华为畅享5x(6.0):一键清理直接杀掉整个app,包括双守护进程。不手动清理下,锁屏只存活10s。结论:双进程守护方案失效。4、美图m8s(7.1.1):一键清理直接杀掉整个app,包括双守护进程。不清理情况下,锁屏会有被杀过程(9分钟左右被杀),之后重新复活,之后不断被干掉然后又重新复活。结论:双守护进程可在后台不断拉起Service。5、原生7.0:任务栏清除APP后,Service存活。使用此方案后Service照样存活。6、LG V30+(7.1.2):不加双进程守护的时候,一键清理无法杀掉服务。加了此方案之后也不能杀掉服务,锁屏存活(测试观察大于50分钟)7、小米8(8.1):一键清理直接干掉app并且包括双守护进程。不清理情况下,不加守护进程方案与加守护进程方案Service会一直存活,12分钟左右closed。结论:此方案没有起作用结论:除了华为此方案无效以及未更改底层的厂商不起作用外(START_STICKY字段就可以保持Service不被杀)。此方案可以与其他方案混合使用2、监听锁屏广播打开1像素Activity(基于onStartCommand() return START_STICKY)1、原生5.0、5.1:锁屏后3s服务被干掉然后重启(START_STICKY字段起作用)2、华为畅享5x(6.0):锁屏只存活4s。结论:方案失效。3、美图m8s(7.1.1):同原生5.04、原生7.0:同美图m8s。5、LG V30+(7.1.2):锁屏后情况跟不加情况一致,服务一致保持运行,结论:此方案不起作用6、小米8(8.1):关屏过2s之后app全部被干掉。结论:此方案没有起作用结论:此方案无效果3、故意在后台播放无声的音乐(基于onStartCommand() return START_STICKY)1、原生5.0、5.1:锁屏后3s服务被干掉然后重启(START_STICKY字段起作用)2、华为畅享5x(6.0):一键清理后服务依然存活,需要单独清理才可杀掉服务,锁屏8分钟后依然存活。结论:此方案适用3、美图m8s(7.1.1):同5.04、原生7.0:任务管理器中关闭APP后服务被干掉,大概过3s会重新复活(同仅START_STICKY字段模式)。结论:看不出此方案有没有其作用5、LG V30+(7.1.2):使用此方案前后效果一致。结论:此方案不起作用6、小米8(8.1):一键清理可以杀掉服务。锁屏后保活超过20分钟结论:成功对华为手机保活。小米8下也成功突破20分钟4、使用JobScheduler唤醒Service(基于onStartCommand() return START_STICKY)1、原生5.0、5.1:任务管理器中干掉APP,服务会在周期时间后重新启动。结论:此方案起作用2、华为畅享5x(6.0):一键清理直接杀掉APP,过12s左右会自动重启服务,JobScheduler起作用3、美图m8s(7.1.1):一键清理直接杀掉APP,无法自动重启4、原生7.0:同美图m8s(7.1.1)5、小米8(8.1):同美图m8s(7.1.1)结论:只对5.0,5.1、6.0起作用5、混合使用的效果,并且在通知栏弹出通知1、原生5.0、5.1:任务管理器中干掉APP,服务会在周期时间后重新启动。锁屏超过11分钟存活2、华为畅享5x(6.0):一键清理后服务依然存活,需要单独清理才可杀掉服务。结论:方案适用。3、美图m8s(7.1.1):一键清理APP会被杀掉。正常情况下锁屏后服务依然存活。4、原生7.0:任务管理器中关闭APP后服务被干掉,过2s会重新复活5、小米8(8.1):一键清理可以杀掉服务,锁屏下后台保活时间超过38分钟6、荣耀10(8.0):一键清理杀掉服务,锁屏下后台保活时间超过23分钟结论:高版本情况下可以使用弹出通知栏、双进程、无声音乐提高后台服务的保活概率实现具体过程一、双进程实现方案使用AIDL绑定方式新建2个Service优先级(防止服务同时被系统杀死)不一样的守护进程互相拉起对方,并在每一个守护进程的ServiceConnection的绑定回调里判断保活Service是否需要重新拉起和对守护线程进行重新绑定。1、新建一个AIDL文件KeepAliveConnectioninterface KeepAliveConnection {}2、新建一个服务类StepService,onBind()方法返回new KeepAliveConnection.Stub()对象,并在ServiceConnection的绑定回调中对守护进程服务类GuardService的启动和绑定。/** * 主进程 双进程通讯 * * @author LiGuangMin * @time Created by 2018/8/17 11:26 /public class StepService extends Service { private final static String TAG = StepService.class.getSimpleName(); private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Logger.d(TAG, “StepService:建立链接”); boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(); if (!isServiceRunning) { Intent i = new Intent(StepService.this, DownloadService.class); startService(i); } } @Override public void onServiceDisconnected(ComponentName componentName) { // 断开链接 startService(new Intent(StepService.this, GuardService.class)); // 重新绑定 bindService(new Intent(StepService.this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT); } }; @Nullable @Override public IBinder onBind(Intent intent) { return new KeepAliveConnection.Stub() { }; } @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(1, new Notification()); // 绑定建立链接 bindService(new Intent(this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT); return START_STICKY; }}3、对守护进程GuardService进行和2一样的处理/* * 守护进程 双进程通讯 * * @author LiGuangMin * @time Created by 2018/8/17 11:27 /public class GuardService extends Service { private final static String TAG = GuardService.class.getSimpleName(); private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Logger.d(TAG, “GuardService:建立链接”); boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(); if (!isServiceRunning) { Intent i = new Intent(GuardService.this, DownloadService.class); startService(i); } } @Override public void onServiceDisconnected(ComponentName componentName) { // 断开链接 startService(new Intent(GuardService.this, StepService.class)); // 重新绑定 bindService(new Intent(GuardService.this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT); } }; @Nullable @Override public IBinder onBind(Intent intent) { return new KeepAliveConnection.Stub() { }; } @Override public int onStartCommand(Intent intent, int flags, int startId) { startForeground(1, new Notification()); // 绑定建立链接 bindService(new Intent(this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT); return START_STICKY; }}4、在Activity中在启动需要保活的DownloadService服务后然后启动保活的双进程public class MainActivity extends AppCompatActivity { private TextView mShowTimeTv; private DownloadService.DownloadBinder mDownloadBinder; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mDownloadBinder = (DownloadService.DownloadBinder) service; mDownloadBinder.setOnTimeChangeListener(new DownloadService.OnTimeChangeListener() { @Override public void showTime(final String time) { runOnUiThread(new Runnable() { @Override public void run() { mShowTimeTv.setText(time); } }); } }); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this, DownloadService.class); startService(intent); bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); //双守护线程,优先级不一样 startAllServices(); } @Override public void onContentChanged() { super.onContentChanged(); mShowTimeTv = findViewById(R.id.tv_show_time); } @Override protected void onDestroy() { super.onDestroy(); unbindService(mServiceConnection); } /* * 开启所有守护Service / private void startAllServices() { startService(new Intent(this, StepService.class)); startService(new Intent(this, GuardService.class)); }}二、监听到锁屏广播后使用“1”像素Activity提升优先级1、该Activity的View只要设置为1像素然后设置在Window对象上即可。在Activity的onDestroy周期中进行保活服务的存活判断从而唤醒服务。“1像素"Activity如下public class SinglePixelActivity extends AppCompatActivity { private static final String TAG = SinglePixelActivity.class.getSimpleName(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window mWindow = getWindow(); mWindow.setGravity(Gravity.LEFT | Gravity.TOP); WindowManager.LayoutParams attrParams = mWindow.getAttributes(); attrParams.x = 0; attrParams.y = 0; attrParams.height = 1; attrParams.width = 1; mWindow.setAttributes(attrParams); ScreenManager.getInstance(this).setSingleActivity(this); } @Override protected void onDestroy() { if (!SystemUtils.isAppAlive(this, Constant.PACKAGE_NAME)) { Intent intentAlive = new Intent(this, DownloadService.class); startService(intentAlive); } super.onDestroy(); }}2、对广播进行监听,封装为一个ScreenReceiverUtil类,进行锁屏解锁的广播动态注册监听public class ScreenReceiverUtil { private Context mContext; private SreenBroadcastReceiver mScreenReceiver; private SreenStateListener mStateReceiverListener; public ScreenReceiverUtil(Context mContext) { this.mContext = mContext; } public void setScreenReceiverListener(SreenStateListener mStateReceiverListener) { this.mStateReceiverListener = mStateReceiverListener; // 动态启动广播接收器 this.mScreenReceiver = new SreenBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_USER_PRESENT); mContext.registerReceiver(mScreenReceiver, filter); } public void stopScreenReceiverListener() { mContext.unregisterReceiver(mScreenReceiver); } /* * 监听sreen状态对外回调接口 / public interface SreenStateListener { void onSreenOn(); void onSreenOff(); void onUserPresent(); } public class SreenBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (mStateReceiverListener == null) { return; } if (Intent.ACTION_SCREEN_ON.equals(action)) { // 开屏 mStateReceiverListener.onSreenOn(); } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 锁屏 mStateReceiverListener.onSreenOff(); } else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 解锁 mStateReceiverListener.onUserPresent(); } } }}3、对1像素Activity进行防止内存泄露的处理,新建一个ScreenManager类public class ScreenManager { private static final String TAG = ScreenManager.class.getSimpleName(); private static ScreenManager sInstance; private Context mContext; private WeakReference<Activity> mActivity; private ScreenManager(Context mContext) { this.mContext = mContext; } public static ScreenManager getInstance(Context context) { if (sInstance == null) { sInstance = new ScreenManager(context); } return sInstance; } /* 获得SinglePixelActivity的引用 * @param activity / public void setSingleActivity(Activity activity) { mActivity = new WeakReference<>(activity); } /* * 启动SinglePixelActivity / public void startActivity() { Intent intent = new Intent(mContext, SinglePixelActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } /* * 结束SinglePixelActivity / public void finishActivity() { if (mActivity != null) { Activity activity = mActivity.get(); if (activity != null) { activity.finish(); } } }}4、对1像素的Style进行特殊处理,在style文件中新建一个SingleActivityStyle<style name=“SingleActivityStyle” parent=“android:Theme.Holo.Light.NoActionBar”> <item name=“android:windowBackground”>@android:color/transparent</item> <item name=“android:windowFrame”>@null</item> <item name=“android:windowNoTitle”>true</item> <item name=“android:windowIsFloating”>true</item> <item name=“android:windowContentOverlay”>@null</item> <item name=“android:backgroundDimEnabled”>false</item> <item name=“android:windowAnimationStyle”>@null</item> <item name=“android:windowDisablePreview”>true</item> <item name=“android:windowNoDisplay”>false</item>5、让SinglePixelActivity使用singleInstance启动模式,在manifest文件中 <activity android:name=".activity.SinglePixelActivity” android:configChanges=“keyboardHidden|orientation|screenSize|navigation|keyboard” android:excludeFromRecents=“true” android:finishOnTaskLaunch=“false” android:launchMode=“singleInstance” android:theme="@style/SingleActivityStyle" />6、在保活服务类DownloadService中对监听的广播进行注册和对SinglePixelActivity进行控制。public class DownloadService extends Service { public static final int NOTICE_ID = 100; private static final String TAG = DownloadService.class.getSimpleName(); private DownloadBinder mDownloadBinder; private NotificationCompat.Builder mBuilderProgress; private NotificationManager mNotificationManager; private ScreenReceiverUtil mScreenListener; private ScreenManager mScreenManager; private Timer mRunTimer; private int mTimeSec; private int mTimeMin; private int mTimeHour; private ScreenReceiverUtil.SreenStateListener mScreenListenerer = new ScreenReceiverUtil.SreenStateListener() { @Override public void onSreenOn() { mScreenManager.finishActivity(); Logger.d(TAG, “关闭了1像素Activity”); } @Override public void onSreenOff() { mScreenManager.startActivity(); Logger.d(TAG, “打开了1像素Activity”); } @Override public void onUserPresent() { } }; private OnTimeChangeListener mOnTimeChangeListener; @Override public void onCreate() { super.onCreate();// 注册锁屏广播监听器 mScreenListener = new ScreenReceiverUtil(this); mScreenManager = ScreenManager.getInstance(this); mScreenListener.setScreenReceiverListener(mScreenListenerer); mDownloadBinder = new DownloadBinder(); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Logger.d(TAG, “onStartCommand”); startRunTimer(); return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return mDownloadBinder; } @Override public boolean onUnbind(Intent intent) { Logger.d(TAG, “onUnbind”); return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (mManager == null) { return; } mManager.cancel(NOTICE_ID); stopRunTimer();// mScreenListener.stopScreenReceiverListener(); } private void startRunTimer() { TimerTask mTask = new TimerTask() { @Override public void run() { mTimeSec++; if (mTimeSec == 60) { mTimeSec = 0; mTimeMin++; } if (mTimeMin == 60) { mTimeMin = 0; mTimeHour++; } if (mTimeHour == 24) { mTimeSec = 0; mTimeMin = 0; mTimeHour = 0; } String time = “时间为:” + mTimeHour + " : " + mTimeMin + " : " + mTimeSec; if (mOnTimeChangeListener != null) { mOnTimeChangeListener.showTime(time); } Logger.d(TAG, time); } }; mRunTimer = new Timer(); // 每隔1s更新一下时间 mRunTimer.schedule(mTask, 1000, 1000); } private void stopRunTimer() { if (mRunTimer != null) { mRunTimer.cancel(); mRunTimer = null; } mTimeSec = 0; mTimeMin = 0; mTimeHour = 0; Logger.d(TAG, “时间为:” + mTimeHour + " : " + mTimeMin + " : " + mTimeSec); } public interface OnTimeChangeListener { void showTime(String time); } public class DownloadBinder extends Binder { public void setOnTimeChangeListener(OnTimeChangeListener onTimeChangeListener) { mOnTimeChangeListener = onTimeChangeListener; } }}3、在后台播放音乐1、准备一段无声的音频,新建一个播放音乐的Service类,将播放模式改为无限循环播放。在其onDestroy方法中对自己重新启动。public class PlayerMusicService extends Service { private final static String TAG = PlayerMusicService.class.getSimpleName(); private MediaPlayer mMediaPlayer; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Logger.d(TAG, TAG + “—->onCreate,启动服务”); mMediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.silent); mMediaPlayer.setLooping(true); } @Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable() { @Override public void run() { startPlayMusic(); } }).start(); return START_STICKY; } private void startPlayMusic() { if (mMediaPlayer != null) { Logger.d(TAG, “启动后台播放音乐”); mMediaPlayer.start(); } } private void stopPlayMusic() { if (mMediaPlayer != null) { Logger.d(TAG, “关闭后台播放音乐”); mMediaPlayer.stop(); } } @Override public void onDestroy() { super.onDestroy(); stopPlayMusic(); Logger.d(TAG, TAG + “—->onCreate,停止服务”); // 重启自己 Intent intent = new Intent(getApplicationContext(), PlayerMusicService.class); startService(intent); }}2、 在保活的DownloadServie服务类的onCreate方法中对PlayerMusicService进行启动 Intent intent = new Intent(this, PlayerMusicService.class); startService(intent);3、在Manifest文件中进行注册 <service android:name=".service.PlayerMusicService" android:enabled=“true” android:exported=“true” android:process=":music_service" />4、使用JobScheduler唤醒Service1、新建一个继承自JobService的ScheduleService类,在其onStartJob回调中对DownloadService进行存活的判断来重启。public class ScheduleService extends JobService { private static final String TAG = ScheduleService.class.getSimpleName(); @Override public boolean onStartJob(JobParameters params) { boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(); if (!isServiceRunning) { Intent i = new Intent(this, DownloadService.class); startService(i); Logger.d(TAG, “ScheduleService启动了DownloadService”); } jobFinished(params, false); return false; } @Override public boolean onStopJob(JobParameters params) { return false; }}2、 在DownloadService服务类中进行JobScheduler的注册和使用 /* * 使用JobScheduler进行保活 */ private void useJobServiceForKeepAlive() { JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); if (jobScheduler == null) { return; } jobScheduler.cancelAll(); JobInfo.Builder builder = new JobInfo.Builder(1024, new ComponentName(getPackageName(), ScheduleService.class.getName())); //周期设置为了2s builder.setPeriodic(1000 * 2); builder.setPersisted(true); builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); int schedule = jobScheduler.schedule(builder.build()); if (schedule <= 0) { Logger.w(TAG, “schedule error!”); } }3、在manifest文件中进行权限设置 <service android:name=".service.ScheduleService" android:enabled=“true” android:exported=“true” android:permission=“android.permission.BIND_JOB_SERVICE” />关于推送类拉活根据华为官方文档集成HUAWEI Push1、华为畅玩5X(6.0):APP全部进程被杀死时可以被拉起。2、华为nove 3e(8.0):APP全部进程被杀死时无法被拉起,能收到推送。3、华为荣耀10(8.1):同2结论:理论情况下,华为推送应该可以拉起华为机器才对,感觉是我没花钱的原因补充:ServiceAliveUtils 类如下public class ServiceAliveUtils { public static boolean isServiceAlice() { boolean isServiceRunning = false; ActivityManager manager = (ActivityManager) MyApplication.getMyApplication().getSystemService(Context.ACTIVITY_SERVICE); if (manager == null) { return true; } for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (“demo.lgm.com.keepalivedemo.service.DownloadService”.equals(service.service.getClassName())) { isServiceRunning = true; } } return isServiceRunning; }}作者:minminaya链接:https://www.jianshu.com/p/b53…阅读更多做后台是选择Java 、Go ,还是 PHP?NDK项目实战—高仿360手机助手之卸载监听AndroidUtils:Android开发不得不收藏的Utils(Android)面试题级答案(精选版)Google开发者大会:你不得不知的Tensorflow小技巧相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术! ...

September 29, 2018 · 6 min · jiezi