WebView項目中PhoneGap插件使用細節(jié)
WebView項目中PhoneGap插件使用細節(jié)是本文要介紹的內(nèi)容,主要是來了解PhoneGap插件的用法,作過android開發(fā)的對于startActivityForResult這個方法的調(diào)用,應(yīng)該不會陌生。
它就像是javascript中的模式對話模式,可以在彈出的新頁面中,讓用戶進行操作,并把結(jié)果回傳到所調(diào)用頁面。當然在android中的實現(xiàn),是有所差異。
在實現(xiàn)項目中,使用有PhoneGap插件,來作webview應(yīng)用的開發(fā)。
當直接使startActivityForResult(intent,requestcode)這個方法,會提示PhoneGap出錯,
- PhoneGapException:CallstartActivityForResult(Command,Intent)instead.
看源碼,建設(shè)調(diào)用使用startActivityForResult(intent,-1).這樣寫的話,達不到“模式對話框”的目的。
源碼中還有另一個PhoneGap擴展的方法:
- publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode)
,一開始也沒管那么多,直接就調(diào)這個,那個Plugincommand的參數(shù),因為我是主程序調(diào)用的,所以很自然的就直接置為null.
測試正常,調(diào)用、回調(diào)都正常。以后沒事了
項目運行一段時間后,發(fā)覺以前從插件發(fā)起的startActivityForResult都無法正?;卣{(diào)了。也就是插件里面定義的onActivityResult都沒有被調(diào)到,跟蹤發(fā)現(xiàn),所有的回調(diào)都被主程序的onActivity給攔截了。
分析以下代碼可以看出PhoneGap插件中,onActivityResult如何與對應(yīng)插件相綁定,以及產(chǎn)生上述問題的原因:
Java代碼
- publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode){
- this.activityResultCallback=command;
- thisthisthis.activityResultKeepRunning=this.keepRunning;
- //Ifmultitaskingturnedon,thendisableitforactivitiesthatreturnresults
- if(command!=null){
- this.keepRunning=false;
- }
- //Startactivity
- super.startActivityForResult(intent,requestCode);
- }
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){
- super.onActivityResult(requestCode,resultCode,intent);
- Plugincallback=this.activityResultCallback;
- if(callback!=null){
- callback.onActivityResult(requestCode,resultCode,intent);
- }
- }
- publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode){
- this.activityResultCallback=command;
- thisthisthis.activityResultKeepRunning=this.keepRunning;
- //Ifmultitaskingturnedon,thendisableitforactivitiesthatreturnresults
- if(command!=null){
- this.keepRunning=false;
- }
- //Startactivity
- super.startActivityForResult(intent,requestCode);
- }
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){
- super.onActivityResult(requestCode,resultCode,intent);
- Plugincallback=this.activityResultCallback;
- if(callback!=null){
- callback.onActivityResult(requestCode,resultCode,intent);
- }
- }
看來想在主程序(繼承GapDroid)中使用startActivityForResult方法,只能采用綁定插件的辦法了。
分析過程是相當無聊。只列出來解決辦法,希望有更好處理的同仁,給予回復(fù):
在主程序中定義一個空的插件,所有需要用到startActivityForResult的場合,都使用這個空的插件來作為***參數(shù)。并在空插件中覆蓋onActivityResult方法(里面可以是直接訪問、調(diào)用主程序的代碼)。
Java代碼
- /**
- *自定義一個空的插件,僅為完成原DroidGap中的事件處理邏輯
- */
- classEmptyPluginextendsPlugin{
- @Override
- publicPluginResultexecute(Stringaction,JSONArrayargs,
- StringcallbackId){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidonActivityResult(intrequestCode,intresultCode,
- Intentintent){
- //TODOAuto-generatedmethodstub
- if(resultCode==RESULT_OK){
- if(requestCode==SETTING_CODE){
- ........................................自己的處理代碼............
- }
- }
- }
- }
- /**
- *自定義一個空的插件,僅為完成原DroidGap中的事件處理邏輯
- */
- classEmptyPluginextendsPlugin{
- @Override
- publicPluginResultexecute(Stringaction,JSONArrayargs,
- StringcallbackId){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicvoidonActivityResult(intrequestCode,intresultCode,
- Intentintent){
- //TODOAuto-generatedmethodstub
- if(resultCode==RESULT_OK){
- if(requestCode==SETTING_CODE){
- ........................................自己的處理代碼............
- }
- }
- }
- }
Java代碼
- privatefinalEmptyPluginep=newEmptyPlugin();
- privatefinalEmptyPluginep=newEmptyPlugin();
Java代碼
- startActivityForResult(ep,intent,111111);
小結(jié):WebView項目中PhoneGap插件使用細節(jié)startActivityForResult的內(nèi)容介紹完了,希望通過本文的學習能對你有所幫助!