2016-01-06 13 views
8

Pracuję nad zastąpieniem natywnej przeglądarki internetowej w naszej aplikacji na Androida implementacją Crosswalk.Jak utworzyć XWalkView w ramach usługi?

Udało nam się uzyskać większość funkcjonalności aplikacji, ale tworzenie XWalkView w ramach usługi nadal stanowi problem, który próbujemy przedrzeć. Tworzenie widoku sieci nie stanowi problemu, ale XWalkView wymaga użycia kontekstu działania. Jeśli ktoś tutaj natknął się na ten problem i wie o możliwym rozwiązaniu lub obejściu problemu, byłbym bardzo wdzięczny. Dzięki, a jeśli potrzebujesz innych informacji, poproś o pomoc.

+0

Czy pracujesz na Androidzie lub w Zaćmieniu? i gdzie dokładnie jest problem, ponieważ korzystanie z XWalkView jest bardzo proste i podobne do WebView, czy masz problemy z konfiguracją? osadzanie rzeczy? konkretne fragmenty html5? –

+0

Mam XWalkView działa poprawnie w działaniu. Jednak korzystanie z niego w ramach usługi jest tam, gdzie mam problemy, ponieważ nie ma żadnego działania do przekazania do konstruktora. – JGray

Odpowiedz

3

Od butelo w GitHub:

Więc, co jest przejście dla pieszych i dlaczego mnie to obchodzi? Spójrz na stronie internetowej: https://crosswalk-project.org/

Przejściu jest Runtime HTML5, można go używać do tworzenia aplikacji HTML5 z „natywnych funkcji” można użyć przejściu do tworzenia HTML5 tylko aplikacje dla Androida (x86 i ramion architektur) i Tizen, ale możesz również użyć CrossWalk jako widoku w ramach projektu Android .

Oznacza to, że można zastąpić Android WebView z XWalkView i uzyskać kilka dodatkowych funkcji, takich jak:

-WebGl

-WebRTC

-WebAudio

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

Jak to zrobić osadzić CrossWalk WebView, od teraz na XWalkView, wewnątrz aplikacji Android, aby mieć wszystkie te bonusy na mojej hy brid aplikacji (Android Native z funkcji HTML5)

najpierw trzeba pobrać runtime:

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

pobrać dowolny z (ARM) wersji Androida.

Wewnątrz pliku znajduje się wszystko, czego potrzeba, aby rozpocząć pracę w aplikacji html5.

Do tego testu musimy importować projekt xwalk-core-biblioteki wewnątrz naszego Eclipse

Utwórz nowy projekt z Androidem prosty link aktywny go z biblioteki i umieścić ten kod w aktywny:

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

umieścić to na głównej układ

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

wreszcie wewnątrz folderu /assets/www umieścić HTML rzeczy i to

+1

Dzięki za dokładne napisanie. Jednak całkowicie rozumiem to, co właśnie wyjaśniłeś. Naszym problemem nie jest tworzenie XWalkView w normalnych okolicznościach, ale stworzenie jednego w ramach usługi, w której działanie zostało lub może nie zostać utworzone, jest naszym problemem. – JGray

1

Szukałem kodu XWalkView.java, więc mogę zrobić coś użytecznego, ale nie jest jeszcze opublikowane. Ale istnieje co najmniej dobre rozwiązanie, które może zadziałać: Twórz po raz pierwszy instancję XWalkView wewnątrz działania.następnie znajdź sposób na zapisanie go w usłudze i ponowne użycie tej samej instancji za każdym razem, gdy twoja działalność łączy się z usługą (w ten sposób twój html i js nie zostaną ponownie załadowane;))

Po przejściu przez google, zrozumiałem, że potrzebna jest instancja XWalkView i aktywność, więc rejestruje niektórych słuchaczy cyklu życia. więc gdy aktywność ulega zniszczeniu na przykład metoda XwalkView.onDestroy nazywa (więc musiałem go wyłączyć w moim przypadku, aby zachować tę samą instancję i używać go)

Oto mój prosty przykład: 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) { 

    } 

} 

Klasa serwis

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

} 

mam nadzieję, że będzie pracować dla Ciebie.

Powiązane problemy