2024年android开发范例实战宝典

android开发范例实战宝典Android 意外的诞生 Android 和 Linux 一样 一个人完成雏形的编码 巨头林立中称之为意外 Windows Mobile Windows Mobile 是微软针对移动产品而开发的精简操作系统 Pocket PC 2000 2000 年 4 月 19 日 Mobile 6 5 2009 年 2 月发布 外链图片转存失败 源站可能有防盗链机制

Android意外的诞生

Android和Linux一样,一个人完成雏形的编码,巨头林立中称之为意外

Windows Mobile

Windows Mobile是微软针对移动产品而开发的精简操作系统

Pocket PC 2000

2000年4月19日

image

Mobile 6.5

2009年2月发布

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sd43yzuw-34)(https://cdn.arstechnica.net/wp-content/uploads/2009/10/htc_winmo65_ars.jpg)]

Kin

Microsoft Kin标榜为社交电话. 这些功能跨越功能手机的门槛[7],可以使用Facebook, Twitter, Windows Live, and MySpace等社群.

2010年5月13发布

image

2010年6月30日终止

微软公司的官员告诉《纽约时报》说,他们对Verizon推动Kin的发展不够积极感到遗憾。仅上市48天。

Verizon,是一家美国移动网络运营商

Windows Phone

Windows Phone具有桌面定制、图标拖拽、滑动控制等一系列前卫的操作体验。

微软在该系统中使用了叫做Metro UI(后改名Modern)的新界面,完全改变了应用封装格式,所以Windows Phone 7的应用与Windows Mobile应用完全不兼容。

2010年10月11日晚上9点30分发布

image

CLR公共语言Runtime

Windows Phone使用.NET CLR来应用程序,CLR是Common Language Runtime的简称,和Java虚拟机一样也是一个Runtime环境;Windows Phone 7所有第三方程序均要经过CLR来运行。与Windows Phone 7不同的是,微软的Windows Phone 8采用与Windows 8相同的NT内核,可不经CLR直接运行原生码桯式;换上新内核的Windows Phone 8开始向所有开发者开放原生代码(C和C++),应用的性能将得到大幅提升。因此Windows Phone 8几乎兼容所有Windows Phone 7.X的应用程序,但Windows Phone 7.X无法运行为Windows Phone 8开发的所有原生程序。

软体结构体系

Windows Phone 7中的软件层,即软件结构体系,主要由两个部分组成,它们分别是Screen部分和Cloud部分。而Screen部分和Cloud部分则又分别由不同的部分组成,Screen部分由“Tool and Support”和“Runtimes”组成,Cloud则由“Developer Portal Services”和“Cloud Service”组成。Screen部分可以理解为本地,Cloud部分可以理解为云端,它们都是Windows Phone 7软件体系中不可缺少的部分。

Screen部分中的“Tool and Support”是开发应用所必需的开发工具和技术支持,“Runtimes”则是开发应用的Framework,提供所需要的API和功能。Windows Phone 7提供了两种框架,分别是Silverlight Framework与XNA Framework。

Silverlight Framework是以XAML文件为基础的应用程序设计框架,用来开发基本应用、网络应用、多媒体应用和控件。

XNA Framework则是用来开发基础的游戏设计框架,用来开发2D游戏、3D游戏和游戏控件。

Silverlight Framework和XNA

Framework都是在.NET平台上的应用程序开发架构,能够有效率地协助开发人员开发应用程序,而且开发人员只要稍微修改现有的Silverlight应用程序或XNA应用程序,就可以将Silverlight应用程序或XNA应用程序移植到Windows Phone 7上执行。

Cloud部分中的“Developer Portal

Services”是开发者开发应用程序所必需的注册账号、认证、发布、更新管理以及Market Place的付费管理,由于Windows Phone 7开发必须拥有注册的账号才能进行真机测试,否则只能在模拟器上进行测试。“Cloud Service”则是云端服务所需要的服务器API。

编程语言

微软当前只允许开发者使用C#和Visual Basic来进行Windows Phone 7的应用开发。此外,在Windows Phone 7应用程序的开发中不允许使用Native Code,也不允许使用C/C++语言(Windows Phone 8已经向开发者开放了C/C++),每个程序安装包(.xap)的大小最大只允许400MB,同时微软也对应用程序占用的RAM大小也做出了相应的限制。

开发限制

微软为了规范Windows Phone的用户体验,对开发者开发应用进行了严格的约束,开发者必须严格遵循这些开发约束和条款来进行应用开发。例如,开发者不能开发涉及到手机摄像头的应用程序;开发者不能对应用程序的界面进行私自的定制;涉及到系统类的应用必须使用系统提供的界面来运行。

Android

2005年4000万美元收购

开源节点

在2007年11月5日,Google公司正式向外界展示了这款名为Android的操作系统,并在这天Google建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。这一联盟将支持谷歌发布的手机操作系的统以及应用软件,并共同开发Android系统的开放代码。此时,Android系统的定位已确定,基于Linux、开源、免费供手机厂商使用等,谷歌则将其服务深度集成在系统中以获取利润。

1.1

2008年9月22号发布的Android第一版。HTC Dream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZuykNbd-37)(https://cnet4.cbsistatic.com/img/7b3e2PtMAM7BchfLuji77UjX404=/980x551/2018/08/31/4bd92183-19fb-4bff-8169-363b65e71ac1/g1-use-3602.jpg)]

2009年4月发布Android 1.6

image

HTC顶峰时期HTC Hero

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPiRIr2Q-38)(https://www.androidcentral.com/sites/androidcentral.com/files/deviceimages/samsung-galaxy-s.png)]

Galaxy S

2.3.x

Gingerbread(姜饼) :2010年12月7日发布。

IOS

iPhone OS 1

2007年 6月

乔布斯在2007年推出了首款iPhone,那时,为它提供服务支持的软件,还只是被附属简单地提及了一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0OGtuYx-38)(https://d2um6umu4gwssp.cloudfront.net/apple/wp-content/uploads/2016/06/iphone-1.jpg)]

iPhone OS 2

2008年 7月

故事的另一个结果是“AppStore”出现了:它将数百万的 iTunes Music 用户转变为潜在的App用户。

在iPhone OS诞生初期,还没有应用商店可供下载第三方的应用程序。乔布斯在当时鼓励开发者开发网页应用而不是原生应用,导致在当时应用程序质量不高,功能有限。直到几个月后,苹果改变了主意,并在2008年3月发布了第一款iOS软件开发包。并在当年7月推出App Store,这是iOS历史上的一个重要里程碑,它的出现开启了iOS和整个移动应用时代。

收入三七分成的制度和良好的生态环境迅速吸引了大量开发者。很快,iPhone几乎变成了一款“万能”的手机:量角器,水平仪,游戏机,其中还不乏一些相当具有逼格的“喝啤酒”,“吹蜡烛”等游戏。并且在此后的几年中苹果不停地完善App Store的功能。直到现在,App Store里的应用数量都是苹果自己最值得骄傲的地方之一。

iPhone OS 3 / iOS 3

2009年6月

新版本的 iOS 带来了许多新功能,比如复制粘贴、著名的 Spotlight 搜索和语音控制。

除此之外,App还出现了备受争议的新外观:拟物设计(skeuomorphism)。

iOS 4

2010年 6月全新的高分辨率Retina屏幕。

IOS7 2013年扁平化, Android则是2014年6月25日5.0版本

Dark主题2015年Marshmallow被移除

塞班

1980年David Potter成立Psion公司。1998年在爱立信、诺基亚、摩托罗拉和Psion的共同合作下成立塞班公司。1999年塞班公司推出Symbian OS v5.x操作系统。2000年全球第一款Symbian系统手机:爱立信R380正式出售。

2001年塞班公司推出Symbian OS v6.x。2003年推出 v7.x4,创始人之一的摩托罗拉退出塞班公司。2004年推出 v8.x版,2005年升级为 v9.x版。

2006年全球Symbian手机总量达到一亿部。2008年诺基亚收购塞班公司,塞班成为诺基亚独占系统。

2009年LG、索尼爱立信等各大厂商纷纷宣布退出塞班平台,转而投入新系统领域。至2010年塞班仅剩诺基亚一家支持。

2011年3月,Symbian被传“开源”,之后更名为诺基亚Belle。11月,塞班在全球的市场占有率降至22.1%,霸主地位已彻底被Android取代,中国市场占有率则降为23%。12月21日,诺基亚宣布放弃Symbian品牌。

2008年发布。Series 60第五版

俗称:S60v5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohfhjBWU-41)(https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRO-f7kHUaLqXX2DNJokCA_9Niy7VDTc_BM7zDfoexPE6hetIP_)]

