?

JavaReflector技術在AppInventor編程中擴展功能的研究

2024-01-12 04:39高占江韓丹
微型電腦應用 2023年12期
關鍵詞:開發者列表調用

高占江, 韓丹

(青島科技大學(高密校區), 計算機系, 山東, 濰坊 261500)

0 引言

移動應用開發已成為現代科技發展的重要領域,而AppInventor的出現為普通用戶提供了一種簡單、直觀的方式來創建自己的移動應用。然而,雖然AppInventor提供了豐富的積木塊用于實現各種功能,但其積木塊的種類和數量仍然存在一定的限制。這意味著開發者在設計應用時可能會受到功能上的限制,無法實現一些個性化或復雜的功能。為了解決這個問題,本文提出一種創新的方法,即利用JavaReflector技術在AppInventor中調用Android-SDK的Java語言的API。通過這種方法,開發者可以直接閱讀Java API文檔和Android API文檔,并在AppInventor中在不需要自己定制拓展組件的情況下調用Android-SDK所提供的API。這種技術為開發者提供了一個橋梁,能夠將AppInventor與Android SDK中API無縫連接起來,從而實現功能的無限擴展。

本文詳細介紹JavaReflector技術在AppInventor中的應用,探討其實現的原理和方法,并通過一系列實驗驗證其可行性和有效性。我們相信,通過這種創新的方法,能夠幫助開發者在AppInventor中實現更加豐富、個性化的功能,從而推動移動應用的發展和創新。

1 AppInventor開發模式

當今社會智能終端的應用無處不在,移動智能端操作系統Android占有了市場70%以上的份額是因為Android系統的App的開發吸引了更多開發者的眼球。

Android操作系統中編程方式很多,其中Google公司開發的AppInventor編程方式吸引了很多初學者,特別是中小學編程愛好者的目光。Google AppInventor[1]編程方式是一個完全在線的Android系統的App開發模式,它不需要開發者使用任何一種編程語言,只需要用一種類似積木式的搭建方式來開發自己的應用程序,這種方式讓很多對編程望而卻步的初學者興趣倍增,除此之外,它支持樂高NXT機器人,對機器人開發者來說更是一大福音。

2 AppInventor局限性

AppInventor中所有的組件都可以直接被拖曳使用,并且每個組件都將其屬性和相關的事件被可視化處理,構造成了具有特殊接口的“積木”。開發者的需求是千變萬化的,但AppInventor中每個組件提供的屬性是有限的,每個組件的方法也是有限的,從這方面考慮,這種編程方式是非常受限的,對有過其他編程語言開發經驗的開發者來說,使用Java語言編寫Android App可以使用很多的類和對象,更有無數的方法和函數去調用,對比在AppInventor中可調用的類或者函數變得非常局限,這給這種開發方式一個啟發。

3 擴展的實現

本文在AppInventor中提供一種擴展功能的調用方式,允許在積木式的編程環境中調用Android SDK[2],實現與代碼編程同樣的功能效果。JavaReflector技術的作用是通過“積木塊”調用Android系統底層接口,能夠充分使用SDK提供的各種類、對象、成員變量屬性和方法,即Android SDK提供的所有方法和接口都能夠轉化為“積木塊”在AppInventor編程環境中被使用,擴充了開發的邏輯環境。

3.1 可見組件塊的實現方式

在Android的原生態編程環境中,使用Java語言編程是Android編程最常用的方式,“按鈕”在代碼編程中是調用底層Android SDK中的android.widget.Button[3]類,在Eclipse或AndroidStudio等代碼開發環境中,可以直接使用類Button創建的對象調用其屬性或方法實現相應的功能,如更改按鈕顯示的文本調用對象Button的setText()方法即可。在AppInventor中的“按鈕”是一種可視化的組件,開發者直接拖曳到組件設計面板即可,想更改其文本可以直接使用其提供的塊,如圖1所示。

圖1 更改按鈕文本塊

但AppInventor提供的類似這種事件塊是很有限的,因為AppInventor中拖曳的“按鈕”是類com.google.appinventor.components.runtime.Button,它是對Android SDK中提供的android.widget.Button類的封裝,所以通過JavaReflector技術構建起這2個類之間的橋梁,就可以通過AppInventor中的“塊”調用SDK中的屬性和方法。在組件面板中拖入JavaReflector組件[4],通過圖2的方法獲取AppInventor中的“按鈕1”所封裝的SDK中的Button類的對象(Button類的實例)。

圖2 獲取按鈕的內部實例

獲得android.widget.Button類的實例之后,可以通過該實例調用其方法或屬性實現相應的動作,例如在SDK中對按鈕文本的更改使用的是public final void setText (CharSequence text)函數[5],要注意的是,在AppInventor塊編程環境中,執行該函數的方法也是通過JavaReflector組件,如圖3所示。

圖3 JavaReflector組件執行SDK提供的方法

