譚 璐,金偉陽
(長春大學 計算機科學技術學院,長春 130022)
《科學脫口秀》Android端的設計與實現
譚 璐,金偉陽
(長春大學 計算機科學技術學院,長春 130022)
闡述了可基于Android、JAVA和Realm在移動端設備上運行的應用程序。這個應用程序主要實現了播客節目分類顯示、播客節目在線播放、播客節目離線緩存播放、博客節目模糊查詢、播客節目介紹查看、播客節目評論查看、通知欄/線控控制音樂播放、來電/短信勿擾和播客節目收聽/點擊熱度統計等功能,滿足用戶對該播客節目收聽的基本需求。
Podcast; Android; Realm; MediaSession; Martial Design
2009年,Android首次進入中國,其火熱程度一直在持續上升。2011年的第一季度,Android在全球的市場份額第一次超過塞班系統,成為全球第一。在2013年的第四季度,Android手機平臺的全球市場份額已超過78.1%。最近3~4年,國內Android的發展也異常迅速,并在國內形成一定的體系,擁有眾多出色的APP,Android手機也成為人們日常不可或缺的工具、娛樂設備。
《科學脫口秀》這檔節目,2012年6月首次在podcast開播,近年來,知名度不斷提高,為科學、科普、知識提供了新穎的傳播方式。節目號稱用無下限的方式傳播科學知識,吐槽流言,小到菜市場大到宇宙末日。植物、動物、天文、心理、物理、化學各路知識全面包含。該節目最開始僅在蘋果的iTunes上發布,只能通過蘋果設備收聽,隨著Android的普及,Android設備市場占有率也超過了蘋果,該節目也在各大聽書平臺上架,隨后官方網站也在聽友的幫助下上線了。但是,由于商業原因,各大聽書平臺布滿了廣告,在節目播放期間強行插入音頻廣告,十分影響收聽。因此,一款純凈無廣告、能滿足基本收聽功能的APP是猶為有意義的。本文就針對于這個需求,在Android音頻播放、文件下載等方面進行了研究。
整個軟件主要分為6個基本模塊,每個模塊具體功能如下:
(1)在線/本地播放模塊。主要是由自行抽離出的音頻播放SDK構成,僅用于負責播放以及通知欄的顯示,通知欄能夠對播放進行控制,并支持多種配置,SDK遵循谷歌MediaSession框架,能夠和系統進行結合,接收系統發出的不同指令。
(2)文件緩存模塊。抽離出特定功能的下載SDK,負責文件下載,SDK支持配置下載默認路徑、下載最多支持的線程數、是否斷點續傳。并且能緩存下載進度,下載隊列,以及下載的排序。提供了批量下載取消/下載暫停的接口。
(3)搜索模塊。提供相關字段的模糊搜索功能,且搜索是隨輸入實時進行,之后將搜索出來的結果展示在界面上,供用戶選擇。
(4)評論展示模塊。用于展示評論,根據不同的節目獲取不同的評論展示在界面上,不過由于節目官網系統原因,不支持評論以及評論回復。為了滿足一些人需求,提供了復制評論的功能。
(5)數據爬取解析模塊。是較為重要的模塊,該模塊分為兩塊,服務端使用WebMagic進行網頁爬取,使用PULL進行RSS解析,并使用七牛云保存靜態資源。而客戶端的數據爬取解析模塊為備用方案,在七牛云失效時使用,通過Nohttp獲取RSS,為了保持兩端統一,同樣使用PULL進行解析。
(6)數據存儲讀取模塊。主要是將爬取解析獲取到的數據緩存至本地數據庫,本APP使用存儲讀取效率較高的Realm數據庫。由于Realm的特性,可以不寫sql語句而是通過類似sql的方法進行查詢、存儲。但是,Realm數據庫不允許跨線程訪問,因此,也造成了很多困擾。
在數據庫中建立4個數據庫表,分別是科學脫口秀表、節目表、緩存節目表、評論表。這些表支撐起整個軟件的數據基礎,存儲著關于節目的數據。涉及到的具體的數據庫表如下:
(1)科學脫口秀表(ScienceTalkShow):存儲科學脫口秀節目組的主要信息,包含節目組名、節目組副標題、節目組官網鏈接、節目組圖像、節目組所屬語言、節目組相關描述等。
(2)節目表(Programme):存儲科學脫口秀節目的主要信息,包括唯一標識、節目標題、節目官網鏈接、節目發布時間、節目發布者、節目所屬類別、節目描述、節目說明等。
(3)緩存節目表(ProgrammeCache):存儲緩存在本地的節目信息表,包括唯一標識、節目標題、節目創建者、節目所屬類別、節目本地緩存文件存儲的路徑。
(4)評論表(Comment):存儲節目對應的評論信息,包括唯一標識、評論標題、評論節目官網鏈接、評論發布的時間、評論者昵稱、評論簡述、評論內容。
3.1 MediaSession框架
要了解MediaSession框架就得先從MediaPlayer的生命周期和狀態講起,Android的MediaPlayer包含了Audio和video的播放功能,在Android自帶的軟件中,Music和Video兩個應用程序都是調用MediaPlayer實現的。MediaPlayer在底層是基于OpenCore(PacketVideo)的庫實現的,為了構建一個MediaPlayer程序,上層還包含了進程間通訊等內容,這種進程間通訊的基礎是Android基本庫中的Binder機制。
一個MediaPlayer對象包含以下幾種狀態:
(1)當使用剛剛創建的MediaPlayer對象new或之后reset()被調用時,它是在空閑狀態;
(2)當調用release()之后,它處于結束狀態;
(3)在一般情況下,一些播放控制操作可能由于不支持的音頻格式,交錯的不良音頻,流超時等各種原因產生一些錯誤報告。因此,錯誤報告和恢復是在這種情況下的一個重要問題。而且,有時由于在無效狀態下調用重放控制操作這種編程錯誤也會產生錯誤報告。此時,MediaPlayer對象處于錯誤狀態。
(4)在執行setDataSource()時,MediaPlayer對象從空閑狀態到初始化狀態。
在MediaSession框架中,有一個受控端和一個以上的控制端。接下來為了保證受控端和控制端相互之間的匹配,就有了SessionToken的概念。在MediaSession框架中,這是最重要的概念。
3.2 RSS技術
RSS(Rich Site Summary)是一種網絡供稿,它允許用戶訪問標準化在線更新內容,是一種計算機可讀的格式。這種內容的傳遞被稱為網絡聚合。網站通常使用RSS feeds來發布頻繁更新的信息,例如博客文章、頭條新聞、音頻、視頻。一個RSS文件(稱為“feed”,“web feed”,或者“channel”)包括完整或概括的文本和元數據,如出版日期和作者姓名等。
RSS是一個標準的XML文件格式,確保與許多不同的機器/程序的兼容性。RSS feeds也有利于用戶從喜愛的網站,或從許多網站匯總數據得到及時的更新。
4.1 網絡請求框架選型
市場上有很多網絡訪問庫可供選擇,OkHttp、Retrofit、Volley、NoHttp、HttpClient、HttpURLConnection等都是較為成熟的網絡請求框架,其中HttpClient和HttpURLConnection都是網絡請求的基礎庫,并且HttpClient在Android 6.0之后已經從系統底層被移除了,因此在底層庫上選擇HttpURLConnection。
NoHttp是一個開源的項目,在國內有著一定的影響力。支持與Rxjava相結合,支持切換OKHttp底層,支持將緩存保存至本地(數據庫或文件),并且自動加密緩存文件。由于是國人開源的一個項目,因此文檔描述更符合國人的邏輯,使用習慣也和國人的習慣更類似。
最后選擇了NoHttp作為本項目的網絡請求框架,并且擁有著不錯的體驗。
4.2 數據庫選型
數據持久化幾乎是所有APP都會涉及到的功能,通過將云端獲取的數據保存至本地,可以減少APP請求網絡的次數減輕服務器壓力,同時也可以在無網絡或弱網絡的情況下展示有效界面。
在Android中數據存儲主要有四種比較常見的方式:
(1)SharePreferences。其本質是一個XML文件,通過鍵值對的形式保存數據,由于本質就是讀取寫入文件,因此這種數據存儲只適合一些類似配置信息的小數據存儲,而對于動輒2~3M的數據就會影響數據的讀取寫入速度(特別是對于一些存儲器件還是前幾代產品的老機器)。
(2)數據庫。在Android中內置的數據庫是一個輕量級的數據庫SQLite,不具有數據庫用戶概念,它支持基本的SQL語法,并且Android也為其提供了一個SQLiteDatabase類用于數據庫的訪問。SQLite也是Android上使用最廣泛的數據庫。
(3)Contert Provider。是Android四大組件之一,顧名思義,它可以為APP提供內容,可以通過ContentResolver接收封裝好的數據。不過,Contert Provider只用于程序間的通訊,如果只是用于當前程序使用,建議使用其他三種存儲方式。
(4)File。文件存儲(也叫做I/O存儲)是最常用的數據保存方式,無論是在PC或者服務器中,始終有著其獨有的優勢與作用。在Android中,文件存儲主要用于一些超大數據的存儲,類似圖片資源、游戲數據包等都是使用文件存儲,當然由于是整讀整寫的特性,導致它更新數據,刪除部分數據時效率極其低,因此對于一些經常改動的數據,不建議直接保存在文件中。
經過多方對比,結合APP本身的需求,最終選擇使用數據庫存儲節目數據,使用SharePreferences存儲配置信息。隨著對Android上數據庫的深入研究,發現在市面上不止有SQLiteDatabase這一種方式。能在Android上使用的還有OrmLite、SugarORM、GreenDAO、Realm等,而GreenDAO和Realm又是目前比較受歡迎的兩種數據庫存儲方式。
GreenDao是一個很好的解決方案,它能夠支持每秒數千條記錄的增刪改查,和OrmLite相比,GreenDAO要快幾乎4.5倍,而且GreenDAO體積只有不到100kb,對于APP本身大小影響很小。
Realm是另一種解決方式,它是一個 MVCC 數據庫并非使用SQLite數據庫,底層用C++編寫。由于在編譯時,Realm被直接編譯成機器語言,因此在運行時具有更高的效率。
為了比較這兩個數據庫的速度,做了如下測試(縱軸單位毫秒):

