我正在努力用 Crosswalk 的实现替换我们 Android 应用程序中的原生 webview。
我们已经能够让应用程序的大部分功能正常工作,但在服务中创建 XWalkView 仍然是我们试图解决的问题。创建 Webview 不是问题,但 XWalkView 需要使用活动上下文。如果这里有人遇到此问题并知道可能的解决方案或解决方法,我将不胜感激。谢谢,如果您需要任何其他信息,请询问。
我正在努力用 Crosswalk 的实现替换我们 Android 应用程序中的原生 webview。
我们已经能够让应用程序的大部分功能正常工作,但在服务中创建 XWalkView 仍然是我们试图解决的问题。创建 Webview 不是问题,但 XWalkView 需要使用活动上下文。如果这里有人遇到此问题并知道可能的解决方案或解决方法,我将不胜感激。谢谢,如果您需要任何其他信息,请询问。
那么,什么是人行横道,我为什么要关心?看看网站:https ://crosswalk-project.org/
CrossWalk 是一个 HTML5 运行时,您可以使用它来创建具有“本机功能”的 HTML5 应用程序您可以使用 CrossWalk 为 Android(x86 和 arm 架构)和 Tizen 创建仅限 HTML5 的应用程序,但您也可以将 CrossWalk 用作安卓项目。
这意味着您可以用 XWalkView 替换 Android WebView 并获得一些额外的功能,例如:
-WebGl
-WebRTC
-网络音频
http://software.intel.com/en-us/html5/articles/crosswalk-application-runtime
如何从现在开始在 XWalkView 上嵌入 CrossWalk WebView,在 Android 应用程序中拥有所有这些好东西(具有 html5 功能的 Android Native)
首先,您必须下载运行时:
https://crosswalk-project.org/#documentation/downloads
下载任何 Android(ARM) 版本。
该文件包含您开始在 html5 应用程序中工作所需的一切。
对于这个测试,我们需要在 Eclipse 中导入 xwalk-core-library 项目
创建一个带有基本 Activity 的新 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 东西,就是这样
我查找了 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;
}
}
我希望它对你有用。