Gebruik jQuery Mobile om een ​​native Android-nieuwslezer-app te bouwen deel 3

In deel 1 van deze tutorialserie hebben we onze voorbeeldtoepassing geïntroduceerd, de paginastroom beschreven en besproken hoe de pagina's in de toepassing via jQuery Mobile kunnen worden geconstrueerd. In deel 2 hebben we de implementatie van onze webtoepassing voltooid. In dit laatste deel migreren we de webtoepassing naar een native Android-applicatie.


Converteren naar een native Android-applicatie

De webtoepassing die in Deel 2 is voltooid, wordt nu geconverteerd naar een native Android-applicatie. De onderstaande discussie is van toepassing op Android OS 2.2 en 2.3.

De Android-applicatie zal gebruiken index.html als UI-component. We zullen een schrijven android.app.Activity klasse om het integratiepunt tussen te definiëren index.html en de native applicatie. We zullen ook een schrijven android.webkit.WebViewClient klasse om ervoor te zorgen dat de pagina Nieuwsdetail binnen het origineel wordt weergegeven android.webkit.WebView bijvoorbeeld wanneer de toepassing Nieuws wordt gestart.

Veranderingen in index.html

We zullen het updaten NEWS_URI variabele als volgt:

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

We hebben niet nodig bridge.php in de native Android-applicatie om AJAX-oproepen door te sturen naar Yahoo! Nieuws. Dit komt omdat dezelfde oorsprongsbeperking hier niet van toepassing is. Wanneer verpakt als onderdeel van de native applicatie, de index.html bestand wordt niet gedownload van een webserver. Als zodanig kan het AJAX-oproepen maken naar externe URL's.

Daarnaast voegen we de volgende functie toe:

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

De verander de locatie() functie wordt gebeld vanuit de android.webkit.WebViewClient, die even zal worden getoond. Het doel van de functie is om de voortgangspagina te tonen tijdens de overgang van de pagina Nieuws naar de pagina Nieuwsdetail.

  • De eerste stap in verander de locatie() is om de voortgangspagina weer te geven.
  • Vergeet niet dat de jQuery krijgen() functie is een gespecialiseerd jQuery Ajax() functie. Wij bellen krijgen() het doorgeven van een lege URL en een callback-handler, die de window.location variabele naar het invoerargument. Het invoerargument is de URL in de kenmerk ingesloten in een een tag voor een nieuwsitem, zoals besproken in Deel 2, "Naar de nieuwsdetailpagina gaan vanaf de nieuwspagina". Wanneer de URL wordt geladen, wordt de voortgangspagina vervangen door de inhoud van die URL.
  • Zoals we hieronder aangeven, is de functie verander de locatie() is geen essentieel onderdeel van het migreren van de webtoepassing naar een native native app. Het is alleen nodig om een ​​voortgangspagina weer te geven bij het overschakelen van de pagina Nieuws naar de pagina Nieuwsdetail in de oorspronkelijke toepassing.
  • Een voortgangspagina is niet nodig in de webtoepassing bij het overschakelen van de pagina Nieuws naar de pagina Nieuwsdetail. Dit komt omdat tijdens de overgang de webbrowser zelf een voortgangsindicator voor de gebruiker weergeeft. In Android bijvoorbeeld geven zowel de native als de Dolphin-browsers een ronddraaiend wiel en een voortgangsbalk in de navigatiebalk weer. In iOS geeft de Safari-browser een vergelijkbare voortgangsindicator weer.

De activiteitenklasse

Het eerste deel van onze Activiteit klas, genoemd NewsActivity wordt hieronder getoond:

 pakket com.news; import android.app.Activity; importeer android.webkit.WebView; import android.os.Bundle ;? public class NewsActivity breidt activiteit uit WebView mWebView; public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); mWebView = (WebView) findViewById (R.id.webview); mWebView.setWebViewClient (nieuwe NewsClient ()); mWebView.getSettings () setJavaScriptEnabled (true).; mWebView.getSettings () setDomStorageEnabled (true).; mWebView.loadUrl ( "android_asset / www / index.html"); ? 
  • In de onCreate () methode, noemen we eerst de standaardimplementatie uit de superklasse en roepen vervolgens aan setContentView () om het lay-outbestand voor deze activiteit te laden. Het invoerargument voor setContentView () is R.layout.main wat een verwijzing is naar main.xml in de res / layout map.
  • We krijgen een handvat voor de WebView via findViewById (R.id.webview). We hebben een gebruik ingesteld WebViewClient op de WebView, genaamd NewsClient (binnenkort te bekijken). Vervolgens configureren we de WebView om JavaScript-uitvoering en de DOM-opslag-API toe te staan ​​(dit laatste is nodig om HTML5 te gebruiken lokale opslag).
  • Ten slotte vragen we het WebView om de te laden index.html pagina met de UI-code.