圖1 數據插入耗時對比圖
由圖1可以看出,在數據插入時,前期GreenDAO和Realm差別不大,隨著數據量的增大,Realm消耗時間增加不大,而GreenDAO卻呈現指數式增長;不過在刪除數據時則有不同的表現,當數據超過1000條之后,Realm消耗的時間急劇上升,而GreenDAO則相差不大,增長緩慢。綜合上面的統計,Realm的優勢在于插入和查詢,這正符合本項目對存儲性能的要求,因此最終選擇Realm。由于Realm的訪問必須保持在同一線程種,經過研究,最后結合RxJava解決不同線程間數據庫訪問的問題。
本章將對在線收聽功能、節目緩存功能、離線播放功能、搜索功能和評論展示功能來介紹這個軟件。
5.1 在線收聽功能
如圖2所示,用戶可以在在線播放界面查看到播放進度,可以拖動進度條調節節目進度,也可以通過底部兩側的按鈕微調進度。底部中間的按鈕很顯然也可以進行暫停、播放操作。在進度條的上方有三個按鈕,分別是節目詳情、節目緩存、顯示評論功能。如圖3所示,就是點擊節目詳情后出現的界面,用戶可以點擊“×”或空白區域,隱藏詳情頁。此外,在播放界面右上角有一個隱藏選項跳轉官網,可以使用系統瀏覽器打開節目對應的官方網站。

