如何用一周時(shí)間開(kāi)發(fā)一款A(yù)ndroid APP并在Google Play上線

作者簡(jiǎn)介 原創(chuàng)微信公眾號(hào)郭霖 WeChat ID: guolin_blog

漫長(zhǎng)的一周終于結(jié)束了屈藐,先提前祝大家周末愉快踩娘!

本周的最后一篇文章來(lái)自黎趙太郎的投稿娘荡,分享了個(gè)人開(kāi)發(fā)一款A(yù)PP并上架的經(jīng)驗(yàn)搔谴。由于篇幅限制魁袜,我這里只挑出了文章的主要部分,感興趣的朋友可以訪問(wèn)下面的博客地址查看全部?jī)?nèi)容敦第。

黎趙太郎的博客地址:

http://www.reibang.com/u/49606f4d970f

前言

目標(biāo):實(shí)現(xiàn)紙飛機(jī)App - 采用MVP架構(gòu)峰弹,集合了知乎日?qǐng)?bào)、果殼精選和豆瓣一刻的綜合性閱讀客戶端芜果。項(xiàng)目地址:

https://github.com/marktony/PaperPlane

效果圖如下所示:

本次教程分為7天鞠呈,內(nèi)容分別為:

第一天,準(zhǔn)備

功能需求

可行性分析

其他準(zhǔn)備

第二天右钾,UI

選擇合適的UI

第三天蚁吝,整體架構(gòu)

第四天,首頁(yè)列表

界面編寫(xiě)

實(shí)體類

顯示數(shù)據(jù)

緩存內(nèi)容

第五天舀射,詳情頁(yè)與其他

界面編寫(xiě)

實(shí)體類

顯示數(shù)據(jù)

設(shè)置與關(guān)于

第六天窘茁,高級(jí)功能

夜間模式

版本適配

第七天,發(fā)布與開(kāi)源

在Google Play上線

在GitHub開(kāi)源

思考

好了脆烟,廢話不多說(shuō)了∩搅郑現(xiàn)在就開(kāi)始吧。

DAY 1

俗話說(shuō)邢羔,萬(wàn)事開(kāi)頭難驼抹,準(zhǔn)備工作做好了,可以起到事半功倍的作用拜鹤。磨刀不誤砍柴工嘛框冀。

功能需求

在開(kāi)始正式編碼之前,咱們還是得先把要實(shí)現(xiàn)的功能一一列出來(lái)敏簿,后面實(shí)現(xiàn)起來(lái)才有方向嘛左驾。我認(rèn)為咱們需要實(shí)現(xiàn)的功能有:

正確獲取消息列表并展示

能夠獲取歷史消息

展示內(nèi)容詳情

后臺(tái)自動(dòng)緩存內(nèi)容詳情,方便用戶在無(wú)網(wǎng)絡(luò)連接時(shí)查看

收藏特定消息

夜間模式

一共6個(gè)大的需求极谊,不多诡右,但是我們仔細(xì)的研究一下,實(shí)際上這6個(gè)需求涉及到了網(wǎng)絡(luò)轻猖,UI帆吻,數(shù)據(jù)存儲(chǔ),后臺(tái)服務(wù)等內(nèi)容咙边。相信對(duì)于聰明的你不算困難猜煮,現(xiàn)在我們來(lái)研究一下可行性次员。

可行性分析

我們首先需要考慮的問(wèn)題就是:數(shù)據(jù)從哪里來(lái)?感謝開(kāi)源王带,GitHub上?izzyleung?大神分析了知乎日?qǐng)?bào)的API并開(kāi)源了淑蔚,項(xiàng)目地址請(qǐng)戳這里:

知乎日?qǐng)?bào) API 分析

https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90

分析的非常詳細(xì),紙飛機(jī)項(xiàng)目在初期愕撰,也就是版本3.0之前也只使用了這一個(gè)API刹衫,在3.0之后還使用果殼精選和豆瓣一刻的API。如果你還想要展示更多的內(nèi)容搞挣,可以戳這里(收集了一些國(guó)內(nèi)外常用的API):