Als u op de pagina Nieuwsdetail op de knop Terug drukt, gaat de gebruiker terug naar de pagina Categorieën. Om hiervan verzekerd te zijn, moeten we eerst de onKeyDown evenement in onze NewsActivity. Dit wordt hieronder getoond:

 public class NewsActivity breidt activiteit uit WebView mWebView; public void onCreate (Bundle savedInstanceState) ?  public boolean onKeyDown (int keyCode, KeyEvent event) if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack ()) mWebView.goBack (); geef waar terug;  retourneer super.onKeyDown (keyCode, event); ? 

Als de toetsgebeurtenis overeenkomt met de terugknop van het apparaat en de WebView heeft de geschiedenis om terug te gaan naar, dan vragen we het WebView om een ​​stap terug te gaan in zijn geschiedenis. Op de pagina Nieuwsdetail komt dit overeen met index.html. Wanneer de geschiedenis een stap teruggaat, wordt de pagina Categorieën weergegeven volgens de stappen die worden beschreven in Deel 2, "Toepassing opstarten".

Laten we ten slotte de gewoonte bekijken WebViewClient die is geïmplementeerd als een innerlijke klasse van NewsActivity.

 public class NewsActivity breidt activiteit uit WebView mWebView; public void onCreate (Bundle savedInstanceState) ? mWebView.setWebViewClient (nieuwe NewsClient ()) ;?  public boolean onKeyDown (int keyCode, KeyEvent event) ?  private class NewsClient breidt WebViewClient uit public boolean shouldOverrideUrlLoading (WebView-weergave, String-URL) view.loadUrl ("javascript: changeLocation ('" + url + "')"); geef waar terug; ? 

De enige bewerking die we uit de bovenliggende klasse overschrijven is shouldOverrideUrlLoading () waar we de WebView om de JavaScript-functie te bellen verander de locatie() in index.html.

  • Hadden we geen gewoonte gedefinieerd? WebViewClient, de pagina Nieuwsdetail wordt weergegeven in een aparte browsertoepassing, buiten de toepassing Nieuws. Daarom een ​​gebruik definiëren WebViewClient is essentieel om de pagina Nieuwsdetail weer te geven als onderdeel van de toepassing Nieuws (dus in dezelfde WebView die de host is index.html).
  • We hadden kunnen schrijven shouldOverrideUrlLoading () op een meer vereenvoudigde manier, als volgt:
     public boolean shouldOverrideUrlLoading (WebView-weergave, String-URL) view.loadUrl (url); geef waar terug; 

    Dat zou voldoende zijn om de Nieuws Detail-pagina er in hetzelfde weer te geven WebView die gastheren index.html. De overgang van de pagina Nieuws naar de pagina Nieuwsoverzicht bevat echter geen weergave van de voortgangspagina.

Na de Activiteit klasse, laten we eens kijken naar andere componenten van onze applicatie.

AndroidManifest.xml

            

Voor een algemene discussie over de AndroidManifest.xml bestand verwijzen naar de officiële referentie. In dat bestand zijn er twee specifieke items die het waard zijn om commentaar te leveren.

  • Zoals beschreven in de android.app.Activity documentatie, standaard een configuratiewijziging, inclusief een verandering in oriëntatie of toetsenbordtoegankelijkheid, resulteert in de vernietiging van de huidige activiteit. Om het standaardgedrag te voorkomen, configureren we onze applicatie door de configuratiewijzigingen op te geven die door de toepassing zelf worden afgehandeld. Dit wordt gedefinieerd in de configChanges attribuut waar oriëntering komt overeen met oriëntatiewijziging en keyboardHidden correspondeert met een toetsenbordtoegankelijkheidswijziging (bijvoorbeeld opent een gebruiker het toetsenbord van het apparaat). We zijn bezig met het configureren van de applicatie zodat, als een van die wijzigingen optreedt, de huidige activiteit niet wordt vernietigd.
  • Het element geeft de applicatie toegang tot internet.

strings.xml

   Nieuws 

Dit bestand definieert de constante met de naam applicatie naam die wordt gebruikt om de toepassing Nieuws te identificeren. De waarde van dat kenmerk wordt op verschillende plaatsen op ons Android-apparaat weergegeven, zoals hieronder wordt weergegeven. Van links naar rechts: onder het startpictogram van de toepassing, de titelbalk van de toepassing, Instellingen - Toepassingen beheren.

