從0到1搞出我的app實現長久盈利


咱們都知道,開發一個app很大程度依賴服務端:服務端提供接口數據,而後咱們展現;另外,開發一個app,還須要美工協助切圖。沒了接口,沒了美工,app彷佛只能作成單機版或工具類app,真的是這樣的嗎?先來展現下個人我的app,沒有服務端,沒有美工完成的,換言之,我幹了全部人的活:
這個app叫「微言」,他對於我意義很重大,最初微言只是我一個練手的項目,剛剛工做,技術有限,微言只是sqlite記事本類app,只能本地操做,後來慢慢演變如今幾近完美的app,從中我學到不少,熟悉了立項到上線的整個流程,最新技術得以實踐,從一個程序猿思惟從而向產品思惟轉變,簡單的Photoshop等。固然長期的積累天然會帶來經濟方面的收益,這裏秀下個人app廣告收益,個人全部app之和:
html

最多一個月4000多,4000多什麼概念,比我當時薪資都高呢,這些「成就」有了我能夠在此吹牛的資本,哈哈哈!java

接下來,我一一分析,帶您完成這樣的一個完整的app。android

沒有服務端

jsoup

我無心聽到大牛同事說到解析html,比較有興趣去搜索這是什麼玩意兒,知道了一個強大的東西jsoup,jsoup能解析html,即網站,因而個人微言脫離了單機版。對用戶而言,他不在意數據從何而來,管您是從接口取的仍是解析html,他們關心的是app體驗和功能的完善。我就這樣瞞天過海,數據取之網頁了,羣裏以前太多人太多人問我用的什麼服務器,回覆太屢次解析html後就不肯意再回復了。git

我選擇這種方式有個最大的好處就是數據不須要本人維護,巧妙地避開了我不會服務端開發,更不須要作接口;解析html也有個最大的弊端,一旦對方網站節點變化了,或許您的app就掛了,必須及時去更新。github

使用方法

步驟一
首先網絡請求,這裏用的Retrofit,具體見:AndroidMVPSample。以解析個人博客http://wuxiaolong.me/ 示例,能夠拿到相似如下數據:

在谷歌瀏覽器,個人博客頁面點擊右鍵-查看網頁源代碼(V),一樣看到以上數據。sql

步驟二
一、app/build.gradle數據庫

compile 'org.jsoup:jsoup:1.10.1'

