Androidアプリケーションのアクティビティ間でデータを渡すにはどうすればよいですか?


1348

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

をクリックするとsign-outsession idサインインしているユーザーのがサインアウトに渡されます。誰でもsession id利用できるようにする方法について誰かが私を案内できますactivitiesか?

このケースの代替案


14
私はsharedpreferenceを使用して、ログインデータを覚えやすいパスワード機能に保存することもできました
shareef

これでうまくいきます。 stackoverflow.com/a/7325248/2125322 おかげでDarshan Computing
matasoy

stackoverflow.com/a/37774966/6456129が役立つ場合があります
Yessy

そのような場合は、commomUtilsクラスをsharedpreferecesメソッドで作成してみてください...これにより、コードがクリーンになり、関連データが適切な場所に保持されます。また、デフォルトのアプリデータを消去せずに、特定のprefrencesFileを消去する1つの方法だけで特定のデータセットを簡単に消去できます...
Muahmmad Tayyib

回答:


1265

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

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

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

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

インテントのドキュメントに詳細情報があります(「その他」というタイトルのセクションをご覧ください)。


ログイン成功時にセッションIDをサインアウトアクティビティに渡して、ログアウトするアクティビティページで機能するか、手動で各アクティビティに値を割り当てる必要があるか 上記の手順を使用して??
UMAR、2010年

5
はい、ユーザーがログアウトできるようにするすべてのアクティビティでセッションIDを使用できるようにする必要があります。または、アプリケーションオブジェクトに保存することもできますが、セッションの状態を管理する必要があります(使用する前に有効かどうかを確認するなど)。
Erich Douglass、2010年

1
ドキュメントは次の点に注意してください:拡張データをインテントに追加します。名前にはパッケージプレフィックスを含める必要があります。たとえば、アプリcom.android.contactsは「com.android.contacts.ShowAll」のような名前を使用します。
セルゲイフェドロフ2013年

1
そして、他のアクティビティの使用からデータを読み取るにはLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
Farid

1
どのように使用setDataしてデータを渡すことができますか、これら2つのアプローチの違いは何ですか?どっちがいいですか?
Hosein Aqajani 16

1402

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

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


58
私のように盲目の人のための単なる情報です:現在のアクティビティに整数を入れた場合、を介して新しいものにそれを取得する必要がありますextras.getInt("new_variable_name")。あなたがgetString()アンドロイドを介してそれを取得しようとすると、intが与えられてnullを返すことがわかります!
2013

4
アクティビティが既に実行されている場合はどうする必要がありstartActivity(i);ますか?私は私が作ることができ、意味の活動Aのコール・アクティビティ・Bを、およびにそのデータを戻す活動A?私は混乱していますか?
フランシスココラレスモラレス2014年


私は文字列変数を好みます。文字列は後でいつでも整数または浮動小数点数に変換できます。
user914425

140

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

アプリケーションオブジェクトは、しかし、別の方法であり、それは(/取得どこでもそれを置くためにするものではなく)複数のアクティビティ間で同じ状態を扱うときに、時には簡単です、またはプリミティブと文字列よりも複雑なオブジェクト。

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

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


8
静的問題の場合は+1。おそらくクリーンアップは、シングルトンをonCreate / onTerminateメソッドのApplicationクラスと組み合わせることで解決できます。
Syd 2010年

10
ねえ、私はこのスレッドがかなり前にあったことを知っていますが、提供されたリンクは現在行き止まりです。例を見つけることができる場所はありますか?
JuiCe

アプリケーションを使用してこれを達成するにはどうすればよいですか?@CharlieCollins
Banee Ishaque K

ここでは、この更新の例は、非常に古い本:)から、ここだgithub.com/charlieCollins/android-in-practice/blob/master/ch07/...
チャーリー・コリンズ

@JuiCeメモリリークに関するAndroid開発者のブログ投稿が無効ではなくなりました。
エドリック

94

ソースクラス:

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");
}

3
インテントをnullにすることはできますか?nullでないことを確認する必要がありますか?
Micro


