ログインページでログインした後、各 activity
にサインアウト用の ボタン
を設置するというシナリオがあります。
sign-outをクリックすると、サインインしたユーザの
session idをサインアウトに渡すことになります。すべての
activityで
session id` を利用できるようにするにはどうしたらよいか、どなたか教えてください。
このケースに代わるものはありますか?
最も簡単な方法は、アクティビティを開始するために使用しているIntent
の中で、セッションIDをsignoutアクティビティに渡すことです。
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);
次のアクティビティでそのインテントにアクセスします。
String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");
Intentsのdocsに詳しい情報があります(「"Extras"」というセクションをご覧ください)。
Intent]1のエキストラを渡すのは、Erich氏が指摘したように良いアプローチです。
Application]2オブジェクトは別の方法で、複数のアクティビティで同じ状態を扱う場合(あちこちで取得/配置するのではなく)や、プリミティブや文字列よりも複雑なオブジェクトを扱う場合には、この方法の方が簡単な場合があります。
Applicationを拡張して、そこに必要なものを何でも設定/取得し、getApplication()で(同じアプリケーション内の)どのActivityからでもアクセスできます。
また、スタティックのような他のアプローチは、メモリリークにつながる可能性があるため、問題があることを覚えておいてください。アプリケーションはこれも解決してくれます。
以下のようにしてみてください。
次のような簡単な"helper"クラス(Intentsのためのファクトリー)を作成します。
import android.content.Intent;
public class IntentHelper {
public static final Intent createYourSpecialIntent(Intent src) {
return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
}
}
これはすべてのIntentのファクトリーとなります。新しいIntentが必要になるたびに、IntentHelperにスタティックなファクトリーメソッドを作成します。新しいIntentを作成するには、次のように言えばよいでしょう。
IntentHelper.createYourSpecialIntent(getIntent());
あなたのアクティビティで。あるデータをセッションに保存したい場合は、次のように記述します。
IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);
そして、このIntentを送信します。対象となるアクティビティでは、あなたのフィールドが次のように利用可能になります。
getIntent().getStringExtra("YOUR_FIELD_NAME");
これで、Intentを(サーブレットやJSPのように)従来のセッションのように使うことができます。