二、解析html
要訣:多觀察html節點、標籤。
先觀察咱們要解析的數據(以個人博客http://wuxiaolong.me/ 示例),首頁分別有標題、發表時間、文章分類、文章評論、文章摘要5個元素谷歌瀏覽器,咱們此次只須要標題、發表時間、文章摘要;能夠看到個人博客是分頁,第一頁網址是http://wuxiaolong.me和第二頁網址倒是http://wuxiaolong.me/page/2/,以後區別就是頁碼,所以app作分頁的話要判斷第一頁和其餘頁,最終我作成的效果:
編程


咱們一一分析,關於jsoup語法,這裏不說,見 jsoup官網後端

(1)標題數據結構以下:api

<h1 class="post-title" itemprop="name headline">
<a class="post-title-link"
href="/2016/10/31/AppShortcuts/" itemprop="url">
Android App Shortcuts
</a></h1>

觀察可根據class=」post-title」的getElementsByClass解析:

//responseBody是retrofit網絡請求返回的,轉成String,即咱們須要解析的數據
Document document = Jsoup.parse(new String(responseBody.bytes(), "UTF-8")); List<Element> titleElementList = new ArrayList<>(); Elements titleElements = document.getElementsByClass("post-title-link");
for
(Element element : titleElements) {    titleElementList.add(element);    
   //text拿到文本,如這裏的「Android App Shortcuts」    LogUtil.d("text=" + element.text());    
   //拿到href屬性值,如這裏「/2016/10/31/AppShortcuts/」,
   //即博客連接,若是跳轉詳情須要加上「http://wuxiaolong.me」
   LogUtil.d("href=" + element.attr("href")); }

(2)發表時間數據結構以下:

<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span><span class="post-meta-item-text">發表於</span>
<time itemprop="dateCreated"
datetime="2016-10-31T21:49:53+08:00"
content="2016-10-31">
2016-10-31</time></span>

觀察,一樣用getElementsByClass解析:

List<Element> timeElementList = new ArrayList<>(); Elements timeElements = document.getElementsByClass("post-time");
for (Element element : timeElements) {   
   //這裏經過解析"time"標籤,而後取文本,即「2016-10-31」    LogUtil.d("time=" + element.getElementsByTag("time").text());    timeElementList.add(element); }

(3)文章摘要數據結構以下:

<div class="post-body" itemprop="articleBody">
<h1 id="簡介">
<a href="#簡介" class="headerlink" title="簡介">
</a>
簡介</h1>
<p>
Android 7.1容許您定義應用程序中特定操做的快捷方式。
這些快捷鍵能夠顯示桌面,例如Nexus和Pixel設備。
快捷鍵可以讓您的用戶在應用程序中快速啓動常見或推薦的任務。
<br>每一個快捷鍵引用一個或多個意圖,每一個意圖在用戶
選擇快捷方式時在應用程序中啓動特定操做。
能夠表達爲快捷方式的操做示例包括:
<br><div class="post-more-link text-center">
<a class="btn" href="/2016/10/31/AppShortcuts/"
rel="contents">
閱讀全文 &raquo;</a></div></p></div>

恩,也是用的getElementsByClass解析:

List<Element> bodyElementList = new ArrayList<>(); Elements bodyElements = document.getElementsByClass("post-body");
for (Element element : bodyElements) {    
   //這裏用text()只是拿到文本,但我想要直接返回html標籤,很好,jsoup有html()方法。    LogUtil.d("body=" + element.html());    bodyElementList.add(element); }

三、核心代碼

private void loadMyBlog() {    Call<ResponseBody> call;    
   //分頁處理    if (page == 1) {        call = apiStores.loadMyBlog();    } else {        call = apiStores.loadMyBlog(page);    }    call.enqueue(new RetrofitCallback<ResponseBody>() {        
       @Override        public void onSuccess(ResponseBody responseBody) {            
           try {                Document document = Jsoup.parse(new String(responseBody.bytes(), "UTF-8"));                List<Element> titleElementList = new ArrayList<>();                Elements titleElements = document.getElementsByClass("post-title-link");                
               for (Element element : titleElements) {                    titleElementList.add(element);                    
                   //LogUtil.d("text=" + element.text());                    //LogUtil.d("href=" + element.attr("href"));                }                List<Element> timeElementList = new ArrayList<>();                Elements timeElements = document.getElementsByClass("post-time");                
                   for (Element element : timeElements) {                    
                   //LogUtil.d("time=" + element.getElementsByTag("time").text());                    timeElementList.add(element);                }               
                           List<Element> bodyElementList = new ArrayList<>();                Elements bodyElements = document.getElementsByClass("post-body");                
               for (Element element : bodyElements) {                    LogUtil.d("body=" + element.html());                    bodyElementList.add(element);                }                if (page == 1) {                    dataAdapter.clear();                }                dataAdapter.addAll(titleElementList, timeElementList, bodyElementList);                
               if (titleElementList.size() < 8) {                    
               //由於個人博客一頁8條數據,當小於8時,說明沒有下一頁了                    pullLoadMoreRecyclerView.setHasMore(false);                } else {                    pullLoadMoreRecyclerView.setHasMore(true);                }            } catch (Exception e) {                e.printStackTrace();            }        }        @Override        public void onFailure(int code, String msg) {            toastShow(msg);        }        @Override        public void onThrowable(Throwable t) {            toastShow(t.getMessage());        }        @Override        public void onFinish() {            pullLoadMoreRecyclerView.setPullLoadMoreCompleted();        }    });    addCalls(call); }

jsoup解析源碼

解析個人博客源碼已經上傳個人github,見:https://github.com/WuXiaolong/WeWin,舒適提示,微信不支持外鏈,點擊底部【閱讀原文】跳轉至個人github查看。

想必這樣一一分析,您必定會jsoup解析html,若是還不會,私下給我發個大紅包,我再手把手教您,發個超大紅包,今晚我就是您的啦,嘿嘿。

題外

可能您擔憂,jsoup解析html,這樣爬蟲難道不侵權嗎?是的,我也擔憂,因此個人app也只在個人羣裏「宣傳宣傳」。

bmob

仔細的您,確定發現了,jsoup爬數據,只能作展現功能,那個人微言裏不是有評論功能嘛!這是怎麼作到的呢?我剛開始作app那會,我的app是作不了POST功能的,但bmob出現解決了我的開發者這個沒有服務器的痛點,它就至關於一個數據庫,提供了sdk,您能夠作增刪改查操做,咱們只須要專一客戶端,後端就不用管了,話說如此,咱們仍是稍微懂點數據庫知識的,以便於咱們更好利用bmob。除了bmob,如今還有leancloud、apicloud等都有相似的服務,很感謝他們,及時解決咱們的剛需,我的app還能夠有一線生機。

關於bmob、leancloud、apicloud如何使用,我知道聰明的您已經在看他們的官方文檔了。

沒有美工

美工切圖

在實際開發中,有些效果,只須要美工作張圖片就能輕鬆搞定,沒有美工切圖的配合,app開發彷佛難以進展下去了,是嗎?其實我在《Android Design Support Library使用》一文提到一句話:「目前這個sample,Material design風格的效果都有了,至關一個空殼子,您只需在實際開發中塞真實數據就是一個perfect app」,對,就用谷歌的Material design風格就OK了,它提供了一套規範、圖片,足夠咱們我的app使用了,並且如今還有vector,更是強大之極。好比微言-每日推薦右上角的刷新按鈕,如圖:

相應的xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:app="http://schemas.android.com/apk/res-auto">    <item        android:id="@+id/action_refresh"        android:icon="@drawable/ic_loop_24dp"        android:title="刷新"        app:showAsAction="always" />
</menu>

平時ic_loop_24dp確定是張圖片,然而我用的vector,代碼以下:

<vector xmlns:android="http://schemas.android.com/apk/res/android"        android:width="24dp"        android:height="24dp"        android:viewportWidth="24.0"        android:viewportHeight="24.0">    <path        android:fillColor="?attr/colorControlNormal"        android:pathData="M12,4L12,1L8,5l4,4L12,6c3.31,0 6,2.69 6,
       6 0,1.01 -0.25,1.97 -0.7,2.8l1.46,1.46C19.54,15.03 20,
       13.57 20,12c0,-4.42 -3.58,-8 -8,-8zM12,18c-3.31,0 -6,
       -2.69 -6,-6 0,-1.01 0.25,-1.97 0.7,-2.8L5.24,7.74C4.46,
       8.97 4,10.43 4,12c0,4.42 3.58,8 8,8v3l4,-4 -4,-4v3z"
/>
</vector>

是否是很神奇,vector如何建立:

這裏隨便演示,建立了一個vector,關於vector學習可參考醫生的《Android Vector曲折的兼容之路》一文,寫的很詳細,這裏很少說了。

app圖標

app固然但願有個漂亮的有意義的圖標,會用到Photoshop,我固然不會啊,那必須得學啊。通常安卓市場須要圖標尺寸16*16,48*48,512*512,圓角,Android開發須要48*48,72*72,96*96,144*144,196*196,所以PS的時候,只須要作個最大尺寸512*512,而後縮小便可。
圖標的PS步驟:
一、用photoshop打開您想修改的圖片
二、在左側工具欄中選擇「圓角矩形工具」(默認的是「矩形工具」,您只須要右擊圖標就能夠發現「圓角矩形工具」),如上圖
三、在上面「半徑」框中輸入您想要的圓角半徑,通常圖片選25便可,爲了效果明顯我設置爲40,看上圖有一個框顯示半徑40.
四、在打開的圖片上畫一個圓角矩形,把圖片覆蓋住。
五、對着已經被覆蓋的圖片選區右擊,選擇「創建選區」,若是有窗口彈出直接點擊「肯定」,在彈出的選項中直接點擊「確認」
六、在上方的「選擇」選項卡中點擊,在下拉框中找到「反向」,也可使用快捷鍵ctrl+shilf+i。
七、在右下方的圖層欄中雙擊「背景」圖片(上面第一張圖片右下角能夠看到),若是有窗口彈出直接點擊「肯定」,完成解鎖。
八、按鍵盤上的」DELETE」鍵清除四個直角。
九、繼續右擊「形狀1」(在畫面右下方圖層那裏能夠找到),在彈出選項中選擇「刪除圖層」,若是有窗口彈出直接點擊「是」。
十、OK,您能夠看到一個圓角圖片。
十一、最後在左上角點擊文件—》存儲爲—》選擇png格式(其餘格式也能夠),完成。

爲何微言的圖標是一個「言」字,由於我以爲這樣簡潔大方,簡單明瞭,言簡意賅……算了,不裝了,其餘我不會P啊!

推廣技巧

作完一個我的app,是否是頗有成就感啊,上線安卓市場,卻沒幾個下載量,尼瑪,勞資花了很長時間呢,這麼牛B的app怎麼沒人下載?!心情一會兒跌倒谷底,那得讓更多的人知道本身的app啊,我是這樣作的:

一、邀請好評
您去下載一個app時,可能會看下這個app的評論,若是有不少好評,您會不會更願意去下載呢,是的,來看個人微言好評如潮:

哈哈哈,是否是很牛,邀請評論我寫成了工具類了,請笑納:

public class InviteCommentUtil {    
private String mDateFormat = "yyyy-MM-dd";    
private String mInviteCommentTime;    
   /**     * 選擇哪天彈邀請評論框     */    public void startComment(final Activity activity) {        mInviteCommentTime = PreferenceUtils.getPreferenceString(activity,
       "inviteCommentTime", TimeUtil.getCurrentTime(mDateFormat));        String saveCommentTime = PreferenceUtils.getPreferenceString(activity,
       "saveCommentTime", TimeUtil.getCurrentTime(mDateFormat));          
       int compareDateValue = TimeUtil.compareDate(mInviteCommentTime,
           saveCommentTime, mDateFormat);        
           if (compareDateValue == 1) {            AlertDialog.Builder builder = new AlertDialog.Builder(activity);            
           int nowReadingTotal = ReadUtil.getReadedTotal();            builder.setMessage(Html.fromHtml(
           "您已經累計閱讀<font color=#FF0000>" + nowReadingTotal + "</font>字,
           再接再礪哦!若是喜歡我,但願您能在應用市場給予
           <font color=#FF0000>五星</font>好評!"
));            builder.setTitle("求好評");            builder.setPositiveButton("好評鼓勵", new android.content.DialogInterface.OnClickListener() {                        
                       @Override                        public void onClick(DialogInterface dialog, int which) {                            setComment(activity);                            
                           try {                                Intent intent = new Intent(                                        
                               "android.intent.action.VIEW");                                intent.setData(Uri                                        .parse("market://details?id=
                                       com.android.xiaomolongstudio.weiyan"
));                                activity.startActivity(intent);                                activity.overridePendingTransition(                                        R.anim.enter_right_to_left, R.anim.exit);                            } catch (Exception e) {                                e.printStackTrace();                            }                            dialog.dismiss();                        }                    });            builder.setNegativeButton("下次再說", new android.content.DialogInterface.OnClickListener() {                        
                       @Override                        public void onClick(DialogInterface dialog, int which) {                            setComment(activity);                            dialog.dismiss();                        }                    });            builder.create().show();        }    }    
   /**     * 保存,直到下週再提示     */    private void setComment(Activity activity) {        PreferenceUtils.setPreferenceString(activity,
       "saveCommentTime", mInviteCommentTime);    } }

注意:這裏邀請評論時間控制好,不能太頻繁了,否則用戶會反感的。

二、專一一個市場
不知道您有沒有發現,某個市場您明明沒有發佈,卻能搜到您的app,沒錯,一些市場會抓您的這個app,好比豌豆莢,百度,所以策略,專一一個市場,這個市場出名了,還怕其餘市場不知道嗎?固然咱們是爭取每一個市場都能發佈上線,多一個下載是一個。

微言位於分類下前排

屢次進入精品系列

如何進入前排或精品,邀請好評是關鍵的一步。

三、新品推薦
新品上線,不少市場有新品推薦,好比小米、妹紙、360、應用寶,通常須要自薦,一旦被推薦,下載量是可觀的,微言確定被推薦過啦。哦,更新版本也算新品哦。

四、微博
這是我好哥們教個人,他真的好牛,我的app作的更牛,給您們看一個連接:http://weibo.com/p/1008082a702d2cb6146485e5dc3d624d31def6 ,就知道如何在微博上推廣了,沒錯,就是話題,用兩個#號圈起來,發微博,就是一個話題,別人能夠這個話題下討論,無形中造成了推廣做用。

五、app分享
app分享功能確定是要作的,萬一用戶以爲您的這個app很棒,想推薦給好友,結果沒分享功能,豈不歇菜,分享微博能夠加兩個#號圈起來哦。

六、QQ羣
若是您直接羣裏發app的下載連接,只會一個結果:被T。像咱們程序猿,大部分都是技術羣,個人作法是寫文章分享我app用的技術,文章會附上app下載地址,而後有這個技術興趣的人可能詢問,這樣我就名正言順地「推廣」了,哈哈,我好壞!

以上僅我知道的,不必定有效,畢竟我不是專業的推廣人員。

如何賺錢

萬事俱備,只欠東風,當您的用戶量足夠大的時候,天然有人找您,投資您的app,這個過程前期0收益,耗得精力時間不算,可能還得燒錢,不適合我的開發者,我選擇的是賺賺小錢,app加廣告的方式。

廣告平臺選擇第三方的,最先我使用的多盟,可是一段時間發現我根本沒什麼收益,感受多盟扣量好嚴重,以後嘗試多易傳媒、艾德思奇、芒果聚合,也使用過點樂積分,發現一些市場不讓上線積分類app,放棄之,還有百度移動廣告聯盟、騰訊的廣點通,谷歌的也玩過,收益最穩定屬百度的,這點不黑它。

至於廣告集成,也是提供sdk,自行去他們的官網瞭解吧。

最後

對於這個app,我的感受很滿意,功能都很完善,以致於我後來以爲沒什麼好更新的,再加上廣告收益好也就一段時間,移動廣告商雨後春筍,致使廣告單價過低,並且安卓市場對我的開發者各類限制,好比不讓上線視頻類app;某度,某60必須用自家的加固才讓上線app等,就沒什麼動力繼續維護app,作事仍是要有動力的,否則活着幹嘛?不過我知道有人還在堅持作我的app,作的好的,日入幾百甚至上千的。app最終目的就是賺錢。

做者 | 吳小龍    已受權本公衆號發佈


http://mp.weixin.qq.com/s/tvYx2NbnFIM7aQ7QiBx_jQ

接下來來推薦個良心公衆號『共享IT資源』,一個專門分享編程相關的視頻、代碼、電子書等IT資源的公衆號。歡迎關注!


推薦閱讀

 


【乾貨篇】福利篇:學習編程視頻免費領取


【資源篇】Python那麼火,你不知道人門?


【福利篇】程序猿充電優質編程技術電子書


本文分享自微信公衆號 - 程序IT圈(DeveloperIT)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索