Figuur 11. Hoe de naam van de toepassing wordt weergegeven in Android.

Integratie van de HTML-gebaseerde gebruikersinterface met android.app.Activity

We implementeren de gebruikersinterface in onze native Android-applicatie met index.html en het ondersteunende JavaScript en css bibliotheken. Een integratiepunt tussen index.html en de gewoonte android.app.Activity klasse is de volgende regel:

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

Bekijk bovendien in "De activiteitsklasse" dat we JavaScript en DOMStorage inschakelen in de android.webkit.WebView object als index.html moet JavaScript uitvoeren en HTML5 openen lokale opslag.

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

Eindelijk, in de AndroidManifest.xml we staan ​​internetverbindingen toe vanuit onze applicatie via:

 

Schermafbeeldingen van de Android-applicatie

De eerder getoonde figuren 1 - 4 in deel 1 van deze reeks zijn de schermafbeeldingen van de oorspronkelijke Android-applicatie.


Toepassing Lancering Icon

Om het startpictogram voor de toepassing Nieuws te maken, volgden we de richtlijnen voor pictogramontwerp voor Android-apps. In die bron zijn verschillende sjablonen in Adobe PSD-formaat beschikbaar om te downloaden. We hebben gedownload icon_templates-v2.0.zip en geëxtraheerd Launcher-icon-template.psd. In dat bestand hebben we twee sjablonen geselecteerd om ons startpictogram te maken:

We plaatsten die sjablonen in twee afzonderlijke lagen in Adobe Photoshop en voegden een grafische tekst toe, Nieuws, op een extra laag bovenaan om het startpictogram samen te stellen. Per de richtlijn hebben we drie versies van het pictogram gemaakt voor schermen met een lage, gemiddelde en hoge dichtheid met respectievelijk 36 x 36, 48 x 48 en 72 x 72 pixelformaten. Elk van deze pictogrammen heeft een naam icon.png en ze worden geplaatst in de Android-projectmappen volgens de volgende tabel:

Naam van de map Bestandsnaam Pixelgrootte
res \ betekenbare-LDPI icon.png 36 x 36
res \ betekenbare-mdpi icon.png 48 x 48
res \ betekenbare-hdpi icon.png 72 x 72

Dit is bijvoorbeeld het startpictogram van 36 x 36:


Native Android Application Development Environment

Als onderdeel van deze zelfstudie hebben we de benodigde projectbestanden geleverd om de oorspronkelijke Android News-toepassing te importeren in de Eclipse-ontwikkelomgeving. De projectvereisten zijn:

  • Android SDK-revisie 8.
  • Eclipse IDE-versie 3.5.
  • Android Development Tools (ADT), een Eclipse-plug-in, versie 8.0.1.

Het project is met succes getest op zowel Android-platform 2.2 API niveau 8 als platform 2.3 API-niveau 9.

Het project importeren

Voordat u het project in uw Eclipse-omgeving importeert, moet u ervoor zorgen dat de Eclipse ADT-plugin naar de juiste locatie van Android SDK in uw lokale systeem wijst. Om dit te controleren, gaat u in het Eclipse-menu naar Venster -> Voorkeuren -> Android. De SDK-locatie venster moet worden ingesteld op de locatie van de Android SDK. Als je het goed hebt ingesteld, zou je iets moeten zien dat lijkt op de afbeelding hieronder:

Figuur 12. Eclipse-voorkeuren.

De projectbestanden worden geleverd in een archiefbestand met de naam news.zip. Om het project in het Eclipse-menu te importeren, gaat u naar Bestand -> Importeren en selecteer vervolgens in de wizard voor het importeren van bestanden Algemeen -> Bestaande projecten in werkruimte (zie hieronder).

Figuur 13. Project importeren.

Kies op de volgende pagina van de wizard de Selecteer een archiefbestand keuzerondje en blader naar waar news.zip bevindt zich in uw bestandssysteem. De projecten venster wordt automatisch ingevuld waar de Nieuws project is al geselecteerd. Dit wordt hieronder getoond. druk de Af hebben om het importeren te voltooien.

Figuur 14. Project Bestandsselectie.

Eclipse bouwt de applicatie automatisch na het importeren. Nu zou u het nieuwsproject in de projectverkenner moeten zien, zoals hieronder getoond:

Figuur 15. Projectverkenner.

