1469

ログインページからログインした後、buttonそれぞれにサインアウトするシナリオがありますactivity

をクリックすると、サインインしたユーザーのをサインアウトにsign-out渡します。誰かが私にすべての人が利用できるsession idようにする方法を教えてもらえますか?session idactivities

この場合の代替案

4

53 に答える 53

1462

現在のアクティビティで、新しいものを作成します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
}

この手法を使用して、あるアクティビティから別のアクティビティに変数を渡します。

于 2011-09-06T19:41:23.923 に答える
1429

Intentこれを行う最も簡単な方法は、アクティビティの開始に使用しているサインアウトアクティビティにセッションIDを渡すことです。

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

次のアクティビティでその意図にアクセスします。

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

インテントのドキュメントには、より多くの情報があります(「エクストラ」というタイトルのセクションを参照してください)。

于 2010-01-19T06:12:08.557 に答える
148

Erichが指摘したように、インテントエクストラを渡すことは良いアプローチです。

ただし、 Applicationオブジェクトは別の方法であり、複数のアクティビティ間で同じ状態を処理する場合(どこにでも取得/配置する必要があるのではなく)、またはプリミティブや文字列よりも複雑なオブジェクトを処理する方が簡単な場合があります。

アプリケーションを拡張してから、必要なものを設定/取得し、 getApplication()を使用して(同じアプリケーション内の)任意のアクティビティからアクセスできます。

また、静的なものなど、表示される可能性のある他のアプローチは、メモリリークにつながる可能性があるため、問題が発生する可能性があることにも注意してください。アプリケーションもこれを解決するのに役立ちます。

于 2010-01-20T03:55:37.607 に答える
103

ソースクラス:

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");
}
于 2014-02-06T12:23:40.720 に答える
89

インテントを呼び出しながらエクストラを送信するだけです。

このような:

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);
于 2013-05-24T11:26:39.473 に答える
50

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, ...));
...

次に、目的のアクティビティのインテントを作成し、すべてのパラメーターがあることを確認できます。フラグメントに適応できます。上記の簡単な例ですが、アイデアはわかります。

于 2011-02-17T03:06:45.110 に答える
41

次のことを試してください。

次のように、単純な「ヘルパー」クラス (インテントのファクトリ) を作成します。

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 を使用できるようになりました。

于 2010-01-19T07:16:53.710 に答える
31

パーセル化可能なクラスを作成して、カスタム クラス オブジェクトを渡すこともできます。パーセル化可能にする最善の方法は、クラスを作成し、それを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オブジェクトを簡単に使用できます。

于 2016-02-15T09:58:16.563 に答える
24

もう 1 つの方法は、データを格納する public static フィールドを使用することです。つまり、次のようになります。

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
于 2012-10-25T22:34:50.067 に答える
23

アクティビティ間でデータを渡す最も便利な方法は、インテントを渡すことです。データを送信する最初のアクティビティで、コードを追加する必要があります。

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");
于 2012-08-27T06:46:20.380 に答える
22

あなたが使用することができますSharedPreferences...

  1. ロギング。タイム ストア セッション IDSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    
  2. サインアウト。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();

一度値を保存してからアクティビティの任意の場所を取得するため、これは非常に便利です。

于 2014-10-21T10:30:33.563 に答える
20

アクティビティから

 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");
  }
于 2016-06-23T01:44:07.877 に答える
12

インテント オブジェクトを使用してアクティビティ間でデータを送信できます。と という 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")

于 2015-12-18T12:03:25.103 に答える
9

補足回答: キー文字列の命名規則

データを渡す実際のプロセスは既に回答されていますが、ほとんどの回答では、インテントのキー名にハードコードされた文字列が使用されています。これは通常、アプリ内でのみ使用する場合は問題ありません。ただし、ドキュメント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));
于 2016-11-13T00:18:27.837 に答える
6

アクティビティ間のデータの受け渡しは、主にインテント オブジェクトによって行われます。

Bundleまず、クラスを使用してインテント オブジェクトにデータを添付する必要があります。startActivity()次に、またはstartActivityForResult()メソッドを使用してアクティビティを呼び出します。

