如何在服务中创建XWalkView?

时间:2016-01-06 22:40:44

标签: java android service android-webview crosswalk

我正在努力用Crosswalk的实现替换Android应用中的原生webview。

我们已经能够使应用程序的大多数功能正常工作,但在服务中创建XWalkView仍然是我们试图通过的问题。创建Webview不是问题,但XWalkView需要使用活动上下文。如果这里的任何人遇到过这个问题,并且知道可能的解决方案或解决方法,我将非常感激。谢谢,如果您需要任何其他信息,请随时提出。

2 个答案:

答案 0 :(得分:3)

来自butelo中的GitHub

  

那么,什么是人行横道,为什么我在乎呢?请查看网站:https://crosswalk-project.org/

     

CrossWalk是一个HTML5运行时,您可以使用它来创建具有“本机功能”的HTML5应用程序您可以使用CrossWalk创建   适用于Android的HTML5应用程序(x86和arm架构)和   Tizen但你也可以在一个android中使用CrossWalk作为一个View   项目

     

这意味着您可以使用XWalkView替换Android WebView并获得一些额外的功能,例如:

     

-WebGl

     

-WebRTC

     

-WebAudio

     

http://software.intel.com/en-us/html5/articles/crosswalk-application-runtime

     

如何在Android应用程序中嵌入CrossWalk WebView,从现在开始在XWalkView上嵌入我的混合物中的所有这些好东西   应用程序(具有html5功能的Android Native)

     

首先你必须下载运行时:

     

https://crosswalk-project.org/#documentation/downloads

     

下载任何Android(ARM)版本。

     

文件内部是您在html5应用程序中开始工作所需的一切。

     

对于此测试,我们需要在Eclipse

中导入xwalk-core-library项目      

使用基本活动创建一个新的Android项目,将其与库链接,并将此代码放在Activity:

package com.example.xwalkwithlibrary;
import org.xwalk.core.XWalkView;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.LinearLayout;

public class XWalkEmbedLib extends Activity {
    private LinearLayout commentsLayout;
    private XWalkView xWalkWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xwalk_embed_lib);
         commentsLayout=(LinearLayout)findViewById(R.id.principal);
         xWalkWebView = new XWalkView(this, this);
         xWalkWebView.load("file:///android_asset/www/index.html", null);
         commentsLayout.addView(xWalkWebView);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.xwalk_embed_lib, menu);
        return true;
    }
}
     

将它放在主要布局上

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".XWalkMain" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <LinearLayout
                android:id="@+id/principal"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="35dp"
        android:layout_marginTop="86dp"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>
     

最后在你的/assets/www文件夹中放入你的html内容,就是这样

答案 1 :(得分:1)

我查找了XWalkView.java代码,因此我可以创建一些有用但尚未发布的代码。但至少有一个好的解决方案可以工作: 在活动中第一次创建XWalkView实例。然后找到一种方法将它存储在服务中,并在您的活动连接到服务时重用相同的实例(这样,您的html和js不会重新加载;)

在谷歌搜索之后,我理解XWalkView实例需要和活动,因此它注册了一些生命周期监听器。所以当活动被销毁时,例如调用XwalkView.onDestroy方法(所以我必须在我的情况下禁用它以保持相同的实例并重复使用它)

这是我的简单示例: MainActivity.Java

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.MutableContextWrapper;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import java.util.logging.Logger;
import org.xwalk.core.XWalkView;


public class MainActivity extends Activity implements ServiceConnection {

    private Logger logger = Logger.getLogger("com.tr");
    private XWalkView view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, MyService.class));
        bindService(new Intent(this, MyService.class), this, BIND_AUTO_CREATE);
    }

    @Override
    public void setContentView(View view) {
        final ViewParent parent = view.getParent();
        if (parent != null) {
            ViewGroup group = (ViewGroup) parent;
            group.removeView(view);
        }
        super.setContentView(view);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    private boolean bound;

    @Override
    protected void onStop() {
        super.onStop();
        if (bound) {
            unbindService(this);
            bound = false;
        }
    }


    public void onServiceConnected(ComponentName name, IBinder s) {
        bound = true;
        MyService.MyBinder binder = (MyService.MyBinder) s;
        if (binder.getView() != null) {
            view = binder.getView();

            ((MutableContextWrapper) view.getContext()).setBaseContext(this);
            view.onShow();
        } else {
            view = new XWalkView(new MutableContextWrapper(this), this) {
                @Override
                public void onDestroy() {
                    // super.onDestroy();
                    //disable this method to keep an insatce in memory
                }
            };
            view.load("http://10.110.23.198:8080/mdl/templates/android-dot-com/", null);
            binder.setView(view);
        }
        setContentView(view);
    }

    public void onServiceDisconnected(ComponentName name) {

    }

}

服务类

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import org.xwalk.core.XWalkView;

/**
 *
 * @author Ramdane
 */
public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder(this);
    }

    public class MyBinder extends Binder {

        private MyService service;
        private XWalkView view;

        public MyBinder(MyService service) {
            this.service = service;
        }

        public MyBinder() {
        }

        public void setService(MyService service) {
            this.service = service;
        }

        public MyService getService() {
            return service;
        }

        public XWalkView getView() {
            return view;
        }

        public void setView(XWalkView view) {
            this.view = view;
        }

    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return Service.START_STICKY;
    }

}

我希望它对你有用。