2012-12-20 7 views
8

Prima di iniziare Sto lavorando a un'applicazione che deve eseguire JavaScript quando l'app non è in primo piano; il problema sembra essere che quando l'app viene messa in secondo piano/la webview viene rimossa dallo schermo viene chiamato il metodo onPause della webview che per documenti fa quanto segue: "Mette in pausa qualsiasi elaborazione aggiuntiva associata a questo WebView e al suo DOM associato, plugin, JavaScript ecc. "Ripristina la visualizzazione Web Android quando viene messa in pausa dal sistema operativo/eseguire JavaScript sull'app in background?

Da quello che ho trovato fino ad ora la mia migliore scommessa sembra essere l'uso della riflessione per chiamare il metodo "onResume" della webview che dovrebbe annullare tutte queste sospensioni di processo. Con la mia attuale implementazione ottengo un'istanza di detto metodo, ma quando invocato nulla sembra accadere mentre la mia successiva chiamata JavaScript non fa nulla (badate bene che funzioni quando ho l'applicazione aperta e in primo piano).

Qualcun altro vede un problema nel mio codice o ha una soluzione per eseguire JavaScript quando la tua app è in background senza avviare completamente l'app?

messaggio push entra nel dire JavaScript deve essere eseguito in modo intento è inviata per notificare il servizio in esecuzione in background:

Intent intent = new Intent("some action"); 
intent.putExtra("xtifyJson", xtifyJSON.toString()); 
context.sendBroadcast(intent); 

Nel OnReceive del mio ricevitore Broadcast, che vive nel servizio in background sempre in esecuzione:

final String stringArrayExtra = intent.getStringExtra("xtifyJson"); 
if (!Text.isNull(stringArrayExtra)) { 

    new Handler(context.getMainLooper()).post(new Runnable() { 

      @Override 
      public void run() { 
      try { 
       Log.d("Hey Dev Guy", "Message received"); 
       JavaScriptInterface javaScriptInterface = ((SpecialApplication) getApplicationContext()).getJavaScriptInterface(); 
       relectHiddenMethod(javaScriptInterface.getParentWebView(), "onResume"); 
       javaScriptInterface.getParentWebView().resumeTimers(); 
       javaScriptInterface.callBackPushReceived(new JSONObject(stringArrayExtra)); 

      } 
      catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 
     } 
    }); 

} 

reflectHiddenMethod metodo riflessione:

private void reflectHiddenMethod(final WebView webview, final String name) { 

    if (webview != null) { 
     try { 
      Method method = WebView.class.getMethod(name); 
      Object invoke = method.invoke(webview); 
     } 
     catch (final Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Un po 'realted [domanda] (http://stackoverflow.com/questions/7884568/android-webview-inside-a-service). Idea principale: sposta la parte di comunicazione da JavaScript in un servizio. – Stan

risposta

1

Purtroppo questo non funzionerà. Una WebView è un componente dell'interfaccia utente e pertanto deve essere collegato alla finestra. Ci sono altri riferimenti qui su StackOverflow su questo come qui: Android webview inside a service?.

Una possibilità potrebbe essere quella di esaminare librerie JavaScript alternative per eseguire il codice senza la necessità di una visualizzazione Web, ad es. Rhino, V8 o spidermonkey.

Ma probabilmente la soluzione migliore sarebbe quella di implementare la tua messaggistica push in Java.

+0

Sì, una volta che si avvia lasciando le app eseguite javascript in background, si è pronti per rendere il dispositivo troppo lento per essere di qualche utilità per il proprietario. –

+0

Potete fornire riferimenti? Webview può essere scollegato e collegato alla finestra senza problemi –

Problemi correlati