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 条评论
登录 后参与评论

相关文章

来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

3020
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5278
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3705
来自专栏落花落雨不落叶

canvas画简单电路图

88711
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

6068
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2787
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5667
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3025
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2946

扫码关注云+社区