2016-01-06 5 views
8

Ich arbeite daran, das native Webview in unserer Android App durch die Implementierung von Crosswalk zu ersetzen.Wie erstellt man ein XWalkView innerhalb eines Dienstes?

Wir konnten die meisten Funktionen der App nutzen, aber das Erstellen eines XWalkView innerhalb eines Dienstes ist immer noch ein Problem, das wir versuchen zu überwinden. Das Erstellen eines Webview ist kein Problem, aber ein XWalkView erfordert einen Aktivitätskontext, der verwendet werden soll. Wenn jemand hier auf dieses Problem gestoßen ist und von einer möglichen Lösung oder Umgehung weiß, würde ich es sehr begrüßen. Danke, und wenn Sie weitere Informationen benötigen, fragen Sie bitte nach.

+0

arbeiten Sie an Android Studio oder Eclipse? und wo genau ist das Problem, da die Verwendung von XWalkView sehr einfach und WebView ähnlich ist, haben Sie Probleme mit der Konfiguration? Einbettmaterial? spezifische HTML5-Snippets? –

+0

Ich habe XWalkView in einer Aktivität richtig funktioniert. Wenn ich es jedoch in einem Service verwende, habe ich Probleme, da keine Aktivität an den Konstruktor übergeben wird. – JGray

Antwort

3

Von butelo in GitHub:

Also, was Überweg ist und warum kümmert es mich? Werfen Sie einen Blick auf die Website: https://crosswalk-project.org/

Zebrastreifen ist ein HTML5-Laufzeit, können Sie es verwenden, um HTML5-Anwendungen zu erstellen mit ‚nativen Funktionen‘ Sie können Zebrastreifen verwenden HTML5-only-Anwendungen für Android (x86 und ARM-Architekturen) zu erstellen und Tizen, aber Sie können CrossWalk auch als Ansicht innerhalb eines android Projekts verwenden.

Das heißt, Sie Android WebView mit XWalkView ersetzen kann und einige zusätzliche Funktionen wie bekommen:

-WebGl

-WebRTC

-WebAudio

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

Wie kann ich betten Sie ein CrossWalk WebView, von nun an ein XWalkView, in eine Android Applikation ein, um all diese Goodies auf meinem hy brid Anwendung (Android india mit html5 Funktionen)

Zuerst haben Sie die Laufzeit zum Download:

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

Laden Sie eine der Android (ARM) Versionen.

In der Datei finden Sie alles, was Sie benötigen, um in einer HTML5-Anwendung zu arbeiten.

Für diesen Test müssen wir die xwalk-Core-Bibliothek-Projekt innerhalb Eclipse

Erstellen Sie ein neues Android-Projekt mit einer grundlegenden Activity Link mit der Bibliothek und setzen diesen Code in der Aktivität importieren:

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; 
    } 
} 

dieses auf Ihrem Haupt Layout

<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> 

schließlich in Ihrem /assets/www Ordner setzen sie Ihre hTML-Sachen und das ist es

+1

Danke für die gründliche Aufschreibung. Ich verstehe jedoch vollständig, was Sie gerade erklärt haben. Unser Problem besteht nicht darin, unter normalen Umständen ein XWalkView zu erstellen, sondern ein Problem in einem Service zu schaffen, in dem eine Aktivität erstellt wurde oder nicht. – JGray

1

Ich suchte nach dem XWalkView.java Code, damit ich etwas nützliches machen kann, aber es ist noch nicht veröffentlicht. Aber es gibt zumindest eine gute Lösung, die funktionieren kann: Erstelle zum ersten Mal die XWalkView-Instanz innerhalb einer Aktivität.dann finden Sie eine Möglichkeit, es in einem Dienst zu speichern und die gleiche Instanz immer wieder zu verwenden, wenn Ihre Aktivität eine Verbindung zu dem Dienst (auf diese Weise wird Ihre HTML und js nicht neu geladen;))

Nach dem googeln, verstand ich, dass die XWalkView-Instanz benötigt und Aktivität, so dass es einige Life-Cycle-Listener registriert. so, wenn die Aktivität zum Beispiel zerstört die XwalkView.onDestroy Methode aufgerufen wird (so hatte ich es in meinem Fall zu deaktivieren, die gleiche Instanz zu halten und wiederverwenden)

Hier ist mein einfaches Beispiel: 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) { 

    } 

} 

Die Serviceklasse

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; 
    } 

} 

ich hoffe, es wird für Sie arbeiten.