Utilizza jQuery Mobile per creare un'app per Android News Reader nativa parte 3

Nella parte 1 di questa serie di tutorial, abbiamo introdotto la nostra applicazione di esempio, descritto il flusso della pagina e discusso come costruire le pagine nell'applicazione tramite jQuery Mobile. Nella parte 2, abbiamo completato l'implementazione della nostra applicazione web. In questa parte finale, migreremo l'applicazione Web in un'applicazione Android nativa.


Conversione in un'applicazione Android nativa

L'applicazione Web completata nella parte 2 verrà ora convertita in un'applicazione Android nativa. La discussione seguente si applica a Android OS 2.2 e 2.3.

L'applicazione Android utilizzerà index.html come componente della sua interfaccia utente. Scriveremo un android.app.Activity classe per definire il punto di integrazione tra index.html e l'applicazione nativa. Scriveremo anche un android.webkit.WebViewClient classe per assicurarsi che la pagina Dettagli notizie sia visualizzata all'interno dell'originale android.webkit.WebView istanza in cui viene lanciata l'applicazione News.

Cambia in index.html

Aggiorneremo il NEWS_URI variabile come segue:

 var NEWS_URI = 'http://rss.news.yahoo.com/rss/';

Non abbiamo bisogno bridge.php nell'applicazione Android nativa per inoltrare le chiamate AJAX a Yahoo! Notizia. Questo perché la restrizione della stessa origine non si applica qui. Quando confezionato come parte dell'applicazione nativa, il index.html il file non viene scaricato da un server web. In quanto tale, può effettuare chiamate AJAX a URL remoti.

Inoltre, aggiungiamo la seguente funzione:

 var EMPTY = ";? function changeLocation (varURI) showProgress (); $ .get (EMPTY, function (data) window.location = varURI;);

Il Cambia posizione() la funzione sarà chiamata dal android.webkit.WebViewClient, che verrà mostrato momentaneamente. Lo scopo della funzione è mostrare la pagina di avanzamento durante la transizione dalla pagina Notizie alla pagina Dettagli notizie.

  • Il primo passo in Cambia posizione() è quello di visualizzare la pagina di avanzamento.
  • Ricorda che il jQuery ottenere() la funzione è una jQuery specializzata ajax () funzione. Noi chiamiamo ottenere() passando ad esso un URL vuoto e un gestore di callback, che imposta il window.location variabile per l'argomento di input. L'argomento di input è l'URL nel attributo racchiuso in un un tag per una notizia, come discusso nella Parte 2, "Vai alla pagina dei dettagli della notizia dalla pagina delle notizie". Quando viene caricato l'URL, la pagina di avanzamento viene sostituita con i contenuti di tale URL.
  • Come precisiamo di seguito, la funzione Cambia posizione() non è una parte essenziale della migrazione dell'applicazione web in una nativa. È necessario solo visualizzare una pagina di avanzamento quando si passa dalla pagina Notizie alla pagina Dettagli notizie nell'applicazione nativa.
  • Una pagina di avanzamento non è necessaria nell'applicazione Web quando si passa dalla pagina Notizie alla pagina Dettagli notizie. Questo perché durante la transizione il browser stesso visualizza un indicatore di progresso per l'utente. Ad esempio, in Android, sia i browser nativi che Dolphin visualizzano una rotellina e una barra di avanzamento nella barra degli strumenti di navigazione. In iOS, il browser Safari mostra un indicatore di progresso simile.

La classe di attività

La parte iniziale del nostro Attività classe, chiamato NewsActivity è mostrato di seguito:

 pacchetto com.news; importare android.app.Activity; import android.webkit.WebView; importare android.os.Bundle ;? public class NewsActivity estende Activity WebView mWebView; public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); mWebView = (WebView) findViewById (R.id.webview); mWebView.setWebViewClient (new NewsClient ()); mWebView.getSettings () setJavaScriptEnabled (true).; mWebView.getSettings () setDomStorageEnabled (true).; mWebView.loadUrl ( "android_asset / www / index.html"); ? 
  • Nel onCreate () metodo, prima chiamiamo l'implementazione predefinita dalla super-classe e poi invochiamo setContentView () per caricare il file di layout per questa attività. L'argomento di input a setContentView () è R.layout.main che è un riferimento a main.xml nel res / layout di cartella.
  • Otteniamo una maniglia per il WebView attraverso findViewById (R.id.webview). Impostiamo un'abitudine WebViewClient sul WebView, di nome client di news (da rivedere presto). Quindi, configuriamo il WebView per consentire l'esecuzione di JavaScript e l'API di archiviazione DOM (quest'ultimo è necessario per utilizzare HTML5 memoria locale).
  • Infine, chiediamo il WebView caricare il index.html pagina che ha il codice dell'interfaccia utente.