85

インテントを呼び出すときに、エキストラを送信するだけです。

このような:

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

3
ドキュメントは次の点に注意してください:拡張データをインテントに追加します。名前にはパッケージプレフィックスを含める必要があります。たとえば、アプリcom.android.contactsは「com.android.contacts.ShowAll」のような名前を使用します。
セルゲイフェドロフ2013年

これは、この回答の2年間前に行われた最も投票数の多い回答と、1年古いSahil Mahajan Mjの回答の複製です。唯一の違い:booleanlongではなく、コメントIMOに値するゲッターの例。回答ではありません。
Murmel

48

状況を把握するのに役立ちます。2つの例を示します。

データを転送する

ここに画像の説明を入力してください

主な活動

  • 送信するデータを、キーと値のペアを使用してインテントに配置します。キーの命名規則については、この回答を参照してください。
  • で2番目のアクティビティを開始しstartActivityます。

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

2番目のアクティビティ

  • を使用getIntent()してIntent、2番目のアクティビティを開始しました。次にgetExtras()、最初のアクティビティで定義したキーとキーを使用してデータを抽出できます。データは文字列なので、getStringExtraここで使用します。

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

データの受け渡し

ここに画像の説明を入力してください

主な活動

  • startActivityForResult任意の結果コードを指定して、2番目のアクティビティをで開始します。
  • 上書きするonActivityResult。これは、2番目のアクティビティが終了したときに呼び出されます。結果コードを確認することで、それが実際に2番目のアクティビティであることを確認できます。(これは、同じメインアクティビティから複数の異なるアクティビティを開始するときに便利です。)
  • 戻りから得たデータを抽出しますIntent。データは、キーと値のペアを使用して抽出されます。キーには任意の文字列を使用できますが、Intent.EXTRA_TEXTテキストを送信するため、事前定義された文字列を使用します。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

2番目のアクティビティ

  • 前のアクティビティに送り返したいデータをに入れますIntent。データはIntent、キーと値のペアを使用してに格納されます。私はIntent.EXTRA_TEXT自分の鍵に使うことを選びました。
  • 結果をに設定し、RESULT_OKデータを保持するインテントを追加します。
  • finish()2番目のアクティビティを閉じるために呼び出します。

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

3
わぁ、ありがとう!これは私が探していたものでした。カメラやその他の外観を使用すると、結果が期待できることは明らかですが、内部で使用することは考えていませんでした。あなたはそれをとてもオープンに表現する最初の人です。
user3195231

45

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

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


2
私はあなたの答えが一番好きです...インテントを介してそれを渡すことは、私がアクティビティを開始するほぼすべての場所で、sessionIdを含めることを覚えておく必要があることを意味します。SharedPreferencesに配置することで、いつでもどのアクティビティからでも取得できます。:0)
bytebender

@bytebender私はこれが応答に少し遅れていることを知っています。その単純さのために私の元の回答が気に入っていただければ幸いですが、共有設定にセッションIDを保存するように注意します。ハードディスクに保存する必要がある場合は、暗号化を使用してください。JWTを使用する認証フレームワークを使用できる場合は、長期保存に安全なrefreshTokensが含まれ、現在のセッショントークンをカスタムアプリケーションオブジェクトのパブリックプロパティとして保持して、認証トークンに簡単にアクセスし、アクティビティのオーバーヘッドを削減しますインテント署名。
angryITguy

38

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

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

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

これがすべてのインテントのファクトリになります。新しいIntentが必要になるたびに、IntentHelperで静的ファクトリメソッドを作成します。新しいインテントを作成するには、次のように言うだけです。

IntentHelper.createYourSpecialIntent(getIntent());

あなたの活動で。「セッション」の一部のデータを「保存」する場合は、以下を使用します。

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

このインテントを送信します。ターゲットアクティビティでは、フィールドは次のように使用できます。

getIntent().getStringExtra("YOUR_FIELD_NAME");

