如何在 android webview 中实现 phonegap/cordova?

Posted

技术标签:

【中文标题】如何在 android webview 中实现 phonegap/cordova?【英文标题】:How to implement phonegap/cordova in android webview? 【发布时间】:2014-09-01 21:21:10 【问题描述】:

我只需要几分钟就有人告诉我这些步骤对于在 android webview 中实现 cordova 是否正确:

编辑:好的,我终于让它工作了,这些是正确的步骤:

1)我创建项目:cordova create hello com.example.hello HelloWorld并进入文件夹

2) cordova platform add android, cordova run android (cordova.jar 已创建) => 应用程序已启动 => 显示设备已准备就绪

3)我使用以下代码在“/res/layout”中创建了一个cordova_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_ 
android:layout_ 
android:orientation="vertical" > 

<org.apache.cordova.CordovaWebView 
android:id="@+id/cordova_web_view" 
android:layout_ 
android:layout_ 
android:layout_weight="1" /> 


</LinearLayout>

4)导入项目(作为eclipse中的“现有项目”)并在导入后添加到主java文件中:

  public class HelloWorld extends Activity implements CordovaInterface 


private CordovaWebView cordova_webview;
private String TAG = "CORDOVA_ACTIVITY";
private final ExecutorService threadPool = Executors.newCachedThreadPool();



@Override 
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cordova_layout);
    cordova_webview = (CordovaWebView) findViewById(R.id.cordova_web_view);
    // Config.init(this); 
    String url = "file:///android_asset/www/index.html";
    cordova_webview.loadUrl(url, 10000);
 


    @Override 
    protected void onPause()  
        super.onPause(); 
        Log.d(TAG, "onPause");
     


    @Override 
    protected void onResume()  
        super.onResume(); 
        Log.d(TAG, "onResume");
     


    @Override 
    protected void onDestroy()  
        super.onDestroy(); 
        if (this.cordova_webview != null) 
            this.cordova_webview
                    .loadUrl("javascript:trycordova.require('cordova/channel').onDestroy.fire();catch(e)console.log('exception firing destroy event from native');;"); 
            this.cordova_webview.loadUrl("about:blank");
            cordova_webview.handleDestroy();
         
     



    @Override 
    public Activity getActivity() 
        return this;
     


    @Override 
    public ExecutorService getThreadPool() 
        return threadPool;
     


    @Override 
    public Object onMessage(String message, Object obj) 
        Log.d(TAG, message);
        if (message.equalsIgnoreCase("exit")) 
            super.finish(); 
         
        return null; 
     


    @Override 
    public void setActivityResultCallback(CordovaPlugin cordovaPlugin) 
        Log.d(TAG, "setActivityResultCallback is unimplemented");
     


    @Override 
    public void startActivityForResult(CordovaPlugin cordovaPlugin,
            Intent intent, int resultCode) 
        Log.d(TAG, "startActivityForResult is unimplemented");
     

注意:活动名称必须与 manifest.xml 中的名称匹配

希望对您有所帮助。 祝你有美好的一天!

【问题讨论】:

“Private final ExecutorService threadPool =Executors.newCachedThreadPool()”的来源和用途是什么? @Regent 如果我只添加 phonegap 页面上的代码::@Override public ExecutorService getThreadPool() return threadPool;它给了我错误,我在某处读到我也需要添加这个以便它可以工作..否则,如果我点击错误,“返回线程池”将转换为 getthreadpool() 之类的东西 能否请您发布您的 logcat 错误。 @SiddharthVyas 当然!我编辑了我的问题 @AlexStanese : 你有没有添加任何 jar 文件? 【参考方案1】:

如果你想在 phonegap 应用中加载一个 url,那么你可以使用下面的代码从资产中加载你的第一个 url

public class MyPhoneGapActivity extends DroidGap 
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    super.loadUrl("file:///android_asset/www/index.html", 10000);

要在原生 android 应用程序中嵌入 cordova webview 并加载 url,请使用以下代码

public class CordovaActivity extends Activity implements CordovaInterface 

            private CordovaWebView cordova_webview;
            private String TAG = "CORDOVA_ACTIVITY";
            private final ExecutorService threadPool = Executors.newCachedThreadPool();


            @Override 
            protected void onCreate(Bundle savedInstanceState) 
                super.onCreate(savedInstanceState);
                setContentView(R.layout.cordova_layout);
                cordova_webview = (CordovaWebView) findViewById(R.id.cordova_web_view);
                // Config.init(this); 
                String url = "file:///android_asset/www/index.html";
                cordova_webview.loadUrl(url, 10000);
             


            @Override 
            protected void onPause()  
                super.onPause(); 
                Log.d(TAG, "onPause");
             


            @Override 
            protected void onResume()  
                super.onResume(); 
                Log.d(TAG, "onResume");
             


            @Override 
            protected void onDestroy()  
                super.onDestroy(); 
                if (this.cordova_webview != null) 
                    this.cordova_webview
                            .loadUrl("javascript:trycordova.require('cordova/channel').onDestroy.fire();catch(e)console.log('exception firing destroy event from native');;"); 
                    this.cordova_webview.loadUrl("about:blank");
                    cordova_webview.handleDestroy();
                 
             



            @Override 
            public Activity getActivity() 
                return this;
             


            @Override 
            public ExecutorService getThreadPool() 
                return threadPool;
             


            @Override 
            public Object onMessage(String message, Object obj) 
                Log.d(TAG, message);
                if (message.equalsIgnoreCase("exit")) 
                    super.finish(); 
                 
                return null; 
             


            @Override 
            public void setActivityResultCallback(CordovaPlugin cordovaPlugin) 
                Log.d(TAG, "setActivityResultCallback is unimplemented");
             


            @Override 
            public void startActivityForResult(CordovaPlugin cordovaPlugin,
                    Intent intent, int resultCode) 
                Log.d(TAG, "startActivityForResult is unimplemented");
             

【讨论】:

以上代码使android应用程序崩溃。由于调用了 webview 的 stopLoading() 方法,并且“viewClient”始终为空。我该如何解决这个问题?我尝试过使用代码而不是 xml 布局。

以上是关于如何在 android webview 中实现 phonegap/cordova?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin Forms App 中实现 SSO?

如何在android中实现下拉刷新?

在android中实现javascript编程

如何在我的 Vue 项目中实现 Electron 的 webview?

如何在 Webview 中实现自己的 SelectAll、Cut、Copy、Paste

如何在 Android 中为 WebView 制作滚动监听器