forcedroid アプリケーションについて
学習の目的
この単元を完了すると、次のことができるようになります。
- Salesforce Mobile SDK for Android ネイティブアプリケーションの全体的なフローを説明する
- forcedroid アプリケーションの 2 つの主なクラスを特定する
- SalesforceSDKManager オブジェクトで処理されるタスクを挙げる
アプリケーションフローの概要
新しい forcedroid ネイティブアプリケーションを作成し、実行しました。そのしくみはどうなっているのでしょうか。
次の図は、アプリケーションの起動フローの全体的なしくみを表したものです。

アプリケーション内で「Application オブジェクト」は MainApplication クラスのインスタンスで、「メインアクティビティ」は MainActivity クラスを表します。MainApplication クラスはアプリケーションの基本コンポーネントを作成してから、制御を MobileSyncSDKManager シングルトンオブジェクトに渡します。次に、MobileSyncSDKManager (SalesforceSDKManager のサブクラス) が Salesforce ログインフローを起動し、ユーザー認証が成功した場合は、制御を MainActivity クラスに渡します。MainActivity はリストビュー画面に表示されるすべてのものをインスタンス化して表示します。
パスコード、ログイン、ログアウト、クリーンアップは MobileSyncSDKManager シングルトンで管理されるタスクです。OAuth プロトコルは内部クラスオブジェクトで処理されます。ご覧のとおり、フローのパスコード部分は省略可能です。接続アプリケーションでパスコードが有効になっている場合のみ実行されます。Salesforce システム管理者はそのポリシーをいつでも戻すことができます。ただし、いずれの場合でもパスコードについて心配する必要はありません。Mobile SDK は、バックグラウンドで完全な実装を提供しています。
forcedroid アプリケーションに含まれているもの
forcedroid ネイティブアプリケーションは、基本機能だけを実装します。ユーザーは取引先のリストと取引先責任者のリストの表示を切り替えられるだけです。ただし、このアプリケーションは、独自の素晴らしいアイデアを繰り広げるための出発点となります。次の方法によってアプリケーションを拡張できます。
- Salesforce レコードに対する CRUD (作成、参照、更新、削除) 操作の実行
- カスタムアクティビティの追加
- その他のコンポーネントのコール
- プロジェクトの範囲、自分自身の想像力、そして現在のテクノロジーが許す限りのあらゆること
forcedroid でネイティブアプリケーションが作成されるときには、Mobile SDK テンプレートプロジェクトのコピーが作成され、コマンドライン入力に合わせてこのコピーがカスタマイズされます。このクッキー型で生成される標準項目をいくつか見てみましょう。
すべての forcedroid アプリケーションは、次の 2 つの公開 Android クラスを定義します。
- android.app.Application を拡張するアプリケーションクラス。このクラスはアプリケーションのエントリポイントとして機能します。今回のアプリケーションでは、クラスの名前は MainApplication です。
- android.app.Activity を拡張するメインアクティビティクラス。このクラスは画面を定義し、アプリケーションのカスタムロジックのほとんどを含みます。forcedroid アプリケーションでは、このクラスの名前は MainActivity です。このクラスは SalesforceActivity を拡張し、さらにそれが android.app.Activity を拡張します。
あらゆる Android アプリケーションと同様に、AndroidManifest.xml ファイルによってアプリケーションの設定が指定され、アプリケーションクラスとすべてのアクティビティクラスが指定されます。
アプリケーションクラス
アプリケーションクラスは、次の 2 つの主要なタスクを実行します。
- Android Application.onCreate() メソッドを上書きします。
- その onCreate() 内で、次を上書きします。
- スーパークラス onCreate() メソッドをコールする。
- SDK マネージャーオブジェクト (MobileSyncSDKManager) で initNative() をコールして Salesforce Mobile SDK を初期化する。
- 元に戻すことができるコメント付きコードを必要に応じて提供し、アプリケーションを Salesforce ID プロバイダーとして使用する。
- 元に戻すことができるコメント付きコードを必要に応じて提供し、プッシュ通知をサポートする。
コードを見てみましょう。
- Android Studio のようこそ画面から [プロジェクトをインポート (Eclipse ADT、Gradle など)] を選択します。または、Android Studio がすでに開いている場合は、[File (ファイル)] | [Open (開く)] をクリックします。★
- forcedroid コマンドプロンプトで指定したターゲットディレクトリを参照して選択します。(ヒント: 変更していなければ、ターゲットディレクトリは「TrailAndroidApps」です。)
-
[選択] をクリックします。
- Android Studio の編集ウィンドウが表示されたら、プロジェクトビューを開きます ([View (表示)] | [Tool Windows (ツールウィンドウ)] | [Project (プロジェクト)])。
- プロジェクトウィンドウで、[app] | [java] | [com.mytrail.android] を展開し、[MainApplication] をダブルクリックします。
MainApplication クラスは非常にシンプルで、 1 つの基本クラスメソッド onCreate() の上書きを定義します。この上書きは何をするものなのでしょうか? スーパークラス OnCreate() メソッドをコールしてから、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);
}
}MobileSyncSDKManager オブジェクトが初期化されると実行を開始し、MainApplication クラスを見ることはもうありません。MobileSyncSDKManager を初期化するためには次の 2 つのものが必要です。
- アプリケーションコンテキスト。アプリケーションの設定を見つける方法を知るために必要です。
- メインアクティビティクラスへの参照 (MainActivity.class)。MobileSyncSDKManager はログインフローの最後でこれを使用してアプリケーションのカスタムロジックを実行します。
この少量の無償コードから、アプリケーションでパスコード、ログインとログアウト、OAuth、ユーザーデータ暗号化を利用できます。お得ですね。
メインアクティビティクラス
幸いにも、forcedroid は優れていて、MainActivity クラスが SalesforceActivity を拡張できます。つまり、無償で多くの便利なものを手に入れることができることになります。たとえば、SalesforceActivity は自動的に一時停止および再開イベントを処理し、必要なパスコードも再入力されます。Salesforce 以外のアクティビティ基本クラスを使用している場合 (この方法は禁止されているわけではありませんが、お勧めしません)、自分でそのコードを記述することになります。アクティビティクラスは、アプリケーションに必要なだけ定義できます。ただし、すべてのアクティビティで SalesforceActivity や SalesforceListActivity などの Mobile SDK 基本クラスを拡張することをお勧めします。
MainActivity クラスは、Salesforce に REST クエリを送信し、応答を処理します。また、Salesforce から受信したレコードを使用してリストビューに入力します。さらに、ユーザーが取引先責任者または取引先へのクエリを選択できる 2 つのボタンと、レコード表示をクリアするボタン、ログアウトするボタンを表示します。
REST 操作については後ほど説明します。ここでは、これらの UI ボタンがどこでどのように設定されるかを見てみましょう。
- Android Studio のプロジェクトウィンドウで、[MyTrailNative] | [res] | [layout] を展開し、[main.xml] をダブルクリックします。
- エディターウィンドウの下部で、[Text (テキスト)] タブを選択します。
[Text (テキスト)] タブでは、分割ウィンドウの右側にビジュアルデザイナー、左側にビューの XML 設定ファイルが表示されます。ビジュアルデザイナー内の任意の領域をクリックすると、その領域の XML 設定が強調表示されます。たとえば、[FETCH CONTACTS (取引先責任者を取得)] ボタンをクリックすると、<LinearLayout>/<Button> ノードが強調表示されます。ノードの属性は、ボタンの外観、ID、動作などの特性を指定します。UI 設定の詳細は、Android の開発者向けドキュメントを参照してください。
ビューヘッダーの内部 ([Logout (ログアウト)] ボタンなど) をクリックすると、<include> ノードが強調表示されます。
<include layout="@layout/header" />
このノードは、ヘッダーが別の XML ファイルで定義されていることを示しています。layout 属性から判断すると、header.xml は main.xml と同じパスにあります。簡単でしょう。
アプリケーションマニフェスト
プロジェクトの AndroidManifest.xml ファイルを見ると、アプリケーションの最も基本的な設定である名前、アイコン、メインアクティビティ、Android API の最小バージョンと対象バージョンなどが分かります。実際に見てみましょう。
- Android Studio のプロジェクトウィンドウで、[app] を展開します。
-
[AndroidManifest.xml] をダブルクリックします。
ルート <manifest> ノードで、名前空間宣言の直後にアプリケーションのパッケージ名が宣言されています。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mytrail.android"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly"><manifest> ルート要素には、アプリケーションの基本設定を指定する <application> ノードが含まれています。最上位では、このノードは Android に forcedroid アプリケーションの起動クラスの名前をオーバーロードするように指示しています。
<application android:icon="@drawable/sf__icon"
android:label="MyTrailNative"
android:name=".MainApplication"
...「.」プレフィックスは、Android にアプリケーションのパッケージ名 (com.mytrail.android) をこのクラスパスの先頭に追加するように指示します。
また、ユーザーまたは forcedroid によって定義されたすべてのアクティビティもここで説明されます。たとえば、この場合、単独の application/activity ノードはログイン後の最初のアクティビティを表します。ご覧のとおり、アクティビティの android:name プロパティはメインアクティビティのクラス名を参照します。forcedroid の AndroidManifest.xml ファイルの application/activity XML フラグメントを次に示します。
<!-- 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>デフォルトのマニフェストファイルの他の部分はすべて標準の Android 設定です。ほかの Android アプリケーションと同様に、アプリケーション独自のコンポーネント (カスタムアクティビティ、サービス、レシーバーなど) を <application> ノードに追加できます。
forcedroid アプリケーションの内容を学習したので、次は、お待ちかねの Salesforce データへのアクセス方法に進みましょう。
リソース