圖2 客戶端在線收聽界面UI圖

圖3 播放界面節目詳情界面UI圖
5.2 客戶端節目緩存功能實現
客戶端所需要的數據是各分類緩存節目數、下載的狀態和下載的進度。在數據庫設計時就有緩存節目表,通過對表內數據的查詢,可以分析出各個分類緩存節目的數量。
客戶端將不同分類的緩存節目顯示在當前界面,考慮到文件可能被手動刪除的問題,每次數據取出后,都需要在本地文件中掃描一次,查看緩存文件是否存在,若文件存在則顯示,若文件已被刪除則刪除數據庫中的記錄,也不會顯示在列表中。
5.3 客戶端離線播放功能實現
離線播放界面與在線播放界面很類似,唯一的區別是離線播放界面的下載按鈕無法使用,顯示已下載。其他按鈕的功能與在線播放界面相同。左上角的返回鍵可以返回到進入本界面之前的界面,而右上角也隱藏著一個去往官網的按鈕。底部的三個按鈕分別是快退、播放/暫停、快進。進度條會顯示播放進度,并且可以通過進度條控制節目播放的進度。進度條上的三個按鈕同樣也是節目詳情、下載、跳轉評論界面,當然就像上面提到的,下載按鈕在離線播放的情況下是無法點擊的。
5.4 客戶端搜索功能實現
搜索界面是從主頁右上角的搜索按鈕點擊進入的,界面簡潔只有返回鍵、搜索框、搜索內容清空按鈕。點擊返回鍵返回到上一界面;點擊搜索框彈出輸入法,可以輸入想要查找的關鍵字;而右側的按鈕點擊后可以將搜索框內的內容清空。而在停止輸入時,則會顯示搜索到的相關節目,節目顯示簡要信息,以標題、發布者為主。點擊即會進入在線/離線播放界面進行播放。
5.5 客戶端評論展示功能實現
界面上顯示當前節目的評論,節目信息中主要包含當前評論樓層數、評論人用戶名、評論發布時間、評論發布的內容。在獲取數據時,顯示獲取狀態Dialog,提示用戶等待。在無數據時,顯示無任何評論。由于某些情況的需求,當長按評論時,將評論內容復制到剪貼板,并Toast提示已成功復制該條評論,復制的評論內容可用于他用。界面整體遵循Material Design設計理念,在點擊每條評論時,都會有一個水波紋漣漪效果。
本論文針對《科學脫口秀》這一檔播客節目Android客戶端的需求,結合市面上多款同類APP的特性和交互,借鑒MaterialUp網站大量的界面設計,總結出了一套全新的界面和交互。并且,調研了多個市場廣泛使用的技術,選擇了最符合本項目,且較為穩定經過市場考驗的幾項技術,結合最新官方推薦的成熟的開發工具,開發了該軟件。
該軟件實現了預定的收聽播客節目的需求,其包括在線收聽功能、節目緩存功能、離線播放功能、節目搜索功能、節目評論展示功能,解決了之前在Android端收聽體驗不佳的問題。提供了一套完整的功能,能夠讓用戶隨時隨地收聽節目,沒有任何廣告打擾,也沒有其他無用推薦,只做用戶想要的。
[1] C.J.Date.數據庫系統導論[M].北京:機械工業出版社,2007.
[2] 許艷萍.Android智能終端安全綜述[J].通信學報,2016, 37(6):169-184.
[3] 卿斯漢.Android安全研究進展[J].軟件學報,2016, 27(1):45-71.
責任編輯:程艷艷
Design and Realization of “Science Talk Show” at Android End
TAN Lu, JIN Weiyang
(College of Computer Science and Technology, Changchun University, Changchun 130022, China)
This paper discusses the application program running on mobile terminal equipment based on Android, JAVA and Realm, which mainly realizes the functions of iPod+broadcasting programs such as the classification display, online play, offline cache play, fuzzy query, introduction and view, comment browsing, notification column or wire-driven control music play, disturbance for incoming telegram or short message and statistics for listening or clicking rate, etc., satisfying users’ basic requirement to listen to the iPod+broadcasting programs.
iPod+broadcasting; Android; realm; MediaSession; martial design
2017-07-20
譚璐(1976-),女,吉林長春人,講師,碩士,主要從事計算機科學與技術應用方面研究。
P315.69
A
1009-3907(2017)08-0025-05