Chrome

2008年9月2日发布beta测试版本

V8 (JavaScript引擎)

V8在运行之前将JavaScript编译成了机器代码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。

Android Runtime(缩写为ART)

2013年10月31日年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术。ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序出错以及性能分析。

2013年3月13日Google官方发布博客文章称,安迪·鲁宾将离开Android部门而转向公司内的其它事务。其原职位由Chrome部门副主管桑德尔·皮蔡兼任。此举也引发了外界对Google日后是否会将Chrome与Android整合的猜想。[4]

其他历史节点:

2006年10月,谷歌以16.5亿美元收购影音内容分享网站YouTube,这是谷歌公司成立以来最大笔的并购。

2012年5月,谷歌以125亿美元收购摩托罗拉移动。

2013年10月3日,谷歌收购Flutter,该公司的主要业务是手势识别技术。

2015年4月,谷歌获得防剧透系统专利。

正文

读过万历十五年的人都清楚,万历十五年并没有发生什么记录史册的大事。谈不是什么开国,安史之乱,伐纣什么的大事。但我们要记得2007年这个节点,它是现在格局的关键因素。

前置:

现在有一个问题是如何向非Android开发解释Android是个什么东西。《大象 Thinking In UML》里对面向对象几个特点的描述非常棒,我也尝试映射一下各端开发自己理解的隐喻。

