林佳煜 蘇煜輝 陳正銘 鄭璇麗
摘要:2017年1月微信小程序正式上線。和傳統(tǒng)的原生App相比較,小程序能實(shí)現(xiàn)其基本功能,但又有所區(qū)別。為了讓更多人了解兩者之間的區(qū)別,在應(yīng)用開(kāi)發(fā)上做出更精致的選擇,在本文中將以安卓原生App為例來(lái)對(duì)兩者進(jìn)行比較,從而分析兩者間的區(qū)別。首先通過(guò)介紹兩者的技術(shù)差異,進(jìn)一步對(duì)比總結(jié)出兩者在功能實(shí)現(xiàn)方式上的區(qū)別,再對(duì)其優(yōu)劣、市場(chǎng)等方面做出分析,最終總結(jié)出兩者未來(lái)的發(fā)展趨勢(shì),以供開(kāi)發(fā)者更好地選擇。
關(guān)鍵詞:微信小程序;移動(dòng)App;MINA框架;四大組件;藍(lán)牙模塊
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)35-0022-04
自微信小程序上線以來(lái),有調(diào)查分析,截止到2017年年末,小程序的用戶已經(jīng)超過(guò)了2億,它所涉及的行業(yè)領(lǐng)域也接近300+,小程序的價(jià)值被越來(lái)越多的人所發(fā)掘。我們不禁會(huì)拿它和手機(jī)的原生App做對(duì)比,思考兩者區(qū)別。小程序和原生App各有優(yōu)劣,在未來(lái),兩者之間或許不僅沒(méi)有矛盾,還能起到互補(bǔ)作用。
1 微信小程序的開(kāi)發(fā)和主要技術(shù)
微信團(tuán)隊(duì)有為小程序設(shè)計(jì)師開(kāi)發(fā)了專門的開(kāi)發(fā)工具,在開(kāi)發(fā)前,和注冊(cè)公眾號(hào)類似,首先要對(duì)小程序進(jìn)行申請(qǐng)和認(rèn)證,成功申請(qǐng)后登錄小程序管理后臺(tái),點(diǎn)擊下載安裝開(kāi)發(fā)工具,即可在此平臺(tái)上進(jìn)行開(kāi)發(fā)設(shè)計(jì)。
小程序開(kāi)發(fā)過(guò)程像手機(jī)版的前端網(wǎng)站開(kāi)發(fā)過(guò)程,它參考了很多前端的技術(shù)和理念,例如,它用React和Vue分別實(shí)現(xiàn)了“視覺(jué)組件”和Vue實(shí)現(xiàn)了標(biāo)簽式邏輯與數(shù)據(jù)綁定,用CMD的require作為腳本文件的JavaScript。
小程序用JavaScript語(yǔ)言、XML、CSS語(yǔ)言編寫程序代碼,但所采用的又不是標(biāo)準(zhǔn)化的H5+CSS3+JavaScript架構(gòu),也和Web架構(gòu)基于的W3C規(guī)范沒(méi)有任何關(guān)系。小程序使用騰訊全新定義的技術(shù)規(guī)范和架構(gòu),即WXML+WXSS+JavaScript架構(gòu),是微信特有的。
小程序有視圖層和邏輯層兩大部分。視圖層的作用主要是與小程序使用者的視覺(jué)進(jìn)行交互,邏輯層則是對(duì)小程序的數(shù)據(jù)和邏輯處理,兩者共同構(gòu)建了一個(gè)完整的框架。
1.1視圖層
視圖層描述的編程語(yǔ)言是騰訊公司定義規(guī)范的WXML和WXSS語(yǔ)言,剔除了復(fù)雜的關(guān)系配置,并且從規(guī)定上要求每個(gè)頁(yè)面需要有index.js、index.json、index.wxml、index.wxss這四個(gè)同名文件,每個(gè)文件功能不同:其中JS文件采用標(biāo)準(zhǔn)的JS語(yǔ)法規(guī)范,用于邏輯操作;Json文件顧名思義是用JSON語(yǔ)言書(shū)寫的,是為了配置頁(yè)面文件;wxml文件用XML語(yǔ)言書(shū)寫,作用是描述頁(yè)面視覺(jué)組件;而wxss則類似于前端的CSS語(yǔ)言,目的是定義給WXML組件樣式。
例如,在wxml文件中創(chuàng)建一個(gè)圖片視圖組件:
在wxss文件中:
.user-avater{
width:200rpx;
height:200rpx;
margin-top:160rpx;
border-radius:50%;//設(shè)置圖像為圓形
overflow:hidden;
}
通過(guò)在wxml文件中設(shè)置類對(duì)象名即可在wxss中利用該名對(duì)視圖進(jìn)行修飾。
1.2邏輯層和MINA框架
邏輯層是基于JavaScript語(yǔ)言框架的,該框架能其和視圖層進(jìn)行事件監(jiān)聽(tīng)和數(shù)據(jù)傳輸,微信團(tuán)隊(duì)把這兩個(gè)部分所組成的框架命名為MINA應(yīng)用框架。開(kāi)發(fā)者可以把網(wǎng)絡(luò)通信、數(shù)據(jù)安全、任務(wù)管理和文件系統(tǒng)等寫到邏輯層上,框架又對(duì)上層提供一整套JavaScript API(可搜索官網(wǎng)上的簡(jiǎn)易教程),這樣就能輕松地使用微信官網(wǎng)提供的各種基礎(chǔ)功能與能力,快速制作出一個(gè)應(yīng)用。其示例代碼如下:
在js文件中Page函數(shù)下:
Page({
data:{
motto:'Hello World',
userInfo:{},
hasUserlnfo: false,
},
//事件處理函數(shù)
bindViewTap: function(){
wx.switchTab({
url:'../posts/posts'
})
},
onLoad: function(){
},
})
其中的data和bindViewTap分別起到數(shù)據(jù)綁定和事件設(shè)置的作用。
2 Android App開(kāi)發(fā)和主要技術(shù)
2.1開(kāi)發(fā)軟件Android Studio
Android App是基于Java語(yǔ)言開(kāi)發(fā)的,以前用的是Eclipse環(huán)境,現(xiàn)在主流用Android Studio開(kāi)發(fā)。開(kāi)發(fā)時(shí)要有有JavaJDK,Android SDK等輔助工具。Android App的開(kāi)發(fā)采用的是將視圖層與邏輯層分開(kāi)編寫的方式。邏輯層是基于純JAVA語(yǔ)言,視圖層在xml文件上,用到的自然是XML語(yǔ)言。下面是書(shū)寫示例:
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:laout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"
android:id="@+id/mTabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android.background="@color/colorPrimary"
app:tabGravity="fill"
app:tabIndicatorColor="@color/colorAccent"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorAccent"
app:tabTextColor="@android:color/white"
/>
android:id="@+id/mViewPager"
android:layout_width="match__parent"
android:layout_height="Odp"
android:layout_weight="1"/>
另外還有Manifase等配置文件,負(fù)責(zé)添加權(quán)限,注冊(cè)等。
<!--一添加網(wǎng)絡(luò)權(quán)限一-->
<!--一注冊(cè)活動(dòng)并設(shè)為主活動(dòng)一-->
2.2四大組件
Android系統(tǒng)的四大組件分別是活動(dòng)(Activity),廣播接收器(Broadcast Receiver),服務(wù)(Service)和內(nèi)容提供器(Content Pro—vider)。
Activity。顧名思義為程序的活動(dòng),每個(gè)界面會(huì)對(duì)應(yīng)一個(gè)Activity,而androidApp采用的是視圖和邏輯分離的結(jié)構(gòu)。例如要舉辦一個(gè)活動(dòng),邏輯層就是寫本次活動(dòng)的流程,而視圖層則是布置活動(dòng)的場(chǎng)地,即UI布局,而setContentView(R.layout.activ一ity_main)語(yǔ)句關(guān)聯(lián)視圖層,其中參數(shù)為對(duì)應(yīng)的的xml文件。
Service,即服務(wù),是專門為后臺(tái)任務(wù)而產(chǎn)生的方案,是和邏輯層分開(kāi)的另外的線程任務(wù),適合執(zhí)行那些時(shí)間較長(zhǎng)并且和界面交互聯(lián)系不大的的任務(wù),這是因?yàn)樗灰蕾嚥幌馻ctivity一樣依賴于視圖層頁(yè)面,相對(duì)獨(dú)立。當(dāng)此程序被切換到手機(jī)后臺(tái)時(shí),該服務(wù)仍然可以執(zhí)行,直到任務(wù)完成。
Broadcast Receiver是廣播接收器的意思。這個(gè)組件可以響應(yīng)本程序或者手機(jī)上其他進(jìn)程的廣播消息,成為名副其實(shí)的溝通橋梁。具體過(guò)程是,一個(gè)應(yīng)用程序注冊(cè)一個(gè)繼承Broadcas—tReceiver的廣播類,通過(guò)設(shè)置系統(tǒng)事件來(lái)決定要響應(yīng)的消息,同樣發(fā)送廣播的另一方也要設(shè)置對(duì)應(yīng)的事件參數(shù),這樣當(dāng)它完成行為后發(fā)送出去的消息就會(huì)這個(gè)廣播類響應(yīng)。廣播接收器可以實(shí)現(xiàn)多線程通信或者不同應(yīng)用之間的通信。
Content Provider,是內(nèi)容提供器的意思,它的作用是實(shí)現(xiàn)不同應(yīng)用之間的數(shù)據(jù)共享,比如你想要讀取系統(tǒng)電話簿中的聯(lián)系人或者其它應(yīng)用的賬號(hào)信息。它有一套完整的機(jī)制,在程序進(jìn)行訪問(wèn)的同時(shí),保證這些被訪數(shù)據(jù)的安全性。此組件是An—dmid進(jìn)行程序進(jìn)行數(shù)據(jù)共享的標(biāo)準(zhǔn)方法。
3 比較分析
基于上面簡(jiǎn)介,下面從開(kāi)發(fā)語(yǔ)言、架構(gòu)等對(duì)兩者做了一個(gè)初步對(duì)比:
3.1開(kāi)發(fā)上(功能擴(kuò)展上,以連接藍(lán)牙功能為例:)
3.1.1小程序上,連接藍(lán)牙主要有以下步驟去調(diào)用官方的API
(1)對(duì)藍(lán)牙進(jìn)行初始化
wx.openBluetoothAdapter({
success: function (res){
console.log(res)
},
fail: function(res){
wx.showModal({
content:'請(qǐng)開(kāi)啟手機(jī)藍(lán)牙后再試'
})
}
})
(2)掃描查詢藍(lán)牙
wx.startBluetoothDevicesDiscovery({
success:function(res){
console.log('search',res)
}
})
(3)獲得已發(fā)現(xiàn)的設(shè)備
wx.getBluetoothDevices({
success:function(res){
console.log('發(fā)現(xiàn)設(shè)備',res)
if(res.devices[0]){
console.log(that.ab2hext(res.devices[O].advertisData))
}
}
})
(4)監(jiān)聽(tīng)尋找到新設(shè)備的事件
wx.onBluetoothDeviceFound(function(devices){
console.log('發(fā)現(xiàn)設(shè)備:',devices.devices)
for(let i=0;i
//檢索指定設(shè)備
if(devices.devices[i].name=='掃描到的設(shè)備名字'){
that.setData({
deviceld:devices.devices[i].deviceld
})
//關(guān)閉搜索
that.stopBluetoothDevicesDiscovery();
console.log('已找到指定設(shè)備:',devices.devices[i].deviceld);
}
}
})
(5)連接低功耗藍(lán)牙設(shè)備
wx.createBLEConnection({
deviceld:that.data.deviceld,//搜索所獲設(shè)備id
success:function(res){
console.log('成功連接:',res.errMsg);
},
fail:function(res){
app.showToast('連接超時(shí),請(qǐng)重試或更換車輛','none');
that.closeBluetoothAdapter();
}
})
3.1.2Android開(kāi)發(fā)上
這里以低功耗藍(lán)牙為例(這是android4.3以后提供的API,多用于穿戴設(shè)備),下面是主要的步驟:
(1)權(quán)限的添加
在配置文件上添加BLUETOOTH, BLUETOOTH_ADMIN,ACCESS_COARSE_LOCATIONS三個(gè)請(qǐng)求。
(2)得到適配器(通過(guò)其進(jìn)行低功耗藍(lán)牙操作)
獲取到適配器要先對(duì)其進(jìn)行判斷,若不為空,則手機(jī)支持藍(lán)牙設(shè)備
final BluetoothManager bluetoothManager=
(BluetoothManager)getSystemService(Context.BLUE-TOOTH_SERVICE);
private BluetoothAdapter mBtAdapter=bluetoothManager. get-Adapter0;
(3)打開(kāi)藍(lán)牙(先判斷是否啟動(dòng),若無(wú)則執(zhí)行打開(kāi)意圖)
if(mBtAdapter!= null&&!mBtAdapter.isEnabled0){
,,申請(qǐng)打開(kāi)藍(lán)牙功能
Intent btlntent= new Intent(BluetoothAdapter. ACTION_RE-QUEST_ENABLE);
startActivity(btIntent);}
(4)判斷api版本(如果當(dāng)前api版本低于23,則要再次進(jìn)行動(dòng)態(tài)申請(qǐng))
ActivityCompat.requestPermissions(MainActivity.this,
new String□{Manifest.permission.ACCESS_COARSE_LOCA-TION},0);
(5)掃描設(shè)備,其中,scanCallback是一個(gè)用于掃描的回調(diào)方法,mLeScanner是新封裝的掃描類
final ScanCallback callback=new ScanCallback(){
@Override
public void onScanResult(int callbackType,ScanResult re-sult){
super.onScanResult(callbackType,result);
BluetoothDevice device=result.getDevice();
mBleAddress=device.getAddress();
}};
mLeScanner.startScan(callback);
(6)通過(guò)掃描中獲得的地址連接設(shè)備
final BluetoothDevice btDevice=mBtAdapter.getRemot-eDevice(mBleAddress);
mGatt=btDevice.connectGatt(MainActivity.this,false,mCall-back):
從這個(gè)例子可以看到,安卓在功能開(kāi)發(fā)是基于java代碼開(kāi)發(fā),我們需要調(diào)用相應(yīng)的SDK工具類來(lái)寫,有時(shí)要在xml配置文件上配置權(quán)限,而小程序則是js文件上調(diào)用api,而且很多功能在官方的開(kāi)發(fā)文檔上都有。
從開(kāi)發(fā)到使用,兩者之間各有優(yōu)劣:
3.2市場(chǎng)上
3.2.1微信小程序市場(chǎng)
小程序的日益完善,便利和巨大的用戶基數(shù),這吸引了越來(lái)越多的企業(yè)者投資開(kāi)發(fā),目前已經(jīng)涵蓋200多個(gè)行業(yè)。其中重點(diǎn)投入的有生活服務(wù)類,電商平臺(tái)和小游戲等等。且截至2018年5月,用戶數(shù)量已突破10億,電商平臺(tái)、交通出行、工具、生活服務(wù)等較多,在未來(lái),用戶數(shù)還會(huì)持續(xù)上升,不過(guò),就單個(gè)小程序用戶量相當(dāng)對(duì)App來(lái)說(shuō)仍然很少。
3.2.2App市場(chǎng)
從全球市場(chǎng)來(lái)看,過(guò)去幾年App的下載量猛增,僅僅去年下載量就增加了6成作用,而中國(guó)就是最大的市場(chǎng),App增長(zhǎng)超過(guò)了其他國(guó)家。不過(guò)市場(chǎng)上的App逐漸出現(xiàn)馬太效應(yīng),一些大型企業(yè)越做越大,而一些功能少且使用頻度小的平臺(tái)逐漸轉(zhuǎn)移到小程序上。
4 結(jié)論
目前來(lái)看,開(kāi)發(fā)者或是使用者對(duì)兩者的選擇,無(wú)非就是從“大”和“小”之間選擇。在未來(lái),小程序?qū)⒋嬉恍┖?jiǎn)單功能的App成為主流,因?yàn)闊o(wú)論是開(kāi)發(fā),推廣還是使用上都比App要便捷,而App則是在其他方面占優(yōu)勢(shì),例如個(gè)性化的功能和交互方式,面向操作系統(tǒng)的底層性能優(yōu)化,對(duì)離線數(shù)據(jù)的支持等,都比小程序強(qiáng)大,適合承載大型多樣的功能,例如大型游戲、美圖秀秀、高德地圖這些。微信小程序更適合被用來(lái)開(kāi)發(fā)為那些功能相對(duì)較少,并且使用頻度低的應(yīng)用。
參考文獻(xiàn):
[1]喻國(guó)明,程思琪.從“連接”到“場(chǎng)景”:互聯(lián)網(wǎng)發(fā)展的重要進(jìn)階——試析微信小程序的價(jià)值邏輯與市場(chǎng)版圖[J].新聞大學(xué),2018(01):121-127,146,153-154.
[2]董曉剛.Android系統(tǒng)四大組件的注冊(cè)與激活[J].硅谷,2013,6(05):16.
[3]郭全中.小程序及其未來(lái)[J].新聞與寫作,2017(03).
[4]王慶剛,孫永政,吳天城.淺析安卓開(kāi)發(fā)的相關(guān)技術(shù)[J].電腦迷,2017(03):23.
[5]李成淵,徐明亮.基于安卓開(kāi)發(fā)技術(shù)的校園咨詢共享平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)[J].無(wú)線互聯(lián)科技,2018,15(18):140-142.
[6]雷楚奇.對(duì)安卓開(kāi)發(fā)相關(guān)技術(shù)的研究[J].電子技術(shù)與軟件工程,2015(24):74.
[7]劉紅衛(wèi),微信小程序應(yīng)用探析[J].無(wú)線互聯(lián)科技,2016(23):11-12,40.
【通聯(lián)編輯:梁書(shū)】
收稿日期:2019-10-20
基金項(xiàng)目:韶關(guān)學(xué)院校級(jí)大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計(jì)劃項(xiàng)目資助(項(xiàng)目編號(hào):Sycxcy2019074S)
作者簡(jiǎn)介:蘇煜輝(1999-),男,廣東潮州人,韶關(guān)學(xué)院信息科學(xué)與工程學(xué)院本科生,主要研究方向?yàn)榫W(wǎng)站開(kāi)發(fā)、PHP開(kāi)發(fā);林佳煜(1997-),男,廣東汕頭人,韶關(guān)學(xué)院信息科學(xué)與工程學(xué)院本科生,主要研究方向?yàn)榍度胧綉?yīng)用開(kāi)發(fā)、安卓軟件開(kāi)發(fā)。