Awsome_API

https://github.com/marktony/Awesome_API

我們來(lái)粗略的看一下數(shù)據(jù)的內(nèi)容带迟。獲取知乎日?qǐng)?bào)2017年1月22日的消息列表:

http://news-at.zhihu.com/api/4/news/before/20170122

服務(wù)器向我們返回JSON格式的內(nèi)容:

OK,獲取到了列表之后囱桨,我們就可以獲取詳細(xì)的內(nèi)容了仓犬,例如,我們獲取id為9165434的內(nèi)容舍肠,只需要將id拼接到http://news-at.zhihu.com/api/4/news/之后:

http://news-at.zhihu.com/api/4/news/9165434

獲取到的內(nèi)容為:

body字段中就是html格式的內(nèi)容詳情搀继,我們就可以使用 WebView 來(lái)展示了。當(dāng)然翠语,知乎日?qǐng)?bào)的API接口不止上面的兩個(gè)律歼,你可以點(diǎn)擊上面的鏈接查看。獲取果殼精選和豆瓣一刻的內(nèi)容啡专,你可以在我的項(xiàng)目中直接查看文件Api。

其他準(zhǔn)備

工欲善其事制圈,必先利其器们童。工具準(zhǔn)備好總是沒(méi)錯(cuò)的。其他不多說(shuō)鲸鹦,推薦一款功能強(qiáng)大的網(wǎng)頁(yè)調(diào)試與發(fā)送網(wǎng)頁(yè) HTTP請(qǐng)求 的Chrome插件慧库,我們做網(wǎng)絡(luò)請(qǐng)求分析時(shí)需要用到:

Postman

https://www.getpostman.com/docs/introduction

好了,第一天的工作差不多就是這么多馋嗜,熟悉一下API齐板,把工具備好,收拾一下心情葛菇,準(zhǔn)備明天的工作甘磨。

DAY 2

今天主要完成的是UI設(shè)計(jì)。你可能會(huì)問(wèn)了眯停,這不是設(shè)計(jì)師的工作么济舆。然而,我在開(kāi)發(fā)紙飛機(jī)的過(guò)程中莺债,并沒(méi)有射雞濕這種生物滋觉,UI就我自己完成了签夭。相信大多數(shù)的程序員,美術(shù)方面應(yīng)該不是那么地擅長(zhǎng)椎侠。

當(dāng)然第租,有美術(shù)和相關(guān)基礎(chǔ)的同學(xué)可以試試用Sketch或者PS把原型圖畫(huà)出來(lái),對(duì)于沒(méi)有美術(shù)基礎(chǔ)的童鞋我纪,最簡(jiǎn)單的方法當(dāng)然就是模仿現(xiàn)成的APP了慎宾。當(dāng)然,你也可以在下列網(wǎng)站尋找合適的設(shè)計(jì)圖:

Dribbble

https://dribbble.com

UpLabs

https://www.uplabs.com

UI中國(guó)

http://www.ui.cn

站酷ZCOOL

http://www.zcool.com.cn

另外宣羊,還有一些小的注意事項(xiàng):

1.遵守Material Design設(shè)計(jì)規(guī)范- 這不是強(qiáng)制性的要求璧诵,但是,既然我們是開(kāi)發(fā)一款A(yù)ndroid App仇冯,如果我們自己都不遵守規(guī)范之宿,還怎么指望Android環(huán)境變好呢。

2.正確使用BottomNavigation- BottomNavigation 作為 Google 的打臉之作苛坚,誕生之初就倍受爭(zhēng)議比被。我個(gè)人的建議是使用 TabLayout 代替底部導(dǎo)航,這是涉及到信仰的大事情泼舱。如果一定要用等缀,請(qǐng)不要把iOS上的標(biāo)準(zhǔn)直接放在Android上使用,請(qǐng)參考這一篇文章:

Material Design 中的 Bottom Navigation 并不是無(wú)腦移植 iOS 導(dǎo)航模式的許可證

https://zhuanlan.zhihu.com/p/22005972

并且娇昙,我向你投來(lái)一個(gè)鄙視的眼神尺迂。

