Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Grundlegendes zu Forcedroid-Anwendungen

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Beschreiben des Gesamt-Flows einer nativen Salesforce Mobile SDK-Anwendung für Android
  • Benennen der zwei Hauptklassen einer forcedroid-Anwendung
  • Auflisten von Aufgaben, die das SalesforceSDKManager-Objekt für Sie erledigt

Übersicht über den Anwendungs-Flow

Sie haben eine neue native forcedroid-Anwendung erstellt und ausgeführt. Sie fragen sich, was der Motor des Ganzen ist?

Hier sehen Sie ein Diagramm, das auf höherer Ebene darstellt, wie der Ablauf beim Hochfahren funktioniert.

Android-Anwendungs-Flow

In Ihrer Anwendung ist das "Anwendungsobjekt" eine Instanz Ihrer MainApplication-Klasse, und "Main Activity" steht für ihre MainActivity-Klasse. Die MainApplication-Klasse erzeugt die Basiskomponenten Ihrer Anwendung und übergibt dann die Steuerung an das Singleton-Objekt MobileSyncSDKManager. MobileSyncSDKManager, eine Unterklasse von SalesforceSDKManager, startet wiederum den Salesforce-Anmelde-Flow und übergibt – sofern die Benutzerauthentifizierung erfolgreich war – die Steuerung an die MainActivity-Klasse. MainActivity instanziiert und zeigt alles an, was in Ihrer Listenansicht zu sehen ist.

Zugangscodes, Anmeldung, Abmeldung und Bereinigung sind Aufgaben, die vom Singleton MobileSyncSDKManager verwaltet werden. Interne Klassenobjekte sorgen für die OAuth-Protokolle. Wie Sie sehen, ist der Zugangscode-Abschnitt des Flows optional. Das ist nur dann der Fall, wenn Ihre verbundene Anwendung Zugangscodes aktiviert; ein Salesforce-Administrator kann diese Richtlinie jederzeit rückgängig machen. Jedenfalls brauchen Sie sich um die Zugangscodes überhaupt nicht zu kümmern. Das Mobile SDK bietet eine umfassende Implementierung im Hintergrund.

Was ist der Inhalt einer Forcedroid-Anwendung?

Eine native forcedroid-Anwendung implementiert nur grundlegende Funktionen. Der Benutzer kann zwischen der Ansicht einer Liste der Kontakte und einer Liste der Accounts wechseln, das ist alles. Aber die Anwendung dient Ihnen zugleich als Sprungbrett, von dem aus Sie mit Ihren phantastischen Ideen direkt in die tieferen Gefilde eintauchen können. Sie können Ihre Anwendung durch folgende Maßnahmen erweitern:
  • Anwenden von CRUD-Vorgängen (Create, Read, Update, Delete, d. h. Erstellen, Lesen, Aktualisieren, Löschen) auf Salesforce-Datensätze
  • Hinzufügen benutzerdefinierter Aktivitäten
  • Aufrufen anderer Komponenten
  • Alle sonstigen Maßnahmen, die Ihr Projektumfang, Ihre eigene Vorstellungskraft und der Stand der Technik ermöglichen

Wenn forcedroid eine native Anwendung erzeugt, legt es eine Kopie eines Mobile SDK-Vorlagenprojekts an und passt diese Ihrer Befehlszeileneingabe an. Nun schauen wir uns doch mal einige der Standardelemente an, die mit dieser "Keksstanze" erzeugt werden.

Jede forcedroid-Anwendung definiert zwei öffentliche Android-Klassen:
  • Eine Anwendungsklasse, die android.app.Application erweitert. Diese Klasse dient als Einstiegspunkt für die Anwendung. In Ihrer Anwendung heißt diese Klasse MainApplication.
  • Eine Hauptaktivitätsklasse, die android.app.Activity erweitert. Diese Klasse definiert einen Bildschirm; sie enthält den Großteil der benutzerdefinierten Logik der Anwendung. In forcedroid-Anwendungen heißt diese Klasse MainActivity. Sie erweitert SalesforceActivity, das wiederum android.app.Activity erweitert.

Wie bei jeder Android-Anwendung designiert die AndroidManifest.xml-Datei die Konfiguration der Anwendung, indem sie die Anwendungsklasse und alle Aktivitätsklassen angibt.

Die Anwendungsklasse