前端面向的最终是视图,也就是,无论你写了多美丽的代码和算法,最后展示给用户的就是你的界面,就是设计给你的那个界面。

后台面向需要渲染成各种格式的数据,xml, json等,后端需要给前端需要的数据格式,例如列表数据[{},{}]。

Java程序员其实很容易互相做彼此的工作。所以18年移动端寒冬之后,很多Android转了后台开发,SpringBoot降低了门槛,尴尬的是android没有Spring套装给后台入门。

那我们明白了Android的最终的工作就是“渲染”页面,那来看看Android的视图怎么组织

<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> 

页面上居中显示一行正文Hello World!

感觉还可以,就是比html复杂了一点

<html>
<p>Hello World</p>
</html>

假如后台的数据交换方式是xml, Android可以直接解析返回的xml, 然后直接渲染出界面。但是好像没人这么用。很早之前,前后端不分离的时候,后台貌似也需要渲染jsp内嵌的格式是html。大致大家都可以称之为DOM,就是document,代表了你的布局文件。

var a = document.getElementById("id"); val tvHello = root.findViewById<TextView>(R.id.tv_hello) 

我们姑且将xml布局称之为画布,因为它唯一提供核心的东西就是Canvas对象。

那么画布没有被展开之前,谁也看不到,所以需要一个画板,将画布展开。另外的比喻就是剪纸,xml就是剪纸,需要贴在窗户上,我们称之为Window。这个概念在前端也有,在IOS应该也是存在的。到这其实大家的概念和做法都差不多,谁都有Canvas::draw方法。

但在承载window的时候就有些分歧了

我们拿Android的亲兄弟Chrome做对比,看看想不想双胞胎

Chrome吃内存,Android吃内存
Chrome一个标签,一项任务就是一个独立进程,Android一个程序就是一个独立进程,一个程序可以存在多个进程。
Chrome插件是单独进程,Android插件也是单独进程,优点肯定是大大的,任何一个进程崩溃,其他App都可以围观。

当然还有很多的相似点,毕竟亲兄弟,Flutter能开发Android,也能开发ChromeOS。

所以,咱们来介绍一下Android的Window承载器Activity(活动), 如果按现在Android3.0以的架构来映射,这倒霉玩意就是Chrome的一个标签。能想象吗?开启一个Activity就是开启了一个带URL的浏览器标签。所以写一个Activity就是写了一个本地Html和Js。

好了,到这,我们终于可以把Activity的另一个附加属性抽象映射到了前端JS,没错这玩意简单页面,映射的就是JSP(themeself),复杂界面就是JS。介绍了这么多,估计回去下载个IDE就能写登录功能了。