3. 使用正確的圖標(biāo)- 盡量使用https://material.io/icons網(wǎng)站上的圖標(biāo),如果你使用iOS版本的圖標(biāo)冒掌,我再次向你投來(lái)一個(gè)鄙視的眼神噪裕。

首頁(yè)使用 Drawer 作為頂級(jí)導(dǎo)航,Tab 為二級(jí)導(dǎo)航股毫,列表項(xiàng)使用卡牌布局膳音,使用 FloatingActionButton 作為日期選擇按鈕;詳情頁(yè)面使用可收縮的 Toolbar铃诬,圖片搭配文字的形式祭陷。其他高深的我也不懂了。到后面你會(huì)發(fā)現(xiàn)趣席,這里我犯了一個(gè)錯(cuò)誤兵志,卡牌布局用在這里是不合適的。參見(jiàn):

https://material.io/guidelines/components/cards.html#cards-usage

DAY 3

現(xiàn)在開(kāi)始就要真正的寫(xiě)代碼了宣肚。新建Android Studio項(xiàng)目什么的就不說(shuō)了毒姨,下面的是我的項(xiàng)目結(jié)構(gòu)圖:

不難看出,我是按照頁(yè)面和功能進(jìn)行分包的钉寝。

包建立完成后弧呐,我們開(kāi)始導(dǎo)入第三方的開(kāi)源庫(kù)闸迷,便于簡(jiǎn)化代碼的編寫(xiě)和實(shí)現(xiàn)特定的效果。找到工程目錄下app文件夾俘枫,打開(kāi)?build.gradle?文件腥沽,添加如下內(nèi)容。

由于一些歷史遺留問(wèn)題鸠蚪,我并沒(méi)有使用 OkHttp 作為網(wǎng)絡(luò)請(qǐng)求包今阳,而是選擇了 volley。如果你有一定的基礎(chǔ)茅信,可以選擇使用 OkHttp盾舌。

導(dǎo)入volley有兩種方式:

1.在?app目錄 下的?lib目錄 下粘貼volley的jar包,你可以在這里下載到:

https://github.com/marktony/PaperPlane/blob/master/app/libs/library-1.0.19.jar

2.當(dāng)然也可以通過(guò) gradle 引入:

compile'com.android.volley:volley:1.0.0'

首先是整體的架構(gòu):MVP蘸鲸。關(guān)于整體架構(gòu)的選擇以及更加詳細(xì)的介紹部分妖谴,可以戳這篇文章:

重構(gòu)!將Google-MVP應(yīng)用于已有項(xiàng)目

https://marktony.github.io/2016/09/27/%E9%87%8D%E6%9E%84%EF%BC%81%E5%B0%86Google-MVP%E5%BA%94%E7%94%A8%E4%BA%8E%E5%B7%B2%E6%9C%89%E9%A1%B9%E7%9B%AE

這里我們仿照Google的Android Architecture Blueprints [beta]中的:

todo-mvp

https://github.com/googlesamples/android-architecture/tree/todo-mvp

1.首先創(chuàng)建最基本的BaseViewBasePresenter,他們分別是所有 View 和 Presenter 的基類酌摇。

2.然后創(chuàng)建一個(gè)契約類膝舅,用于統(tǒng)一管理 View 和 Presenter。這里以知乎日?qǐng)?bào)的部分為例(如果沒(méi)有特別說(shuō)明窑多,后面的代碼均以知乎日?qǐng)?bào)的部分為例仍稀,果殼精選與豆瓣一刻的代碼類似,詳細(xì)代碼可以在 GitHub 的 repo 中找到)埂息。

ZhihuDailyContract.java

3.在上面已經(jīng)分好的子包中技潘,創(chuàng)建相應(yīng)的子類 View 和 Presenter。

4.創(chuàng)建VolleySingleton千康,即 Volley的單例享幽。這樣,整個(gè)應(yīng)用就可以只維護(hù)一個(gè)請(qǐng)求隊(duì)列吧秕,加入新的網(wǎng)絡(luò)請(qǐng)求也會(huì)更加的方便。