Ihre Anwendungsklasse erledigt zwei Hauptaufgaben:

  • Sie überschreibt die Android Application.onCreate()-Methode.
  • In ihrer onCreate()-Überschreibung geschieht Folgendes:
    • Die onCreate()-Methode der Superklasse wird aufgerufen.
    • Das Salesforce Mobile SDK wird durch Aufrufen von initNative() für das SDK-Manager-Objekt (MobileSyncSDKManager) initialisiert.
    • Es wird optionaler, kommentierter Code bereitgestellt, den Sie neu instanziieren können, um Ihre Anwendung als Salesforce-Identitätsanbieter zu nutzen.
    • Es wird optionaler, kommentierter Code bereitgestellt, den Sie neu instanziieren können, um Push-Benachrichtigungen zu unterstützen.
Sehen wir uns kurz den Code an.
  1. Wählen Sie auf dem Willkommensbildschirm in Android Studio die Option Import project (Eclipse ADT, Gradle, etc.) (Projekt importieren). Falls Android Studio bereits geöffnet ist, klicken Sie auf File | Open... (Datei > Öffnen)
  2. Wechseln Sie zum Zielverzeichnis, das Sie in der forcedroid-Befehlszeile angegeben haben, und wählen Sie dieses aus. (Tipp: Sofern Sie sich an die Regeln gehalten haben, lautet das Zielverzeichnis "TrailAndroidApps".)
  3. Klicken Sie auf Choose (Auswählen).
  4. Wenn das Bearbeitungsfenster in Android Studio angezeigt wird, öffnen Sie die Projektansicht: View | Tool Windows | Project (Ansicht > Werkzeugfenster > Projekt).
  5. Erweitern Sie im Fenster "Project" app | src | com.mytrail.android und doppelklicken Sie dann auf MainApplication.

Die Klasse MainApplication ist ziemlich einfach. Sie definiert eine Überschreibung einer Single-Base-Klassenmethode, onCreate(). Was macht die Überschreibung? Sie ruft die OnCreate()-Methode der übergeordneten Klasse auf und initialisiert dann das Singleton-Objekt MobileSyncSDKManager.

/**
 * Application class for our application.
 */
public class MainApplication extends Application {

	@Override
	public void onCreate() {
		super.onCreate();
		MobileSyncSDKManager.initNative(getApplicationContext(), MainActivity.class);

              /*
               * Uncomment the following line to enable IDP login flow. This will allow the user to
               * either authenticate using the current app or use a designated IDP app for login.
               * Replace 'idpAppURIScheme' with the URI scheme of the IDP app meant to be used.
               */
		// MobileSyncSDKManager.getInstance().setIDPAppURIScheme(idpAppURIScheme);

		/*
		 * Un-comment the line below to enable push notifications in this app.
		 * Replace 'pnInterface' with your implementation of 'PushNotificationInterface'.
		 * Add your Google package ID in 'bootonfig.xml', as the value
		 * for the key 'androidPushNotificationClientId'.
		 */
		// SalesforceSDKManager.getInstance().setPushNotificationReceiver(pnInterface);
	}
}
Sobald das MobileSyncSDKManager-Objekt initialisiert wurde, legt es los und wir sehen die MainApplication-Klasse nicht wieder. Beachten Sie, dass MobileSyncSDKManager zwei Dinge benötigt, um sich selbst zu initialisieren:
  • Einen Anwendungskontext, damit es weiß, wo es die Konfiguration Ihrer Anwendung findet.
  • Einen Verweis auf die Hauptaktivitätsklasse (MainActivity.class), der am Ende des Anmelde-Flows von MobileSyncSDKManager verwendet wird, um die benutzerdefinierte Logik Ihrer Anwendung in Gang zu setzen.
Aus dieser kleinen Menge an freiem Code bezieht Ihre Anwendung Ihren Zugangscode, An- und Abmeldedaten, OAuth und Benutzerdatenverschlüsselung. Gar nicht so schlecht, gelle?

Die Main Activity-Klasse

Glücklicherweis ist forcedroid intelligent genug, Ihre MainActivity-Klasse dazu zu bringen, SalesforceActivity zu erweitern. Dieses kleine Glück bedeutet, dass Sie viele abgefahrene Dinge gratis bekommen. So verarbeitet z. B. SalesforceActivity automatisch Ereignisse zum Anhalten und Fortsetzen, einschließlich aller erforderlichen Neueingaben des Zugangscodes. Wenn Sie stattdessen die eine oder andere nicht auf Salesforce-Aktivitäten basierende Klasse verwendet hätten (keine unzulässige Strategie, aber auch nicht empfehlenswert), würden Sie diesen Code selber schreiben. Sie können so viele Aktivitätsklassen definieren wie Ihre Anwendung erfordert. Es ist jedoch ratsam, für jede Aktivität eine Mobile SDK-Basisklasse wie SalesforceActivity oder SalesforceListActivity zu erweitern.