使用的組件塊是InvokeMethod,第一個參數instance實例即獲取的按鈕的內部類android.widget.Button類的實例,第二個參數method就是該對象要調用的方法或者函數的名稱,這里只寫函數的名字和參數,函數的()由<>代替,并且參數只需要指明參數的類型。第三個參數是實參列表,首先使用創建列表塊準備創建列表,每個參數作為“列表塊”的一個元素拼接即可。該方法的含義就是更改按鈕顯示的文字,將圖3所示的代碼塊拼接在按鈕1的點擊事件里面,當點擊按鈕時就會更改其顯示的文本為“Hello”。

3.2 “不可見組件”的實現方式

在AppInventor的塊編程環境中,有很多組件是“不可見”組件,例如音樂播放器組件[6],下面以音樂播放器組件為例說明不可見組件調用SDK中函數的方式。通過“輸出調試信息”塊可以得到“音樂播放器”組件在AppInventor中的類com.google.appinventor.components.runtime.Player(以下簡稱Player類)[7],通過AppInventor的源代碼分析可以得到這個類的定義中包含了SDK中播放的引擎類android.media.MediaPlayer(以下簡稱MediaPlayer類),真正實現歌曲播放暫停等功能的核心類就是android.media.MediaPlayer,所以問題的關鍵在于在AppInventor環境中獲取不可見組件“音樂播放器”所對應的android.media.MediaPlayer類的實例對象,通過這個MediaPlayer類的實例對象就可以實現AppInventor環境中沒有實現的“獲取歌曲時長”“播放定位”塊的功能,因為Player類封裝了MediaPlayer類,首先獲取Player類(不包括其父類)的所有字段(類的成員變量),如圖4所示。

圖4 獲取類的所有字段

該方法是返回一個列表,因為只關心列表中的MediaPlayer類,所以需要從列表中查找出包含“MediaPlayer”的列表項,使用循環程序對列表中的每個項檢索,可獲得MediaPlayer類型的字段,如圖5所示。

圖5 檢索字段列表中指定類型的字段

輸出該列表項信息如下:

private android,media,MediaPlayer com,google,appinventor,components,runtime,Player.I;[8]

得到了需要的MediaPlayer類的字段。下面就是要獲得這個字段的實例(對象),從輸出信息可以看出AppInventor對類的變量名稱(類的對象/實例)進行了加密處理,所以不能直接獲得這個實例,還需要通過JavaReflector技術來獲取。JavaReflector組件提供了獲取對象內部字段值的塊,如圖6所示。

圖6 獲取對象的字段的值(實例/對象)

運行之后輸出信息:android.media.MediaPlayer@2e7129f5[9],說明獲取了內存中的具體對象,并且是SDK中的android.media.MediaPlayer類型,說明這個對象就是App-Inventor環境中不可見組件“音頻播放器1”所封裝的An-droid SDK中的MediaPlayer實例。有了這個對象之后,App-Inventor中“音頻播放器1”組件未提供的方法,可以通過MediaPlayer類的實例調用其函數來實現。

3.2.1 獲取歌曲總時長

在Android SDK中通過調用MediaPlayer對象的getDuration()]方法可以獲得當前播放歌曲的總時間長度,使用剛剛獲得的MediaPlayer實例來實現如圖7所示。

圖7 JavaReflector執行無參函數

圖7中的instance參數為執行函數的實例(對象),就是獲取的MediaPlayer類(已經賦值給全局變量),method參數為執行的函數名稱,因為該函數不需要參數,所以直接給定函數名稱即可,參數列表為空列表即可。

3.2.2 定位播放位置

定位播放位置的函數為seekTo(int msec)[10],該函數接收一個int類型參數,使用JavaReflector組件的InvokeMethod執行該函數即可,如圖8所示。

圖8 JavaReflector定位播放位置

需要強調的是,參數的形式為<>,內部僅需要放置各形參的類型,使用上類似于Java語言中的泛型,在參數列表中設置實參。

4 總結

AppInventor編程環境是一種全新的開發模式,它注重中文思維的編程模式,拋棄了復雜的編程語言的束縛,讓編程變得自由,但這種環境在App開發中還有很多局限性,很多SDK中實現的功能它無法實現,為了彌補不足,JavaReflector技術搭建起了兩者的橋梁,本文詳細闡述了JavaReflector技術在AppInventor編程環境中擴展功能的使用方式,從原理上剖析了它在獲得核心類實例的思路以及JavaReflector執行其函數的方式。

猜你喜歡
開發者列表調用
學習運用列表法
擴列吧
核電項目物項調用管理的應用研究
LabWindows/CVI下基于ActiveX技術的Excel調用
基于系統調用的惡意軟件檢測技術研究
16%游戲開發者看好VR
列表畫樹狀圖各有所長
iOS開發者調查
iOS開發者調查
栝樓產業開發者謝獻忠
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合