到这,有任何开发经验的人基本上都已经入门Android了。

抽象的映射完了,就开始正式介绍一些倒霉玩意了。

上图:

image

show Me the Code

public final class UsersActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... new ListUsers().execute(); } private final class ListUsers extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... voids) { // final SQLiteOpenHelper sqLiteOpenHelper = ... // JsonObjectRequest jsObjRequest = new JsonObjectRequest // (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { // MySingleton.getInstance(this).addToRequestQueue(jsObjRequest); // showData(user); return null; } } } 

  • God Activity

上古时代Android1.0到3.0都是这个写法

操作数据库,访问网络,解析数据,切换线程以及渲染数据

All in one多合一

image

AsyncTask怎么用,如何防止内存泄漏。
四大组件是什么,怎么用
Activity如何返回结果
Service有那几种启动方式

第二次迭代MVP(4.0-5.1)

  • God Presenter

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

image

MVP这种模式很早就存在了,应用在Android上是因为Fragment

  • Added in API level 11
  • Deprecated in API level 28

我们解释Fragment是不能扔掉的垃圾,Fragment在国内被广泛应用时,大概在2016年以后。因为之前BUG太多,和Async一样难用,现在是共识的使用方式,虽然还是那么不好用。

Fragment是Android的视图生命周期控制器(带生命周期的自定义View),是Activity上的View层级中的一部分,一般可以把它看做一个轻量级的Activity。与传统的Activity相比,它只占用更少的资源,并且提供更大的编码灵活性、在超低版本上的兼容性等。

使用Fragment,即使是在肥肠差劲的平台(例如API 19以下连ART都没有的的老系统)上也能得到较好的运行效果,并且能将过渡动画兼容到更低的版本(通过FragmentTransition指定)。

早期的Fragment出现过很多问题,比如没有onBackPressed(),没有启动模式,重复创建,辣鸡的回退栈,迷之生命周期等等,导致很多开源作者自己独立开发了用于Fragment管理的框架,其中比较出名的有YoKeyword大佬的Fragmentation。

No bibi, Show Code

这个是经典的MVC架构,引入MVP之后就多了一个类和写不完的接口,优点是,一套业务逻辑可以对应多个页面,平板的出现不得不如此来做。

下面的是另外一个直播App的主页面的接口约定,带上注释427行

第三次迭代MVP + managers(5.1-7.0)

这些类有很多名字:uitls、helpers、fooBarBuzz-ator、等等。因此我们引入 Manager。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dcNqXYm-44)(https://five.agency/wp-content/uploads/2016/11/Diagram_4-1.png)]

如果项目写在17年之前,能有这样的架构,已经很棒,维护起来已经很容易了。


也就是,到16年,Google也没告诉我们,Android是否存在一个标准通用的,没那么多BUG系统组件和框架。

在17年,我们几乎所有Android开发者要感谢的一位大神Jake Wharton和Square,2017年从Square离职去了Google。

他给我们带来了那些轮子

  • butterknife 24213
  • dagger
  • DrawerBehavior 903
  • NineOldAndroids 4492
  • leakcanary 23183
  • retrofit 33038
  • picasso 16895

黎明之后

  • RxBinding 8917
  • kotterknife 2243
  • timber 7144 Android日志框架
  • retrofit2-kotlinx-serialization-converter 345

image

名言:

When Google bought Android, I honestly think they treated it just as some other side project.

是他们才让我们感觉到Android还有一点优势,能在IOS开发者面前抬得起头。

我们身后的巨人Google做了什么

2017年,放弃自己的HttpUrlConnection, 使用okhttp3作为网络框架(简单的说,开发者把坑踩完了,发现了更牛逼的存在)

被欧盟开罚单,之前说好的靠内置应用赚钱破灭了,开始逐渐闭源。

2018年,Jetpack,简单的说,开发者们,Google还是靠得住的,你看我们想起你们来了,你们不用去自己造轮子了,我们都给你们提供alpha版的AndroidX,必须用啊,不用你就是找事情,一天提醒你三遍。

2019年,Jetpack一部分是1.0了,Flutter的热度成功盖过了Kotlin原生开发。

前一段时间中美贸易战,Android和华为之前的关系很紧张,其实华为早就有备胎,不是现在的那个什么鸿蒙,而是很早的麒麟OS,让我们想到了悲剧的阿里云OS。备胎早晚会转正,只是现阶段转正的代价不可估量。

话说,都这么烂了,为啥还开发Android,还有那么多人入坑

入门简单,计算机相关专业的,你可以说你没学过oc,但不能说你没学过Java

入门便宜,一台Mac等于三台PC,开发不需要注册账号,不需要花一分钱。

对开发者不友好,对手机厂商友好啊,不花钱,随便改,随便造,你只要开机启动的时候协商power by android就完了,毕竟当时塞班诺基亚收购了,除了它,就剩下WindowsPhone,大家都知道,自己和自己不兼容。

So,现在啥样?

Google的拷问

Google:

还想做Android开发不?

开发者:

Google:

先去学Kotlin


Google:

还想做Android开发不?

开发者:

Google:

先去学Jetpack


Google:

还想用AndroidStudio开发Android不?

开发者:

Google:

先去把项目升级到AndroidX支持,要啥啥support


开发者:

Android是亲生的?

Google:

大家的女儿,Flutter才是亲生的,Chrome的媳妇儿

十岁的Android何去何从

Android越来越来越像IOS,IOS也越来越像Android

kotlin官方提供了编译Native代码还是很激动的,最起码看到了当年没有完成的事情仍有希望被完成,用Java写IOS app

什么ReactNavtive, Flutter都要让路。

Apple不让怎么办,kotlin, Flutter会和JS一样,分一杯移动端的蛋糕。Flutter会更强势,因为他自带先进的渲染库,可以做JS做不了的游戏。

那来瞅瞅Android可能即将流行的架构

大公司的组件化,以阿里巴巴的开源路由ARouter的诞生为起点,主打模块的复用性和可拆分性,同一套登录逻辑没有第二遍,新项目除了Domain和问题领域,其他都可以拿来主义。淘宝先上线扫垃圾,支付宝随后就来。

小公司的Single Activity,The Clean Architecture,最小的系统依赖,专心在业务领域建模。这么干的国内有重构后的知乎

虽然这两个方法处于不同的层面,你就一款App,给谁去复用,增加项目维护成本。组件化本身就拆散了很多东西。理想状态可以实现组件之间的小型前后端分离。

前后端分离

路由这个概念存在,大致就明白这是个啥

The Clean Architecture

这个是2012年,《代码简洁之道》的作者Uncle Bob发布在博客上的内容。

面向的是面向对象开发者,很拗口,都懂。

OO,OOD,OOAD,TDD,DDD

想到最近人间蒸发的南京音乐人李志的一句歌词,

他们在这世界上不停的奔跑,一不小心就改变了我们

这个简洁的架构也不是目前Android开发的银弹,虽然已经可以在Android上来应用这个繁杂的,多层的,但可维护的架构。奈何kotlin中,函数是一等公民。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpbG3hYD-45)(https://blog.cleancoder.com/uncle-bob/images/2012-08-13-the-clean-architecture/CleanArchitecture.jpg)]

So, So?, So!

abstract class UseCase<out Type, in Params> where Type : Any { abstract suspend fun run(params: Params): Either<Failure, Type> operator fun invoke(params: Params, onResult: (Either<Failure, Type>) -> Unit = {}) { val job = async(CommonPool) { run(params) } launch(UI) { onResult(job.await()) } } class None } 

class MainApplication : Application() { override fun onCreate() { super.onCreate() // start Koin context startKoin { androidContext(this@MainApplication) androidLogger() modules(appModule) } } } val appModule = module { // single instance of HelloRepository single<HelloRepository> { HelloRepositoryImpl() } // Simple Presenter Factory factory { MySimplePresenter(get()) } // Simple Java Presenter factory { MyJavaPresenter(get()) } // scope for MyScopeActivity scope(named<MyScopeActivity>()) { // scoped MyScopePresenter instance scoped { MyScopePresenter(get()) } } // MyViewModel ViewModel viewModel { MyViewModel(get()) } } 

十年,大致和移动端的Android开发者,度过了婴儿期和儿童期,还有很长的路要走。


图片均来自于网络,如有侵权,请联系删除

知秋君
上一篇 2024-11-07 07:48
下一篇 2024-11-12 14:55

相关推荐