これで、同じ古いセッション(サーブレットやJSPなど)のようにIntentを使用できるようになりました。


28

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


23

もう1つの方法は、データを格納する静的なパブリックフィールドを使用することです。

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

5
あなたの提案がなぜ投票を獲得しなかったのか、それはよりシンプルでより実用的だと本当に思います。
Porizm 2012年

7
うーん...これはオブジェクト指向の原則に違反していませんか?
Christian Vielma 2013

2
@ChristianVielmaよく、それは灰色の領域のようです...あなたはそれを多くの方法で行うことができます、私にはそれはきれいな「逃げる」のように思われるので...それを決定するのはあなた(開発者)次第です簡単にフォローできるので、この方法が好きですが、非常に汚れやすくなります...
ComputerSaysNo

2
なぜこれは汚れるのですか?iOSは、これに似た「プロパティ」を設定して、ビューコントローラー間でデータを受け渡すためにこれを行いませんか?これはインテントを使用するよりもはるかに簡単です
Terry Bu

2
はい、View Controller間でデータを渡しますが、静的プロパティは渡しません。問題は、目的のアクティビティインスタンスのプロパティではないことです。AndroidがstartActivity()を介してアクティビティを起動する方法では、オブジェクトがすぐにインスタンス化されず、開発者がインスタンス変数を設定できます。それはかなり迷惑です...
ショーン

20

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

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");

2
これは、1年以上も続いている、最も投票数の多い回答の複製です。
Murmel

19

使用できます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();

一度値を保存してから、どこでもアクティビティを取得できるので、非常に便利です。


17

標準的なアプローチ。

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

次に、2番目のアクティビティで、バンドルからデータを取得します。

バンドルを入手

Bundle bundle = getIntent().getExtras();

データを抽出…

String stuff = bundle.getString(“stuff”); 

1
2012年にPRABEESH RKによってすでに提案されているように複製します。また、他の6つの回答によって提案されたi.putExtras()/に削減できgetIntent().getString()ます...
Murmel

17

アクティビティから

 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");
  }

1
複製:Bundleベースのアプローチは、2012年にPRABEESH RKおよびAjay Venugopalクリシュナによってすでに提案されました。そして、他の8つの回答で提案されているi.putExtras()/に削減することができますgetIntent().getString()...
Murmel

11

インテントオブジェクトを使用して、アクティビティ間でデータを送信できます。との2つのアクティビティがあるFirstActivityとしSecondActivityます。

FirstActivity内:

インテントの使用:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

SecondActivityの内側

Bundle bundle= getIntent().getExtras();

これで、さまざまなバンドルクラスメソッドを使用して、キーによってFirstActivityから渡された値を取得できます。

例えば bundle.getString("key")bundle.getDouble("key")bundle.getInt("key")など


1
複製:Bundleベースのアプローチは、2012年にPRABEESH RKおよびAjay Venugopalによってすでに提案されました。そして、他の7つの回答によって提案されたi.putExtras()/に削減できますgetIntent().getString()...
Murmel '22

11

アクティビティ/フラグメント間でビットマップを転送したい場合


アクティビティ

アクティビティ間でビットマップを渡すには

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

そしてActivityクラスで

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

断片

フラグメント間でビットマップを渡すには

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

SecondFragment内で受け取るには

Bitmap bitmap = getArguments().getParcelable("bitmap");

大きなビットマップの転送

失敗したバインダートランザクションを取得している場合、これは、大きな要素をあるアクティビティから別のアクティビティに転送することにより、バインダートランザクションバッファーを超えていることを意味します。

したがって、その場合はビットマップをバイトの配列として圧縮し、次のように別のアクティビティ解凍する必要があります。

FirstActivityで

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

そしてSecondActivityで

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

9
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

別のアクティビティで取得できます。二通り:

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

2番目の方法は次のとおりです。

Intent i = getIntent();
String name = i.getStringExtra("name");


8

これが私のベストプラクティスであり、プロジェクトが巨大で複雑な場合に役立ちます。