詳細については、ブログ投稿Passing data to an Activityの例を参照してください。

于 2012-10-27T13:09:19.007 に答える
6

使用できます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();
于 2016-11-28T06:38:26.023 に答える
4

私は最近、このようなあらゆる種類のタスクをより簡単にする 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切り替え先の反対側でそれらを取得するには。

それが一部の人にとって興味深いものであることを願っています:)

于 2013-02-26T11:49:37.147 に答える
4
/*
 * 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));
    }
}
于 2014-09-13T11:29:46.917 に答える
3

グローバル クラスを使用します。

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()
于 2015-01-15T17:10:36.310 に答える
3

チャーリー・コリンズはを使って完璧な答えをくれました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();
        }
    }
}
于 2013-12-14T15:22:44.027 に答える
3

クラスで静的フィールドを使用し、それらを取得/設定します。

お気に入り:

public class Info
{
    public static int ID      = 0;
    public static String NAME = "TEST";
}

値を取得するには、アクティビティでこれを使用します。

Info.ID
Info.NAME

値を設定するには:

Info.ID = 5;
Info.NAME = "USER!";
于 2013-11-14T16:03:07.383 に答える
3

インテントを通じて 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 を保存し、必要な場所から取得することをお勧めします。

于 2018-09-21T12:34:38.153 に答える
1

コトリンを使用する場合:

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")
}
于 2017-07-04T16:26:53.187 に答える
1

アクティビティと Android アプリの他のコンポーネントとの間でデータを渡す方法は複数あります。1つは、すでに多くの回答で述べられているように、インテントとパーセルブルを使用しています。

別のエレガントな方法は、Eventbusライブラリを使用することです。

放出活動から:

EventBus.getDefault().postSticky("--your Object--");

recv アクティビティでは:

EventBus.getDefault().removeStickyEvent("--Object class--")

その他の考慮事項:

  1. 自由度が高まります。複雑なオブジェクトをいかなる形でも変更せずに渡すことができます。
  2. アクティビティ間でのみデータを渡すことに制限されません。ライブラリを設定したら、それを使用して、アプリの配管である場所から別の場所にデータを渡すことができます。たとえば、これを BottomSheetMenu からアクティビティへの通信に使用します。
  3. 安定のライブラリ。
  4. コンポーネント間の通信を簡素化します
  5. イベントの送信者と受信者を切り離します
  6. UI アーティファクト (アクティビティ、フラグメントなど) とバックグラウンド スレッドでうまく機能します。
  7. 複雑でエラーが発生しやすい依存関係とライフサイクルの問題を回避
  8. 速いです。高性能のために特別に最適化された
  9. 小さい(〜60k jar)
  10. 1,000,000,000以上のインストールを持つアプリによって実際に証明されています
  11. 配信スレッド、サブスクライバーの優先順位などの高度な機能があります。
于 2020-12-04T11:08:16.220 に答える
0

アクティビティ間の共有データを格納するために public static フィールドを使用していますが、その副作用を最小限に抑えるために、次のことを行うことができます。

  • フィールドを 1 つだけ、またはできるだけ少なくして再利用し、オブジェクト型にして、受け取り側のアクティビティで目的の型にキャストします。
  • それらのいずれかがもはや役に立たないときはいつでも、明示的に null に設定して、次の割り当ての前にガベージ コレクターによって収集されます。
于 2015-11-14T11:08:46.253 に答える
0

シングルトンを使用して、すべてのアクティビティからアクセスできるセッション情報を保持することを検討してください。

このアプローチには、エクストラや静的変数と比較していくつかの利点があります。

  1. Info クラスを拡張して、必要な新しいユーザー情報設定を追加できます。それを継承する新しいクラスを作成するか、すべての場所でエクストラ処理を変更する必要なく Info クラスを編集することができます。
  2. 簡単な使い方 - すべてのアクティビティで余分なものを入手する必要はありません。

    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;
        }
    }
    
于 2013-12-09T14:51:38.980 に答える