アクティビティの実装

ここから先のページでは、Kii Balance の実装について説明します。まず、MainActivity クラスの実装を説明します。

MainActivity は、Kii Balance で唯一のアクティビティクラスです。画面遷移はフラグメントを使って行うため、MainActivity は、他のフラグメントのコンテナの役割を果たします。

同時に、MainActivity はユーザーのログイン状態に応じた画面遷移も実現します。Hello Kii の場合、モバイルアプリの起動直後は必ずログイン画面を経由してから、データ表示を行っていました。Kii Balance では、前回のログイン情報を復元して、タイトル画面をスキップする機能を実現しています。

画面遷移と状態保存

Android でアクティビティクラスを実装する際は、アクティビティのライフサイクルの制御に注意を払う必要があります。アクティビティのライフサイクルは、Android の実装で最も基本的なテーマです。詳細は専門書籍や Web 上の情報をご覧ください。

MainActivity では、アクティビティのライフサイクルの影響を受けて呼び出される onCreate() メソッドと onSaveInstanceState() メソッドを実装しています。

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ...
}

public void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  ...
}

Kii Cloud SDK を使う Android アプリでは、これらのメソッドを使って、SDK の状態の保存と復元を行う必要があります。

onCreate() メソッドは、アクティビティが作成されたときに呼び出されます。この際、引数 savedInstanceState によって再作成の状況を知ることができます。

  • savedInstanceState が null 以外の場合

    これは、画面回転や画面遷移などによって、OS によるアクティビティの再作成が行われたことを意味します。直前の onSaveInstanceState() で保存された内部状態が、onCreate()savedInstanceState で渡されます。

    このケースでは、アクティビティ内部の画面要素は OS によって自動的に復元されるため、モバイルアプリでは内部の変数などを復元するだけでよいことになります。

    MainActivity クラスでは、下記の 内部状態の復元 で説明する実装を行います。

    なお、OSのバージョン、機種、AndroidManifest.xml でのアクティビティの設定などの条件によっては、このケースでの呼び出しが行われないことがあります。

  • savedInstanceState が null の場合

    これは、モバイルアプリ起動時のように、アクティビティが新規に作成されたことを意味します。

    このケースでは、アクティビティ内部の画面要素と内部の変数の両方に対して、初期化処理を行う必要があります。

    MainActivity クラスでは、下記の アクティビティ起動時の処理 で説明する実装を行います。

以下の図は、アクティビティを操作したとき、onCreate() メソッドと onSaveInstanceState() メソッドの呼び出し状況を、#1~#3 の 3 通りのパターンについて表したものです。上記のルールで呼び出されていることが分かります。

内部状態の復元

onCreate() メソッドの savedInstanceState が null 以外の場合、savedInstanceState から Kii Cloud SDK の内部状態を復元します。

Kii Cloud SDK は、内部状態を onSaveInstanceState()onCreate() で保存、復元する機能を持っています。

Kii Balance では、以下のように実装されています。

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  if (savedInstanceState != null) {
    Kii.onRestoreInstanceState(savedInstanceState);
  } else {
    initializeScreen();
  }
}

@Override
public void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  Kii.onSaveInstanceState(outState);
}

onSaveInstanceState() メソッドでは、Kii.onSaveInstanceState() を実行することで Kii Cloud SDK の内部状態を Bundle に保存します。

OS によるアクティビティの再作成が行われると、保存した内部状態が次回の onCreate() メソッドの savedInstanceState 引数で渡されます。onCreate() メソッドでは、savedInstanceState が有効な値を持っていることを確認し、Kii.onRestoreInstanceState() によって Kii Cloud SDK の内部状態を復元します。

前述のとおり、画面は OS によって復元されているため、Kii Cloud SDK の内部状態を復元するだけで必要な処理が完了します。Kii Balance は他の内部状態を保持していないため、これだけで処理を終わっていますが、実際のモバイルアプリで内部変数があれば、Kii Cloud SDK と同時に保存と復元を行います。

アクティビティ起動時の処理

onCreate() メソッドの savedInstanceState が null の場合、アクティビティが新規に起動した場合の処理を行います。

MainActivity での実装は以下のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  if (savedInstanceState != null) {
    Kii.onRestoreInstanceState(savedInstanceState);
  } else {
    initializeScreen();
  }
}

private void initializeScreen() {
  KiiUser.loginWithStoredCredentials(new KiiCallback<KiiUser>() {
    @Override
    public void onComplete(KiiUser user, Exception exception) {
      if (exception != null) {
        // Show the title screen.
        ViewUtil.toNextFragment(getSupportFragmentManager(), TitleFragment.newInstance(), false);
      } else {
        // Show the data listing screen.
        ViewUtil.toNextFragment(getSupportFragmentManager(), BalanceListFragment.newInstance(), false);
      }
    }
  });
}

onCreate() では、アクティビティのビューを設定した後、initializeScreen() メソッドを呼び出しています。ここでは以下の処理を行います。

ここでは、KiiUser.loginWithStoredCredentials() を呼び出してログイン情報を復元しています。Kii Cloud SDK では、ユーザーのログインやリフレッシュが成功したときに、SDK が内部に持つ認証関連の情報を Shared Preferences に自動的に保存しており、その情報から認証関連の情報を復元できます。

  • 復元に失敗した場合、Kii Cloud SDK は前回保存したユーザー情報が利用できないことを意味します。タイトル画面に遷移してログインをやり直します。画面遷移の方法は、フラグメントによる画面遷移 で説明したとおりです。

  • 復元に成功した場合は、ユーザーはログイン済みの状態となっています。すぐにデータ一覧画面に遷移できます。

なお、onComplete() 関数の user 引数はユーザー情報のフルセットを持っていない点にご注意ください。ログイン情報の復元処理は、Kii Cloud にアクセスせず、Shared Preference に保存されている最小限の情報から user を生成します。ユーザー属性などの詳細情報にアクセスするには、ユーザーのリフレッシュを行う必要があります。詳細は、このページの最後 より詳しく学びたい方へ をご覧ください。

保存情報とアクセストークン

KiiUser.loginWithStoredCredentials() を使うと、前回ログインに成功したときの情報を Shared Preferences から復元できます。

保存している情報には、ユーザー ID やユーザー名などの様々なものがありますが、特に重要なものはアクセストークンです。アクセストークンは、認証済みのユーザーを識別するための文字列です。

アクセストークンは Kii Cloud の利用において基本となる概念で、使用する機会が多いため、以下に詳細な説明を示します。

モバイルアプリは Kii Cloud SDK を通して Kii Cloud にアクセスしています。SDK から Kii Cloud へのリクエストは、REST API として公開されている API 仕様に基づいて行われます。

ユーザー名とパスワードによってユーザーがログインすると、そのユーザーの権限でアクセスするアクセストークンが Kii Cloud から発行されます。

後続の REST API のリクエストでは、HTTPS のヘッダーにアクセストークンを指定します。これにより、操作元のユーザーが特定され、そのユーザーの権限で処理を行うことができます。

実際のモバイルアプリでも、Kii Balance と同様、KiiUser.loginWithStoredCredentials() を使ってアクセストークンを含むログイン状態を復元できます。ただし、より低レベルな API として、アクセストークンだけを使ったログインもサポートしています。ログイン成功時にアクセストークンを文字列としてどこかに保存しておき、KiiUser.loginWithToken() メソッドでログインすることもできます。


次は...

タイトルページの実装について説明します。

タイトル画面の実装 に移動してください。

より詳しく学びたい方へ