Nella pagina Dettagli notizie, premendo il pulsante Indietro del dispositivo si ritorna alla pagina Categorie. Per esserne certi, prima dobbiamo gestire il onKeyDown evento nel nostro NewsActivity. Questo è mostrato di seguito:

 public class NewsActivity estende Activity WebView mWebView; public void onCreate (Bundle savedInstanceState) ?  public boolean onKeyDown (int keyCode, KeyEvent event) if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack ()) mWebView.goBack (); ritorna vero;  return super.onKeyDown (keyCode, event); ? 

Se l'evento chiave corrisponde al pulsante Indietro del dispositivo e il WebView ha una storia in cui tornare, poi chiediamo il WebView per tornare indietro di un passo nella sua storia. Nella pagina Dettagli notizie, questo corrisponderà a index.html. Quando la cronologia fa un passo indietro, la pagina Categorie verrà visualizzata seguendo i passaggi descritti nella Parte 2, "Avvio applicazioni".

Infine, esaminiamo l'usanza WebViewClient che è implementato come una classe interna di NewsActivity.

 public class NewsActivity estende Activity WebView mWebView; public void onCreate (Bundle savedInstanceState) ? mWebView.setWebViewClient (new NewsClient ()) ;?  public booleano onKeyDown (int keyCode, KeyEvent event) ?  classe privata NewsClient estende WebViewClient public boolean shouldOverrideUrlLoading (visualizzazione WebView, URL String) view.loadUrl ("javascript: changeLocation ('" + url + "')"); ritorna vero; ? 

L'unica operazione che sovrascriviamo dalla classe genitore è shouldOverrideUrlLoading () dove istruiamo il WebView chiamare la funzione JavaScript Cambia posizione() nel index.html.

  • Non avevamo definito un'abitudine WebViewClient, la pagina Dettagli notizie verrà visualizzata in un'applicazione browser separata, all'esterno dell'applicazione News. Pertanto, definire un'abitudine WebViewClient è essenziale per visualizzare la pagina dei dettagli delle notizie come parte dell'applicazione News (cioè nella stessa WebView che ospita il index.html).
  • Avremmo potuto scrivere shouldOverrideUrlLoading () in un modo più semplificato, come segue:
     public booleano shouldOverrideUrlLoading (vista WebView, URL String) view.loadUrl (url); ritorna vero; 

    Ciò sarebbe sufficiente per visualizzare la pagina Dettagli notizie nella stessa WebView che ospita index.html. Tuttavia, la transizione dalla pagina Notizie alla pagina Dettagli notizie non includeva la visualizzazione della pagina di avanzamento.

Dopo aver esaminato il Attività classe, diamo un'occhiata ad altri componenti della nostra applicazione.

AndroidManifest.xml

            

Per una discussione generale sul AndroidManifest.xml il file si riferisce al riferimento ufficiale. In quel file, ci sono due elementi particolari degni di essere commentati.

  • Come descritto nel android.app.Activity documentazione, per impostazione predefinita, una modifica alla configurazione, incluso un cambiamento di orientamento o accessibilità della tastiera, determina la distruzione dell'attività corrente. Per impedire il comportamento predefinito, configuriamo la nostra applicazione specificando le modifiche alla configurazione che verranno gestite dall'applicazione stessa. Questo è definito nel configChanges attributo dove orientamento corrisponde al cambiamento di orientamento e keyboardHidden corrisponde a una modifica dell'accessibilità della tastiera (ad esempio, un utente apre la tastiera del dispositivo). Stiamo configurando l'applicazione in modo che se si verifica uno di questi cambiamenti, l'attività corrente non viene distrutta.
  • L'elemento consente all'applicazione di accedere a Internet.

strings.xml

   notizia 

Questo file definisce la costante denominata nome dell'applicazione che viene utilizzato per identificare l'applicazione News. Il valore di tale attributo viene visualizzato in varie posizioni nel nostro dispositivo Android, come mostrato di seguito. Da sinistra a destra: sotto l'icona di avvio dell'applicazione, la barra del titolo dell'applicazione, Impostazioni - Gestisci applicazioni.

