Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android...

40
Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz ( ) @c_janz [email protected]

Transcript of Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android...

Page 1: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Überleben imFunkloch

Offlinefähige Apps für Android entwickelnChristian Janz ( )@c_janz

[email protected]

Page 2: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Twitter: | E-Mail: Slides:

Christian JanzConsultant im Bereich Softwareentwicklung Java/JEE bei

in MannheimBridging IT

Interesse: Architektur und Entwicklung vonGeschäftsanwendungen mit Hilfe moderner Java Frameworks

@c_janz [email protected]://de.slideshare.net/cjanz

Page 3: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

AgendaMotivationLösungsideeArchitekturansatzAPIs im Einsatz: Sync SampleFazit

Page 4: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Motivation

Page 5: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de
Page 6: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de
Page 7: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de
Page 8: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

1. Juli 2013

Page 9: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Lösungsidee

Page 10: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Synchronisiere Daten undspeichere sie lokal auf dem

Gerät

Page 11: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

VorteileApp kann auch ohne aktive Datenverbindung genutzt werdenDatenvolumen wird reduziertAkkulaufzeit wird erhöhtDaten werden automatisch aktualisiert, wenn eineDatenverbindung bestehtRetry bei abgebrochener Verbindung"Nebenbei": Verbesserte Architektur

Page 12: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Architektur

Page 13: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

"Developing Android REST Client Applications"

Architekturansatz für AndroidVortrag von Virgil Dobjanschi auf der Google IO 2010

Page 14: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Quelle: Developing Android REST Client Applications

Page 15: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

SyncAdapter: FeaturesBeachten von NetzwerkverfügbarkeitSynchronisation auch wenn App nicht läuftPeriodische SynchronisationWarteschlageBündeln von Syncs: Gut für AkkulaufzeitIntegration in globale Sync-EinstellungenIntegration in Account-Verwaltung

Page 16: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

APIs im Einsatz:Sync Sample

Page 17: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

VorgehenAuthenticator & AccountContentProviderREST clientSyncAdapterUI

Page 19: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Authenticator & AccountAuthenticatorServiceAuthenticatorLoginActivityauthenticator.xmlAndroidManifest.xml

Page 20: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

authenticator.xml<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="de.bit.android.sample.account" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@string/app_name"/>

Page 21: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

AndroidManifest.xml<service android:name="de.bit.android.syncsample.authenticator.AuthenticatorService" > <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter>

<meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /></service>

<activity android:name="de.bit.android.syncsample.authenticator.LoginActivity" android:excludeFromRecents="true" android:exported="true" android:theme="@android:style/Theme.Holo" ></activity>

Page 22: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Authenticator &Account

Page 23: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

ContentProviderTodoContentProviderDatabaseHelperTodoEntityAndroidManifest.xml

Page 24: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

TodoEntity

public class TodoEntity { private Long id; private Long serverId; private Long serverVersion; private Long conflictedServerVersion; private SyncState syncState = SyncState.NOOP;

private String title; private String text;

... (getters and setters) }

Page 25: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

REST clientpublic class TodoRestClient {

public static List<TodoEntity> loadAllTodos() throws IOException, JSONException;

public static TodoEntity saveTodo(TodoEntity todoEntity) throws IOException, JSONException;

public static void deleteTodo(TodoEntity todoEntity) throws IOException;}

Page 26: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

SyncAdapterSyncServiceSyncAdaptersyncadapter.xmlAndroidManifest.xml

Page 27: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

syncadapter.xml<?xml version="1.0" encoding="utf-8"?><sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="de.bit.android.sample.account" android:contentAuthority="de.bit.android.syncsample.content" android:supportsUploading="true" />

Page 28: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

AndroidManifest.xml<service android:name="de.bit.android.syncsample.sync.SyncService" > <intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter>

<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/syncadapter" /></service>

Page 29: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Speichern der Datenvom Backend

@Overridepublic void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { ...}

Page 30: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Periodische Synchronisationprivate void configureSync(Account account) { ContentResolver.setIsSyncable(account, CONTENT_AUTHORITY, 1); ContentResolver.setSyncAutomatically(account, CONTENT_AUTHORITY, true);

Bundle params = new Bundle(); params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false); params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false); params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false); ContentResolver.addPeriodicSync(account, CONTENT_AUTHORITY, params, 60);

ContentResolver.requestSync(account, CONTENT_AUTHORITY, params);}

Page 31: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

UIMainActivityactivity_main.xmltodo_row.xmlEditTodoActivityactivity_edit_todo.xmlAndroidManifest.xml

Page 32: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Sync-Status anzeigen@Overrideprotected void onResume() { super.onResume();

syncObserverHandle = ContentResolver.addStatusChangeListener( SYNC_OBSERVER_TYPE_ACTIVE | SYNC_OBSERVER_TYPE_PENDING, this);}

@Overridepublic void onStatusChanged(int which) { runOnUiThread(new Runnable() {

@Override public void run() { boolean isSyncActive = ContentResolver.isSyncActive(account, TodoContentProvider.AUTHORITY); setProgressBarIndeterminateVisibility(isSyncActive); } });}

Page 33: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Synchronisationanstoßen

Bundle params = new Bundle();params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);

ContentResolver.requestSync(account, TodoContentProvider.AUTHORITY,params);

Page 34: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Automatisches Updateder UI

CursorLoader und ContentResolver.notifyChange(...)

Page 35: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Demo: Create, Update, Delete

Page 36: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Fazit

Page 37: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Offlinefähige Apps haben VorteileOfflinefähigkeit muss nicht aufwändig seinAndroid bietet gute Unterstützung dafürDokumentation nicht optimalFehlerhandling muss beachtet werden

Page 38: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

LinksTransferring Data Using Sync Adapters | Android DevelopersSlides: Android SyncAdapter | Alex TumanoffTutorial: Write your own Android SyncAdapter | UdinicSyncAdapter Sample App | Christian Janz

Page 39: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

Fragen?

Page 40: Überleben im Funkloch - Entwicklertag · Überleben im Funkloch Offlinefähige Apps für Android entwickeln Christian Janz (@c_janz)christian.janz@bridging-it.de

meet the SPEAKER@speakerlounge

1. OG DIREKT ÜBER DEM EMPFANG