Voor het bouwen / debuggen van uw project kunt u kiezen tussen Android OS 2.3- en 2.2-platforms als het builddoel. Hiertoe selecteert u de Nieuws project in de projectverkenner en kies met de rechtermuisknopmenu eigenschappen. Klik op de lijst met eigenschappen aan de linkerkant Android als het eigendom. De beschikbare builddoelen worden rechts weergegeven, zoals hieronder weergegeven:

Figuur 16. Android Build-doel.

Bestandsvermelding

Hieronder vindt u een lijst van bestanden in het project.

Figuur 17. Project Inhoud.

We hebben al een aantal van die bestanden besproken. Hieronder volgt een korte beoordeling / samenvatting:

  • De src map bevat de broncode voor de NewsActivity klasse.
  • De gen map bevat de bestanden die automatisch worden gegenereerd door Eclipse ADT.
  • De activa \ www map en de submappen bevatten alle bestanden die nodig zijn voor de gebruikersinterface, inclusief index.html; activa \ www \ css-js heeft de css en JavaScript-bestanden gebruikt door index.html. Met name:
    • jquery-1.4.4.min.js, jquery.mobile-1.0a2.min.js, jquery.mobile-1.0a2.min.css zijn de jQuery Mobile-framework-bibliotheken.
    • jquery.ba-dotimeout.js is de jQuery-dotimeout-plugin-bibliotheek.
    • jquery.dst.js is de DST.js plug-inbibliotheek.
    • activa \ www \ css-js \ images \ icons-18-white.png is een afbeeldingsbestand waarnaar wordt verwezen door de jQuery Mobile-framework-bibliotheken.
  • activa \ www \ img \ wait.gif is het draaiende pictogram dat wordt gebruikt op de voortgangspagina.
  • De res \ betekenbare * mappen slaan de lanceringspictogrammen op, zoals besproken in het gedeelte "Pictogram introductie starten" van deze zelfstudie.
  • De res \ layout \ main.xml bestand is het XML-lay-outbestand van Android. Omdat de UI in onze applicatie is gedefinieerd in index.html met behulp van jQuery Mobile framework, dit bestand is heel eenvoudig en behoeft geen verdere uitleg.
  • We hebben het al beoordeeld res \ waarden \ strings.xml en AndroidManifest.xml.
  • Het bestand default.properties definieert het builddoel en maakt er deel van uit news.zip. Het wordt overschreven door Eclipse ADT, afhankelijk van uw selectie van het builddoel.

conclusies

Naast de ontwikkeling van platformonafhankelijke mobiele webapps, kan het jQuery Mobile-framework worden gebruikt om native Android-applicaties te implementeren. In deze tutorialserie hebben we een webtoepassing ontwikkeld met behulp van jQuery Mobile en vervolgens gemigreerd naar een native Android-applicatie met slechts kleine wijzigingen. Het belangrijkste idee is om de android.webkit.WebView object als een container om het html-bestand van de webtoepassing uit te voeren en de jQuery Mobile JavaScript-code die het bevat. Enkele slotopmerkingen worden hieronder gegeven.

  • Indien verpakt als onderdeel van een native Android-applicatie, loopt een html-pagina in android.webkit.WebView is niet onderworpen aan beperkingen van dezelfde oorsprong bij het voeren van AJAX-oproepen.
  • De jQuery-dotimeout-plugin en de DST.js-plug-in, hoewel oorspronkelijk ontwikkeld voor het jQuery-framework, presteren goed voor jQuery Mobile. Er zijn een enorme hoeveelheid plug-ins geschreven voor jQuery en hoewel van geval tot geval moet worden geanalyseerd, zijn deze mogelijk direct beschikbaar voor jQuery Mobile. Dit is een enorme troef voor dit nieuwe kader!
  • We hebben de webtoepassing getest met een Android OS 2.2-telefoon en een iPod Touch iOS 4.1 & 4.2. De native Android-applicatie is getest met Android OS 2.2 en 2.3 emulators en een Android OS 2.2-telefoon. In alle gevallen kwamen de kenmerken van het uiterlijk en het gevoel en de functionaliteit sterk overeen.
  • In het Android-platform zijn er technieken bekend om JavaScript-naar-Java en Java-naar-JavaScript-methodeaanroepen tot stand te brengen. In feite hebben we laten zien hoe we een jQuery Mobile JavaScript-functie terugbellen vanuit Java-code in onze applicatie. Het is mogelijk dat met een redelijke inspanning jQuery Mobile-plug-ins kunnen worden ontwikkeld voor toegang tot native Android API's. Dit geeft verdere mogelijkheden aan voor het jQuery Mobile-framework om native Android-applicaties te ontwikkelen.