Android开发入门的正确姿势

在进行Android开发之前,我们先了解一下Android的生态圈现状。Android系统是开源的,任何手机厂商和开发者都有权限去修改系统源代码,定制专属的系统。

这就产生了一个问题,不同手机厂商之间的ROM可能无法安装在对方厂商的手机上,而每个厂商生产的手机型号又多种多样(硬件配置和屏幕尺寸,而屏幕尺寸又会导致UI的适配性问题),Google将Android权限开放带来的结果就是Android的碎片化问题。先看一下当前Android系统版本的分布情况:

Android 8.0开发者预览版已经发布,在下个月的Google I/O大会上将会正式发布,但Android系统的升级速度与iOS相比实在太慢了,去年发布的7.0至今占有率还不到5%,这主要取决于各个手机厂商对系统的适配升级。

前面提到过手机厂商的手机型号问题,每个厂商的手机型号都会有自己的定位,通过硬件配置和屏幕尺寸来确定每款手机的定位。再看一下屏幕尺寸的分布情况:

对于开发者而言,我们更关注的是屏幕尺寸和系统版本:APP的UI布局需要保证在不同尺寸的屏幕上能够正常显示,不会出现布局错乱的情况;开发过程中需要针对不同系统版本的特性做相应的逻辑适配,比如Android 6.0权限的动态申请等。

用户在使用APP的时候,与用户交互的每一个完整的页面都可以看做是一个场景,而我们的APP也就是由若干个场景组成的。那在Android中,承载这个场景的是什么呢?下面引出Android中的第一个组件:Activity。

Activity可以看作是MVC中的Controller的角色,负责场景UI的加载以及场景的切换。那场景加载的UI从哪里来呢?在开发过程中有两种选择:(1)在代码中去完成UI的布局,目前iOS开发主要就是通过这种方式来布局的;(2)使用xml来完成布局。在Android开发中,更推荐使用第二种方式来完成静态框架的布局,xml布局方式在布局的过程中便可以预览到布局的效果,这种可视化的布局方式也方便来做屏幕的适配。布局的xml文件位于layout目录下,这个目录存放了我们APP中使用的布局文件。通常我们不会针对不同的屏幕做多套布局,而是使用一套布局文件,添加各种约束来适应不同的屏幕。

在APP的某一个场景也就是Activity中,如果希望用户的某些操作能够通知到其它的场景,或者接收系统的一些通知行为,那就需要由广播来实现,这是我们需要介绍的第二个组件——广播。由系统发出的广播,比如收到短信或者电话这类的广播,任何应用都有权限去捕获这类广播,称为系统广播;还有一类广播只针对应用本身发出,用于应用内部传递消息,其它应用没有捕获的权限,这类广播称为本地广播。从安全性角度来说,APP内最好使用本地广播,而且更高效。

如果我们的应用在没有启动的时候也需要接收一些系统事件,比如短信,那我们需要将广播注册成常驻广播,在系统发出相应的广播后,我们注册的BroadcastReceiver会接收到这个广播来进行处理。在收到某些系统广播后,如果我们需要在后台做一些数据上报之类的操作,这些操作不需要用户感知,也不需要UI与用户交互,那我们可以通过Service组件来实现。

Service运行在后台,用户不可见,我们可以将一些耗时的操作放在Service中完成,这里需要注意的是Service是运行在主线程的,如果在Service中需要处理特别耗时的操作,需要开启线程来执行,否则会出现ANR。Activity可以与Service进行关联,即使Activity被销毁后,也可以重新进行关联,获取后台任务的执行状态。

Android中还有一个ContentProvider组件,虽然是四大组件之一,但它的使用频率并没有其它三个那么高。如果你的APP不会提供数据与其它应用交互,并且也不会访问系统的一些数据资源,可能会很少用到这个组件。ContentProvider可以看做是对底层数据的封装,提供了增、删、改、查的操作接口,避免了直接提供数据库权限带来的安全性问题。