5.然后是 Model層 的實(shí)現(xiàn)迹炼。使用了 Gson 之后砸彬,對(duì)JSON的轉(zhuǎn)換更加方便了,所以斯入,我們只需要返回類型為String即可砂碉。

定義了兩個(gè)方法,分別為請(qǐng)求成功時(shí)和請(qǐng)求失敗時(shí)的回調(diào)刻两。

然后定義一個(gè) StringModel 的實(shí)現(xiàn)類 StringModelImpl:

5.到這里增蹭,基本的架構(gòu)就搭建完成了。現(xiàn)在可以喝杯咖啡磅摹,然后完成今天的最后一點(diǎn)工作滋迈,為后面的工作做準(zhǔn)備霎奢。

創(chuàng)建Api.java文件,用于存儲(chǔ)app所用到的所有API:

創(chuàng)建NetworkState.java文件饼灿,判斷當(dāng)前的網(wǎng)絡(luò)狀態(tài)幕侠,是否有網(wǎng)絡(luò)連接,WiFi或者是移動(dòng)數(shù)據(jù):

創(chuàng)建DateFormatter .java文件碍彭,方便將 long類型 的日期轉(zhuǎn)換為 String類型晤硕。

OK,day 3工作完成庇忌。


完舞箍。。皆疹。疏橄。。墙基。软族。。残制。立砸。。初茶。颗祝。。恼布。螺戳。。折汞。倔幼。。爽待。

文章原創(chuàng)作者GuoLin 書(shū)籍推薦

郭林大神原創(chuàng)android 書(shū)籍:《第一行代碼 android》

淘寶鏈接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末损同,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟款,更是在濱河造成了極大的恐慌膏燃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何什,死亡現(xiàn)場(chǎng)離奇詭異组哩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)伶贰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛛砰,“玉大人,你說(shuō)我怎么就攤上這事幕袱”┍福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵们豌,是天一觀的道長(zhǎng)涯捻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)望迎,這世上最難降的妖魔是什么障癌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮辩尊,結(jié)果婚禮上涛浙,老公的妹妹穿的比我還像新娘。我一直安慰自己摄欲,他們只是感情好轿亮,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著胸墙,像睡著了一般我注。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迟隅,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天但骨,我揣著相機(jī)與錄音,去河邊找鬼智袭。 笑死菩咨,一個(gè)胖子當(dāng)著我的面吹牛牌借,可吹牛的內(nèi)容都是我干的拔稳。 我是一名探鬼主播诡宗,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞳步!你這毒婦竟也來(lái)了闷哆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谚攒,失蹤者是張志新(化名)和其女友劉穎阳准,沒(méi)想到半個(gè)月后氛堕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馏臭,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了括儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绕沈。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帮寻,靈堂內(nèi)的尸體忽然破棺而出乍狐,到底是詐尸還是另有隱情,我是刑警寧澤固逗,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布浅蚪,位于F島的核電站,受9級(jí)特大地震影響烫罩,放射性物質(zhì)發(fā)生泄漏惜傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一贝攒、第九天 我趴在偏房一處隱蔽的房頂上張望盗誊。 院中可真熱鬧,春花似錦隘弊、人聲如沸哈踱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)开镣。三九已至,卻和暖如春串结,著一層夾襖步出監(jiān)牢的瞬間哑子,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工肌割, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卧蜓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓把敞,卻偏偏與公主長(zhǎng)得像弥奸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奋早,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,317評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc盛霎,orm框架 https://github.com/yangf...
    passiontim閱讀 15,440評(píng)論 2 45
  • 我們即將去一個(gè)叫白石灣的地方 在那里,蓋一座小石屋 用山澗里水草纏繞的石頭耽装; 栽幾株野紫藤愤炸,種三畝土茶在山坡 來(lái)年...
    佑洱閱讀 189評(píng)論 0 1
  • 微光晨起霧連霜,城河曲縱冰封藏掉奄。 倦意臨心囊四海规个,途人驚擾一黃粱!
    寒易閱讀 255評(píng)論 0 0