ログインページからログインした後、button
それぞれにサインアウトするシナリオがありますactivity
。
をクリックすると、サインインしたユーザーのをサインアウトにsign-out
渡します。誰かが私にすべての人が利用できるsession id
ようにする方法を教えてもらえますか?session id
activities
この場合の代替案
ログインページからログインした後、button
それぞれにサインアウトするシナリオがありますactivity
。
をクリックすると、サインインしたユーザーのをサインアウトにsign-out
渡します。誰かが私にすべての人が利用できるsession id
ようにする方法を教えてもらえますか?session id
activities
この場合の代替案
現在のアクティビティで、新しいものを作成しますIntent
。
String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);
i.putExtra("key",value);
startActivity(i);
次に、新しいアクティビティで、これらの値を取得します。
Bundle extras = getIntent().getExtras();
if (extras != null) {
String value = extras.getString("key");
//The key argument here must match that used in the other activity
}
この手法を使用して、あるアクティビティから別のアクティビティに変数を渡します。
Intent
これを行う最も簡単な方法は、アクティビティの開始に使用しているサインアウトアクティビティにセッションIDを渡すことです。
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);
次のアクティビティでその意図にアクセスします。
String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");
インテントのドキュメントには、より多くの情報があります(「エクストラ」というタイトルのセクションを参照してください)。
Erichが指摘したように、インテントエクストラを渡すことは良いアプローチです。
ただし、 Applicationオブジェクトは別の方法であり、複数のアクティビティ間で同じ状態を処理する場合(どこにでも取得/配置する必要があるのではなく)、またはプリミティブや文字列よりも複雑なオブジェクトを処理する方が簡単な場合があります。
アプリケーションを拡張してから、必要なものを設定/取得し、 getApplication()を使用して(同じアプリケーション内の)任意のアクティビティからアクセスできます。
また、静的なものなど、表示される可能性のある他のアプローチは、メモリリークにつながる可能性があるため、問題が発生する可能性があることにも注意してください。アプリケーションもこれを解決するのに役立ちます。
ソースクラス:
Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)
宛先クラス (NewActivity クラス):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
Intent intent = getIntent();
String fName = intent.getStringExtra("firstName");
String lName = intent.getStringExtra("lastName");
}
インテントを呼び出しながらエクストラを送信するだけです。
このような:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
あなたのOnCreate
方法で、SecondActivity
このようなエクストラを取得できます。
送信した値が にあった場合long
:
long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));
送信した値が次の場合String
:
String value = getIntent().getStringExtra("Variable name which you sent as an extra");
送信した値が次の場合Boolean
:
Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
SharedPreferenceの使用について言及したことに注意してください。シンプルな API を備えており、アプリケーションのアクティビティ全体でアクセスできます。しかし、これは不器用なソリューションであり、機密データを渡すとセキュリティ リスクになります。インテントを使用することをお勧めします。アクティビティ間でさまざまなデータ型をより適切に転送するために使用できる、オーバーロードされたメソッドの広範なリストがあります。Intent.putExtraを見てください。このリンクは、putExtra の使用法を非常によく示しています。
アクティビティ間でデータを渡す場合、私が好むアプローチは、インテントを起動する必要なパラメーターを含む関連アクティビティの静的メソッドを作成することです。これにより、パラメータの設定と取得が簡単になります。だからそれはこのように見えることができます
public class MyActivity extends Activity {
public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
Intent intent = new Intent(from, MyActivity.class);
intent.putExtra(ARG_PARAM1, param1);
intent.putExtra(ARG_PARAM2, param2);
return intent;
}
....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...
次に、目的のアクティビティのインテントを作成し、すべてのパラメーターがあることを確認できます。フラグメントに適応できます。上記の簡単な例ですが、アイデアはわかります。
次のことを試してください。
次のように、単純な「ヘルパー」クラス (インテントのファクトリ) を作成します。
import android.content.Intent;
public class IntentHelper {
public static final Intent createYourSpecialIntent(Intent src) {
return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
}
}
これは、すべてのインテントのファクトリーになります。新しいインテントが必要になるたびに、IntentHelper で静的ファクトリ メソッドを作成します。新しいインテントを作成するには、次のように言うだけです。
IntentHelper.createYourSpecialIntent(getIntent());
あなたの活動で。「セッション」に一部のデータを「保存」する場合は、次のようにします。
IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);
そして、この Intent を送信します。ターゲット アクティビティでは、フィールドは次のように使用できます。
getIntent().getStringExtra("YOUR_FIELD_NAME");
これで、同じ古いセッション (サーブレットやJSPなど)のように Intent を使用できるようになりました。
パーセル化可能なクラスを作成して、カスタム クラス オブジェクトを渡すこともできます。パーセル化可能にする最善の方法は、クラスを作成し、それをhttp://www.parcelabler.com/などのサイトに貼り付けることです。ビルドをクリックすると、新しいコードが取得されます。これをすべてコピーして、元のクラスの内容を置き換えます。それで-
Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);
次のようなNextActivityで結果を取得します-
Foo foo = getIntent().getExtras().getParcelable("foo");
これで、以前と同じようにfooオブジェクトを簡単に使用できます。
もう 1 つの方法は、データを格納する public static フィールドを使用することです。つまり、次のようになります。
public class MyActivity extends Activity {
public static String SharedString;
public static SomeObject SharedObject;
//...
アクティビティ間でデータを渡す最も便利な方法は、インテントを渡すことです。データを送信する最初のアクティビティで、コードを追加する必要があります。
String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);
また、インポートする必要があります
import android.content.Intent;
次に、次のAcitvity(SecondActivity)で、次のコードを使用してインテントからデータを取得する必要があります。
String name = this.getIntent().getStringExtra("name");
あなたが使用することができますSharedPreferences
...
ロギング。タイム ストア セッション IDSharedPreferences
SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("sessionId", sessionId);
editor.commit();
サインアウト。sharedpreferences のタイム フェッチ セッション ID
SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
String sessionId = preferences.getString("sessionId", null);
必要なセッション ID がない場合は、sharedpreferences を削除します。
SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();
一度値を保存してからアクティビティの任意の場所を取得するため、これは非常に便利です。
アクティビティから
int n= 10;
Intent in = new Intent(From_Activity.this,To_Activity.class);
Bundle b1 = new Bundle();
b1.putInt("integerNumber",n);
in.putExtras(b1);
startActivity(in);
アクティビティへ
Bundle b2 = getIntent().getExtras();
int m = 0;
if(b2 != null)
{
m = b2.getInt("integerNumber");
}
インテント オブジェクトを使用してアクティビティ間でデータを送信できます。と という 2 つのアクティビティがあるFirstActivity
としSecondActivity
ます。
FirstActivity の内部:
使用目的:
i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)
インサイド SecondActivity
Bundle bundle= getIntent().getExtras();
これで、さまざまなバンドル クラス メソッドを使用して、FirstActivity から Key によって渡された値を取得できるようになりました。
例:
bundle.getString("key")
、bundle.getDouble("key")
などbundle.getInt("key")
。
データを渡す実際のプロセスは既に回答されていますが、ほとんどの回答では、インテントのキー名にハードコードされた文字列が使用されています。これは通常、アプリ内でのみ使用する場合は問題ありません。ただし、ドキュメントEXTRA_*
では、標準化されたデータ型に定数を使用することを推奨しています。
例 1:Intent.EXTRA_*
キーの使用
最初の活動
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);
2 番目のアクティビティ:
Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);
static final
例 2: 独自のキーを定義する
文字列の 1 つがIntent.EXTRA_*
ニーズに合わない場合は、最初のアクティビティの開始時に独自の文字列を定義できます。
static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";
独自のアプリでのみキーを使用している場合、パッケージ名を含めることは単なる規則です。ただし、他のアプリがインテントで呼び出すことができる何らかのサービスを作成している場合は、名前の競合を避ける必要があります。
最初のアクティビティ:
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);
2 番目のアクティビティ:
Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);
例 3: 文字列リソース キーの使用
ドキュメントには記載されていませんが、この回答では、アクティビティ間の依存関係を回避するために String リソースを使用することをお勧めしています。
文字列.xml
<string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>
最初の活動
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);
第二の活動
Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));
アクティビティ間のデータの受け渡しは、主にインテント オブジェクトによって行われます。
Bundle
まず、クラスを使用してインテント オブジェクトにデータを添付する必要があります。startActivity()
次に、またはstartActivityForResult()
メソッドを使用してアクティビティを呼び出します。
詳細については、ブログ投稿Passing data to an Activityの例を参照してください。
使用できますIntent
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
別の方法として、シングルトン パターンを使用することもできます。
public class DataHolder {
private static DataHolder dataHolder;
private List<Model> dataList;
public void setDataList(List<Model>dataList) {
this.dataList = dataList;
}
public List<Model> getDataList() {
return dataList;
}
public synchronized static DataHolder getInstance() {
if (dataHolder == null) {
dataHolder = new DataHolder();
}
return dataHolder;
}
}
FirstActivity から
private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);
SecondActivity で
private List<Model> dataList = DataHolder.getInstance().getDataList();
私は最近、このようなあらゆる種類のタスクをより簡単にする jQuery フレーバーの Android フレームワークであるVapor APIをリリースしました。前述のように、SharedPreferences
これを行う方法の 1 つです。
VaporSharedPreferences
シングルトンとして実装されているため、これは 1 つのオプションであり、Vapor API ではメソッドが大幅にオーバーロードされている.put(...)
ため、コミットしているデータ型について明示的に心配する必要はありません (サポートされている場合)。また、流暢であるため、呼び出しを連鎖させることができます。
$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);
また、オプションで変更を自動保存し、内部で読み取りと書き込みのプロセスを統合するため、標準の Android のようにエディターを明示的に取得する必要はありません。
または、 を使用することもできますIntent
。Vapor API では、連鎖可能なオーバーロード.put(...)
されたメソッドを以下で使用することもできますVaporIntent
。
$.Intent().put("data", "myData").put("more", 568)...
他の回答で述べたように、それを追加で渡します。からエクストラを取得できます。Activity
さらに、VaporActivity
これを使用している場合は自動的に行われるため、次を使用できます。
this.extras()
Activity
切り替え先の反対側でそれらを取得するには。
それが一部の人にとって興味深いものであることを願っています:)
/*
* If you are from transferring data from one class that doesn't
* extend Activity, then you need to do something like this.
*/
public class abc {
Context context;
public abc(Context context) {
this.context = context;
}
public void something() {
context.startactivity(new Intent(context, anyone.class).putextra("key", value));
}
}
グローバル クラスを使用します。
public class GlobalClass extends Application
{
private float vitamin_a;
public float getVitaminA() {
return vitamin_a;
}
public void setVitaminA(float vitamin_a) {
this.vitamin_a = vitamin_a;
}
}
このクラスのセッターとゲッターは、他のすべてのクラスから呼び出すことができます。それを行うには、すべてのアクティビティで GlobalClass-Object を作成する必要があります。
GlobalClass gc = (GlobalClass) getApplication();
次に、たとえば次のように呼び出すことができます。
gc.getVitaminA()
チャーリー・コリンズはを使って完璧な答えをくれましたApplication.class
。こんなに簡単にサブクラス化できるとは知りませんでした。カスタム アプリケーション クラスを使用した簡単な例を次に示します。
AndroidManifest.xml
android:name
独自のアプリケーション クラスを使用する属性を指定します。
...
<application android:name="MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
....
MyApplication.java
これをグローバル参照ホルダーとして使用します。同じプロセス内で正常に動作します。
public class MyApplication extends Application {
private MainActivity mainActivity;
@Override
public void onCreate() {
super.onCreate();
}
public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
public MainActivity getMainActivity() { return mainActivity; }
}
MainActivity.java
グローバルな「シングルトン」参照をアプリケーション インスタンスに設定します。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((MyApplication)getApplication()).setMainActivity(this);
}
...
}
MyPreferences.java
別のアクティビティ インスタンスのメイン アクティビティを使用する簡単な例。
public class MyPreferences extends PreferenceActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceManager.getDefaultSharedPreferences(this)
.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (!key.equals("autostart")) {
((MyApplication)getApplication()).getMainActivity().refreshUI();
}
}
}
クラスで静的フィールドを使用し、それらを取得/設定します。
お気に入り:
public class Info
{
public static int ID = 0;
public static String NAME = "TEST";
}
値を取得するには、アクティビティでこれを使用します。
Info.ID
Info.NAME
値を設定するには:
Info.ID = 5;
Info.NAME = "USER!";
インテントを通じて 2 つのアクティビティ間で通信できます。ログイン アクティビティを介して他のアクティビティに移動するときはいつでも、sessionId をインテントに入れ、getIntent() を使用して他のアクティビティでそれを取得できます。以下は、そのコード スニペットです。
ログイン アクティビティ:
Intent intent = new
Intent(YourLoginActivity.this,OtherActivity.class);
intent.putExtra("SESSION_ID",sessionId);
startActivity(intent);
finishAfterTransition();
その他のアクティビティ:
onCreate() または必要な場所で getIntent().getStringExtra("SESSION_ID"); を呼び出します。また、インテントが null であるかどうか、およびインテントで渡すキーが両方のアクティビティで同じであることを確認してください。完全なコード スニペットは次のとおりです。
if(getIntent!=null && getIntent.getStringExtra("SESSION_ID")!=null){
sessionId = getIntent.getStringExtra("SESSION_ID");
}
ただし、AppSharedPreferences を使用して sessionId を保存し、必要な場所から取得することをお勧めします。
コトリンを使用する場合:
MainActivity1 で:
var intent=Intent(this,MainActivity2::class.java)
intent.putExtra("EXTRA_SESSION_ID",sessionId)
startActivity(intent)
MainActivity2:
if (intent.hasExtra("EXTRA_SESSION_ID")){
var name:String=intent.extras.getString("sessionId")
}
アクティビティと Android アプリの他のコンポーネントとの間でデータを渡す方法は複数あります。1つは、すでに多くの回答で述べられているように、インテントとパーセルブルを使用しています。
別のエレガントな方法は、Eventbusライブラリを使用することです。
放出活動から:
EventBus.getDefault().postSticky("--your Object--");
recv アクティビティでは:
EventBus.getDefault().removeStickyEvent("--Object class--")
その他の考慮事項:
アクティビティ間の共有データを格納するために public static フィールドを使用していますが、その副作用を最小限に抑えるために、次のことを行うことができます。
シングルトンを使用して、すべてのアクティビティからアクセスできるセッション情報を保持することを検討してください。
このアプローチには、エクストラや静的変数と比較していくつかの利点があります。
簡単な使い方 - すべてのアクティビティで余分なものを入手する必要はありません。
public class Info {
private static Info instance;
private int id;
private String name;
//Private constructor is to disallow instances creation outside create() or getInstance() methods
private Info() {
}
//Method you use to get the same information from any Activity.
//It returns the existing Info instance, or null if not created yet.
public static Info getInstance() {
return instance;
}
//Creates a new Info instance or returns the existing one if it exists.
public static synchronized Info create(int id, String name) {
if (null == instance) {
instance = new Info();
instance.id = id;
instance.name = name;
}
return instance;
}
}