Figura 11. Come viene visualizzato il nome dell'applicazione in Android.

Integrazione dell'interfaccia utente basata su HTML con android.app.Activity

Implementiamo l'interfaccia utente nella nostra applicazione Android nativa utilizzando index.html e il supporto JavaScript e css librerie. Un punto di integrazione tra index.html e l'abitudine android.app.Activity la classe è la seguente riga:

 mWebView.loadUrl ( "android_asset / www / index.html");

Inoltre, osserva in "La classe di attività" che abilitiamo JavaScript e DOMStorage in android.webkit.WebView oggetto come index.html ha bisogno di eseguire JavaScript e accedere a HTML5 memoria locale.

 mWebView.getSettings () setJavaScriptEnabled (true).; mWebView.getSettings () setDomStorageEnabled (true).;

Finalmente, nel AndroidManifest.xml consentiamo connessioni Internet dalla nostra applicazione tramite:

 

Immagini sullo schermo dell'applicazione Android

Le Figure 1 - 4 illustrate in precedenza di questa serie sono le immagini dello schermo dell'applicazione nativa Android.


Icona di avvio dell'applicazione

Per creare l'icona di avvio dell'applicazione News, abbiamo seguito le linee guida per la progettazione di icone per le applicazioni Android. In questa risorsa sono disponibili per il download vari modelli in formato Adobe PSD. Abbiamo scaricato icon_templates-v2.0.zip ed estratto Launcher-icon-template.psd. In quel file, abbiamo selezionato due modelli per creare la nostra icona di avvio:

Abbiamo inserito questi modelli in due livelli separati in Adobe Photoshop e aggiunto un testo grafico, notizia, su un livello aggiuntivo nella parte superiore per comporre l'icona di avvio. Come da linee guida, abbiamo creato tre versioni dell'icona per schermi a bassa, media e alta densità con dimensioni di 36 x 36, 48 x 48 e 72 x 72 pixel, rispettivamente. Ciascuna di queste icone è denominata icon.png e sono posizionati nelle cartelle del progetto Android in base alla seguente tabella:

Nome della cartella Nome del file Dimensione del pixel
res \ drawable-ldpi icon.png 36 x 36
res \ drawable-MDPI icon.png 48 x 48
res \ drawable-hdpi icon.png 72 x 72

Ad esempio, questa è l'icona di avvio 36 x 36:


Ambiente di sviluppo dell'applicazione Android nativo

Come parte di questo tutorial, abbiamo fornito i file di progetto necessari per importare l'applicazione nativa di Android News nell'ambiente di sviluppo Eclipse. I prerequisiti del progetto sono:

  • Revisione dell'SDK per Android 8.
  • Eclipse IDE versione 3.5.
  • Android Development Tools (ADT), che è un plugin Eclipse, versione 8.0.1.

Il progetto è stato testato con successo sia con la piattaforma Android 2.2 API livello 8 che con la piattaforma 2.3 API livello 9.

Importare il progetto

Prima di importare il progetto nel tuo ambiente Eclipse, assicurati che il plug-in di Eclipse ADT indichi la posizione corretta di Android SDK nel tuo sistema locale. Per controllare questo, nel menu Eclipse vai a Finestra -> Preferenze -> Android. Il Posizione SDK la finestra deve essere impostata sulla posizione di Android SDK. Una volta impostato correttamente, dovresti vedere qualcosa di simile all'immagine qui sotto:

Figura 12. Preferenze di Eclipse.

I file di progetto sono forniti in un file di archivio chiamato news.zip. Per importare il progetto nel menu di Eclipse, vai a File -> Importa e quindi nel wizard di importazione dei file selezionare Generale -> Progetti esistenti nello spazio di lavoro (vedi sotto).

Figura 13. Importazione del progetto.

Nella pagina successiva della procedura guidata, scegliere il Seleziona il file di archivio pulsante radio e cercare dove news.zip si trova nel tuo file system. Il progetti finestra verrà popolata automaticamente dove il notizia progetto è già selezionato. Questo è mostrato sotto. premi il finire pulsante per completare l'importazione.

Figura 14. Selezione del file di progetto.

Eclipse costruirà l'applicazione automaticamente dopo l'importazione. Ora, dovresti vedere il progetto News nell'Explorer di progetto, come mostrato di seguito:

Figura 15. Project Explorer.

Per la costruzione / debug del tuo progetto, puoi scegliere tra le piattaforme Android OS 2.3 e 2.2 come target di costruzione. Per fare ciò, selezionare il notizia progetto nel progetto di esplorazione e dal menu di scelta rapida scegliere Proprietà. Nell'elenco a sinistra delle proprietà, selezionare androide come la proprietà. I target di build disponibili sono visualizzati a destra, come mostrato di seguito:

Figura 16. Android Build Target.

Elenco dei file

Di seguito è riportato un elenco di file nel progetto.

Figura 17. Contenuto del progetto.

Abbiamo già discusso alcuni di questi file. Di seguito una breve recensione / riassunto:

  • Il src cartella contiene il codice sorgente per NewsActivity classe.
  • Il gen cartella contiene i file generati automaticamente da Eclipse ADT.
  • Il beni \ www la cartella e le relative sottocartelle contengono tutti i file necessari per l'interfaccia utente, inclusi index.html; beni \ www \ css-js ha il css e file JavaScript usati da index.html. In particolare:
    • jquery-1.4.4.min.js, jquery.mobile-1.0a2.min.js, jquery.mobile-1.0a2.min.css sono le librerie framework jQuery Mobile.
    • jquery.ba-dotimeout.js è la libreria jquery-dotimeout-plugin.
    • jquery.dst.js è la libreria di plugin DST.js.
    • beni \ www \ css-js \ immagini \ icone-18-white.png è un file immagine a cui fanno riferimento le librerie framework jQuery Mobile.
  • beni \ www \ img \ wait.gif è l'icona rotante utilizzata nella pagina di avanzamento.
  • Il res \ drawable * le cartelle memorizzano le icone di lancio, come discusso nella sezione "Icona di avvio dell'applicazione" di questo tutorial.
  • Il res \ layout \ main.xml file è il file di layout XML di Android. Poiché l'interfaccia utente nella nostra applicazione è definita in index.html utilizzando il framework jQuery Mobile, questo file è molto semplice e non richiede ulteriori spiegazioni.
  • Abbiamo già recensito res \ valori \ strings.xml e AndroidManifest.xml.
  • Il file default.properties definisce il target di costruzione e fa parte di news.zip. Sarà sovrascritto da Eclipse ADT in base alla selezione del target di costruzione.

conclusioni

Oltre allo sviluppo di applicazioni Web mobili multipiattaforma, il framework jQuery Mobile può essere utilizzato per implementare applicazioni Android native. In questa serie di tutorial, abbiamo sviluppato un'applicazione web utilizzando jQuery Mobile e poi la abbiamo migrata in un'applicazione Android nativa con solo lievi modifiche. L'idea principale è usare il android.webkit.WebView oggetto come contenitore per eseguire il file html dell'applicazione Web e il codice JavaScript jQuery Mobile che contiene. Di seguito alcune osservazioni conclusive.

  • Quando confezionato come parte di un'applicazione Android nativa, viene eseguita una pagina html android.webkit.WebView non è soggetto alle restrizioni della stessa origine quando si effettuano chiamate AJAX.
  • Il plug-in jquery-dotimeout e il plug-in DST.js, sebbene originariamente sviluppato per il framework jQuery, offrono prestazioni ottimali per jQuery Mobile. Ci sono una grande quantità di plugin scritti per jQuery e, sebbene sia necessaria un'analisi caso per caso, quelli potrebbero essere prontamente disponibili per jQuery Mobile. Questo è un vantaggio immenso per questo nuovo framework!
  • Abbiamo testato l'applicazione Web con un telefono Android OS 2.2 e un iPod Touch iOS 4.1 e 4.2. L'applicazione Android nativa è stata testata con emulatori Android OS 2.2 e 2.3 e un telefono Android OS 2.2. In tutti i casi, l'aspetto e le caratteristiche funzionali erano molto simili.
  • Nella piattaforma Android, esistono tecniche note per stabilire chiamate di metodo da JavaScript a Java e da Java a JavaScript. In effetti, abbiamo dimostrato come richiamare una funzione JavaScript jQuery Mobile dal codice Java nella nostra applicazione. È possibile che con un ragionevole sforzo, si possano sviluppare plugin jQuery Mobile per accedere alle API Android native. Ciò indica ulteriori opportunità per il framework jQuery Mobile di sviluppare applicazioni Android native.