一个完整的Android应用会由上述组件中的若干个组成,而组件在使用时必须要先注册,每一个Android应用都由一个AndroidManifest文件,该文件是一个应用的组件注册表,注册了所有在应用中使用到的组件。除了组件之外,应用使用到的权限也必须在该文件中声明。

由于屏幕的尺寸和分辨率比较分散,同一个icon在不同的手机上显示效果也就不同,因此对于图片资源需要针对不同的分辨率做适配。通常设计师只会出一套iOS的资源,包括2x,3x的尺寸,那这些尺寸的资源如何对应到Android上呢?可以直接将2x资源放在xhdpi目录下,3x资源放在xxhdpi目录下,如果对应的目录下没有资源,Android系统会自动根据当前屏幕的分辨率来选择最合适的资源加载,不会出现资源找不到的情况。

简单总结一下:

1、Android应用由四大组件(Activity、Broadcast、Service、ContentProvider)中的若干个组合而成,与用户直接交互的场景由Activity来实现。

2、使用的组件必须在AndroidManifest文件中注册,相应的权限也必须进行声明。

3、布局文件放在layout目录下,布局尽可能的保证控件的约束能够适应不同的屏幕尺寸。

4、资源文件可以复用iOS的资源,2x和3x分别放在xhdpi和xxhdpi目录下。

5、没有了

以上只是简单的介绍了如何从0开始做Android开发时,先有一个整体的了解,并没有涉及到如何去使用这些组件构建Android应用。对于Android开发的初学者,先有一个大概的框架认识,然后再去详细了解每一部分,逐步深入。

参考资料

系统版本的分布和屏幕尺寸的分布由Google提供,会定期做更新,参考链接:https://developer.android.com/about/dashboards/index.html

原文链接:

编辑于

刘宁的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

Twitter工程师聊JS

本文是Twitter软件工程师Bonnie Eisenman对JS现状的看法和对开发者的一点建议 01 关于框架 框架的目标是减少繁琐的工作,是基础的脚手架...

3356
来自专栏Flutter入门到实战

全面总结国内BATH等大厂开源的安卓有关的库(持续更新中...)

UltraViewPager 是阿里开源的一个封装多种特性的 ViewPager ,主要是为多页面切换场景提供统一解决方案。

1212
来自专栏张善友的专栏

Msdn 杂志 asp.net ajax 文章汇集

asp.net ajax 充分利用客户端 JavaScript、DHTML 和 XMLHttpRequest 对象。其目的是帮助开发人员创建更具交互性的支持 A...

1808
来自专栏Crossin的编程教室

爬虫必备工具,掌握它就解决了一半的问题

网上爬虫的教程实在太多了,去知乎上搜一下,估计能找到不下一百篇。大家乐此不疲地从互联网上抓取着一个又一个网站。但只要对方网站一更新,很可能文章里的方法就不再有效...

872
来自专栏信安之路

Google Calaboratory 的另一个 XSS 漏洞

三个月以前,我写了一篇文章来介绍我在 Google Colaboratory 上发现的一个 XSS 漏洞,这篇文章是对前文的一些扩展,并且展示了我在同一个 we...

654
来自专栏ThoughtWorks

高效快速地加载 AngularJS 视图|TW洞见

今日洞见 文章作者、部分图片来自ThoughtWorks:陈计节。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体...

2947
来自专栏前端小作坊

第三方Javascript开发系列之投放代码

本文先从第三方Javascript脚本的重要组成部分“投放代码”讲起。先从一个最例子看起:Google Analytics(以下简称GA),是Google提供的...

772
来自专栏较真的前端

十几行代码就可以让你的微信小程序挂掉

mpvue是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue修改了 Vue.js 的 runtime 和 compiler...

262
来自专栏Python数据科学

Python爬虫之撩妹篇—微信实时爬取电影咨询

“ 本文将介绍如何使用爬虫在微信对话中实现实时的电影咨询爬取功能,希望和大家一起来分享”

852
来自专栏编程坑太多

python3爬新浪新闻

1357

扫码关注云+社区