2つのアクティビティがあるLoginActivityとしHomeActivityます。私はから2つのパラメータ(ユーザー名とパスワード)を渡したいLoginActivityHomeActivity

まず、自分の HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

これが、LoginActivityでデータを渡す方法です。

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

最後のステップ、ここに私がデータを受け取る方法があります HomeActivity

public class HomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

できた!クール:)私は自分の経験を共有したいだけです。小さなプロジェクトで作業している場合、これは大きな問題ではありません。しかし、大きなプロジェクトに取り組んでいるとき、バグのリファクタリングや修正をしたいときは本当に大変です。


7

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

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

例2:独自のstatic final鍵を定義する

Intent.EXTRA_*文字列の1つがニーズに合わない場合は、最初のアクティビティの最初に独自の文字列を定義できます。

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:文字列リソースキーの使用

ドキュメントでは言及されていませんが、この回答では、アクティビティ間の依存関係を回避するために文字列リソースを使用することをお勧めします。

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

2番目のアクティビティ

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

7

使用できます 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();

重複:インテントアプローチは、最も投票数の多い回答Sahil Mahajan Mjの回答Mayank Sainiの回答Md。Rahman の回答Dilavar Mの回答Android開発者の回答sahulabによってすでに提案されています。シングルトン:Rodion Altshulerの回答
Murmel 2017年

6

アクティビティ間のデータの受け渡しは、主にインテントオブジェクトによるものです。

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

詳細については、ブログの記事「データをアクティビティに渡す」からの例を参照してください。


これは、Intentが提供するメソッドを直接使用する場合とほぼ同じです()。しかし、別のものを追加し、物事をより複雑にします。Intent#putExtra()Bundle
Murmel

6

あなたは共有設定を試すことができます、それは活動間でデータを共有するための良い代替手段になるかもしれません

セッションIDを保存するには-

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

それらを得るために-

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

重複:このアプローチはすでにによってpropsedたラヴィParsania 2014年
Murmel

5

このアクティビティから別のアクティビティを開始し、バンドルオブジェクトを介してパラメータを渡します

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

別のアクティビティ(YourActivity)で取得する

String s = getIntent().getStringExtra("USER_NAME");

これは単純な種類のデータ型には問題ありません。ただし、アクティビティ間で複雑なデータを渡したい場合は、最初にシリアル化する必要があります。

ここに従業員モデルがあります

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

Googleが提供するGson libを使用して、このような複雑なデータをシリアル化できます

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);

5

コトリン

最初のアクティビティからパス

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

2番目のアクティビティに入る

val value = getIntent().getStringExtra("key")

提案

より管理された方法のために、常にキーを定数ファイルに入れます。

companion object {
    val KEY = "key"
}

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));
    }
}

4

チャーリーコリンズは、を使用して完璧な答えをくれました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();
        }
    }
}

4

最近、Vapor APIをリリースしました。これは、jQuery風のAndroidフレームワークで、このようなあらゆる種類のタスクをより簡単にします。前述のように、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あなたが切り替える他の端でそれらを取得するには。

いくつかに興味があることを願っています:)


@BaneeIshaqueK申し訳ありませんが、しばらくこれを維持していません。役立つ場合に備えて、プロジェクトのGithubを直接指すようにリンクを更新しました。ps。そのライセンスについて私が何を考えていたかわからない...謝罪
ダリウス

4

最初のアクティビティ:

Intent intent = new Intent(getApplicationContext(), ClassName.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

2番目のアクティビティ:

String str= getIntent().getStringExtra("Variable name which you sent as an extra");

4

アプリケーションのアクティビティ間で3つの方法でデータを渡すことができます

  1. 意図
  2. SharedPreferences
  3. 応用

インテントでデータを渡すには、いくつかの制限があります。大量のデータの場合、アプリケーションレベルのデータ共有を使用でき、SharedPreferenceに保存することでアプリのサイズが大きくなります


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()

オーバーライドするアプリケーション-これはWhomeの回答の
Murmel '22
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.