Die MainActivity-Klasse ist meistens damit beschäftigt, eine REST-Abfrage an Salesforce zu senden und dann die Antwort zu verarbeiten. Sie nutzt die Datensätze, die sie von Salesforce erhält, um eine Listenansicht aufzufüllen. Außerdem bietet sie zwei Schaltflächen, über die der Benutzer wahlweise Accounts oder Kontakte abfragen kann, sowie eine Schaltfläche zum Löschen der Datensatzanzeige und eine weitere zum Abmelden.

Wir kommen später noch auf die Einzelheiten der REST-Interaktion zu sprechen. Im Moment wollen wir uns darauf konzentrieren, wie und wo diese UI-Schaltflächen konfiguriert werden.
  1. Erweitern Sie im Android Studio Project-Fenster MyTrailNative | res | layout und doppelklicken Sie dann auf main.xml.
  2. Wählen Sie die Registerkarte Text am unteren Rand des Editorfensters.
Auf der Registerkarte "Text" wird ein geteiltes Fenster mit einem Grafiktool auf der rechten Seite und der XML-Konfigurationsdatei für die Ansicht auf der linken Seite angezeigt. Durch Klicken auf einen beliebigen Bereich im Grafiktool wird die XML-Konfiguration des Bereichs hervorgehoben. Wenn Sie beispielsweise auf die Schaltfläche FETCH CONTACTS klicken, hebt der Editor einen <LinearLayout>/<Button>-Knoten hervor. Die Attribute zum Knoten geben die Eigenschaften der Schaltfläche an – Darstellung, Kennzeichnung und Verhalten. Weitere Informationen zu UI-Konfigurationsdetails finden Sie in der Android-Entwicklerdokumentation.
Wenn Sie innerhalb der Ansichtskopfzeile klicken, beispielsweise auf die Schaltfläche Logout, hebt der Editor einen <include>-Knoten hervor:
<include layout="@layout/header" />
Dieser Knoten weist darauf hin, dass die Kopfzeile in einer anderen XML-Datei definiert ist. Nach dem layout-Attribut zu urteilen, ist header.xml ohne weiteres im gleichen Pfad zu finden wie main.xml. Ganz einfach.

Das App-Manifest

Die Datei AndroidManifest.xml Ihres Projekts gibt uns einen Einblick in die primäre Grundkonfiguration der Anwendung: Name, Symbol, Hauptaktivität, minimale und empfohlene Android API-Version usw. Überzeugen Sie sich selbst.
  1. Erweitern Sie in Android Studio im Fenster "Project" app.
  2. Doppelklicken Sie auf AndroidManifest.xml.
Im Stammknoten <manifest>, direkt im Anschluss an die Namespace-Deklaration, ist der Paketname Ihrer Anwendung deklariert:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mytrail.android"
    android:versionCode="1"
    android:versionName="1.0"
    android:installLocation="internalOnly">
Das Stammelement <manifest> enthält einen Knoten namens <application>, der die Grundkonfiguration Ihrer Anwendung vorgibt. Auf oberster Ebene legt dieser Knoten das Attribut fest, das sozusagen der Chefetage der Android-Anwendung den Namen der forcedroid-Anwendungsstartklasse verrät.
<application android:icon="@drawable/sf__icon"
    android:label="MyTrailNative"
    android:name=".MainApplication"
    ...
Das Präfix “.” fordert Android auf, den Paketnamen der Anwendung, also com.mytrail.android, diesem Klassenpfad vorn anzufügen.

Außerdem erhält hier jede Aktivität, die Sie oder forcedroid definieren, eine Beschreibung. Beispielsweise stellt allein der Knoten application/activity in diesem Fall die erste Aktivität dar, die nach der Anmeldung erscheint. Wie Sie sehen, verweist die Eigenschaft android:name der Aktivität auf den Klassennamen Ihrer Hauptaktivität. Hier ist das XML-Fragment application/activity aus einer Datei AndroidManifest.xml in forcedroid.

<!-- Launcher screen -->
<activity android:name=".MainActivity"
    android:label="@string/app_name"
	android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>

Alles andere, was Sie in der Standard-Manifestdatei sehen, gehört zur Android-Standardkonfiguration. Wie bei jeder Android-Anwendung können Sie dem Knoten <application> die eigenen Komponenten Ihrer Anwendung, wie beispielsweise benutzerdefinierte Aktivitäten, Services und Empfänger, hinzufügen.

Sie haben nun gelernt, wie es im Inneren einer forcedroid-Anwendung aussieht. Kommen wir also zu der Info, auf die Sie gewartet haben: nämlich, wie Sie auf die Salesforce-Daten zugreifen.