編輯:關於Android編程
每當進入一個新的工作環境,處於一種新的領域時,人總是會變得急功近利,特別是當任務緊急時,人總是會想著不斷的從網上搜尋答案,不斷的去尋問他人,十足的拿來主義,竟沒有靜下來自己思考與嘗試過,回頭看來,其實很多東西並沒有當初認為的那麼復雜,只是少了自己的一些總結和深思。
關於Unity和Android的互相調用,網上的教程太多了,大同小異,抄來抄去。這次我就嘗試著慢慢來,講講我的理解
內容分為三部分,分三篇寫完
前篇:Unity3d 與 Android之間的互相調用 中篇:Unity3d Android SDK的兩種接入方式 後篇:Unity3d 接入Android Libriary的理解與實現
總體來說Unity3d與Android之間的互相調用,是通過Unity3d提供的classes.jar來實現的(具體實現在中篇說)。
那麼下面假設已經按照要求建立好了Android的工程,並配置好了classes.jar,開始寫調用:
最常見的寫法:
這個方法只打印成功的提示:
public void u3dCall() {
Log.i(U2ATAG, "u3dCall Android Successful");
}
通過反射機制拿取對象並調用Android的接口u3dCall,這裡我們畫了一個Button,點擊Button調用u3dCall接口:
if(GUI.Button(new Rect(100,200,750,200),"U3dToAnd"))
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic("currentActivity");
jo.Call("u3dCall");
}
通過打印看到,我們成功的從Unity3d調用到了Android的代碼。
只有通過實踐慢慢探索,才能知道真相
我們先說第二個問題,Call只是Unity3d調用Android所設置的api之一,還有一些常用的:
通過這些方法,我們能夠方便的調用靜態方法、實例方法,還有獲取變量的值。
如果Android的方法是需要傳入參數的,則如下:
Android:
public void u3dCallWithArgs(String str, int i) {
Log.i(U2ATAG, "u3dCall Android Str|int is " + str + "|" + i);
}
U3d:
jo.Call("u3dCallWithArgs","Atany",100);
成功調用:
如果需要返回值:
Android:
public String u3dCallReturn() {
return "This is the return Value of Android";
}
U3d:
string msg = jo.Call("u3dCallReturn");
print ("U3d msg is "+msg);
成功調用:
其他的方法類似,可以猜到jo = jc.GetStatic(“currentActivity”);的意思,就是通過GetStatic獲取了靜態變量currentActivity的值,它的類型是AndroidJavaObject(Unity3d的JavaObject的基本類型)。
通過反編譯Unity3d生成的apk發現,UnityPlayer是FrameLayout的一個子類,而currentActivity則是UnityPlayer類中的靜態對象。
致此,就弄明白了,這個UnityPlayer原來就是一個Unity3d生成的一個類,我們通過new(”完整類名”)的方式獲取到了這個類,然後通過getStatic獲取到了currentActivity這個靜態對象。
(那麼問題又來了,currentActivity這個類是怎麼找到我寫的方法的呢?)
我刻意的避開了中篇要講的內容,但如果一點不提,感覺問題始終不能講明白,所以這裡就稍微說明一下。
在寫Android工程的時候,網上一般要求我們建立了一個新的MyActivity繼承UnityPlayerActivity,並在AndroidManifest中把MyActivity設置為啟動的Activity,然後使用currentActivity這個jo來調用方法。
為什麼要這麼做呢?通過觀察發現,他們的繼承關系是這樣的:
MyActivity <-- UnityPlayerActivity <--UnityPlayerNativeActivity <-- NativeActivity<-- Activity
(然而裡面並沒有com.unity3d.player.UnityPlayer這個class?)
繼續查找源碼發現,在 UnityPlayerNativeActivity 這個類中,聲明了一個UnityPlayer對象
在oncreate方法裡面初始化了這個對象,把UnityPlayerNativeActivity上下文作為參數傳了進去
然後在UnityPlayer類的構造方法中,把當前的上下文賦值給了currentActivity
所以,我們使用的currentActivity 就是當前activity的上下文。寫到這裡,我還有一個疑問,就是currentActivity是拿到的UnityPlayerNativeActivity的上下文,但是是怎麼調用到的Myactivity裡面的方法的呢?希望知道的人告訴我。
如果想要異步的發送消息回Unity那麼應該怎麼處理呢?就是使用Unity3d的UnitySendMessage發送回去
Android:
public void andToU3d() {
UnityPlayer.UnitySendMessage(OBJNAME, "andToU3dCallback", "exit");
}
U3d:
void andToU3dCallback(string str){
print ("andToU3dCallback string is "+str);
}
這篇博客我們來介紹一下責任鏈模式(Chain-of-responsibility Pattern),責任聯模式又稱為職責鏈模式,是行為型設計模式之一。顧名思義,責任鏈模式
上篇提到讓應用自動抓取Crash日志提交到服務器,如果發布之前沒有經過嚴格測試(個人練手做的一些小應用),會發現有很多異常都是顯而易見的錯誤,只是沒有嚴格測試忽略了而已,
本實例允許用戶動態添加號碼到黑名單,並實現黑名單來電自動掛斷。程序通過創建PhoneStateListener監聽器來監聽TelephonyManager的通話狀態來實現
Android平台的誕生為手機智能化的普及立下汗馬功勞,但其最大的缺點也越來越凸顯,那就是碎片化嚴重:設備繁多、品牌眾多、版本各異,芯片、攝像頭、分辨率不統一等等,這些都