web-dev-qa-db-ja.com

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

ログインページからログインした後、各buttonにサインアウトするactivityがあるというシナリオがあります。

sign-outをクリックすると、サインインしたユーザーのsession idをサインアウトに渡します。誰もがsession idをすべてのactivitiesに利用可能にしておく方法について私を導くことができますか?

この場合に代わるもの

1210
UMAR

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

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

次の活動を意図しているアクセス

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

Intentsの docs にはより多くの情報があります( "補足"というタイトルのセクションを見てください)。

1129
Erich Douglass

現在のアクティビティで、新しいIntentを作成します。

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

それから新しいActivityで、それらの値を取得します。

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

このテクニックを使用して、一方のアクティビティから他方のアクティビティに変数を渡します。

1364
user914425

Erichが述べたように、 Intent extraを渡すことは良いアプローチです。

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

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

あなたが見るかもしれない他のアプローチ、例えば静電気が メモリリークにつながる可能性がある なので問題があるかもしれないことも覚えておいてください。アプリケーションもこれを解決するのに役立ちます。

134
Charlie Collins

ソースクラス

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");
}
90
Md. Rahman

あなたの意図を呼んでいる間あなたはただ余分な物を送らなければならない。

このような:

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

これであなたのOnCreateSecondActivityメソッドで、あなたはこのようなエクストラを取得することができます。

送信した値が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);
81
Mayank Saini

更新 私は SharedPreference の使用について述べたことに注意してください。それは簡単なAPIを持ち、アプリケーションの活動を通してアクセス可能です。しかし、これはぎこちない解決策であり、機密データを迂回するとセキュリティ上のリスクになります。インテントを使用するのが最善です。アクティビティ間でさまざまなデータ型をより適切に転送するために使用できる、オーバーロードされたメソッドの広範なリストがあります。 intent.putExtra を見てください。この link は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, ...));
...

それからあなたは意図した活動の意図を作成し、あなたがすべてのパラメータを持っていることを確認することができます。あなたはにフラグメントに適応することができます。上の簡単な例ですが、あなたはアイデアを得ます。

43
angryITguy

それは私が状況の中で物事を見るのを助けます。これが2つの例です。

データを転送する

enter image description here

主な活動

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

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番目のアクティビティを開始したIntentを取得するには、getIntent()を使用します。その後、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);
    }
}

データを渡す

enter image description here

主な活動

  • 任意の結果コードを指定して、startActivityForResultでSecond Activityを開始します。
  • onActivityResultをオーバーライドします。これは、セカンドアクティビティが終了したときに呼び出されます。結果コードを確認して、それが実際にSecond Activityであることを確認できます。 (これは、同じメインアクティビティから複数の異なるアクティビティを開始しているときに役立ちます。)
  • 戻り値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);
            }
        }
    }
}

セカンドアクティビティ

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

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();
    }
}
39
Suragch

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

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

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

そしてこのIntentを送ってください。ターゲットアクティビティでは、あなたのフィールドは以下のように利用可能になります。

getIntent().getStringExtra("YOUR_FIELD_NAME");

そのため、今度は同じ古いセッションのように(サーブレットや _ jsp _ のように)Intentを使用できます。

37
ponkin

parcelable classを作ることでカスタムクラスオブジェクトを渡すこともできます。それを解析可能にする最良の方法はあなたのクラスを書いてからそれを 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 オブジェクトを使用したのと同じように使用できます。

26
Vaibhav Sharma

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

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
22
ComputerSaysNo

アクティビティ間でデータを受け渡す最も便利な方法は、意図を渡すことです。データを送信したい場所からの最初のアクティビティでは、コードを追加する必要があります。

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

SharedPreferences...を使うことができます.

  1. ロギングタイムストアセッションID(SharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    
  2. サインアウト。共有設定でのタイムフェッチセッション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();

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

18
Ravi Parsania

標準的なアプローチ.

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”); 
17
Ajay Venugopal

活動から

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

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

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")など.

11
Krishna

Activites/Fragments間でビットマップを転送したい場合


活動

Activites間でビットマップを渡すには

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

アクティビティクラスでは

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);
10
capt.swag
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
Dilavar M

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

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

まず、私は自分の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
THANN Phearum

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

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

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

セカンドアクティビティ

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

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

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

ブログ記事アクティビティへのデータの受け渡しの例を見てください。

6
PRABEESH R K

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

セッション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);
6
Rohit Gurjar

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();
5
Sachin

このアクティビティパスパラメータからBundleオブジェクトを介して別のアクティビティを開始します。

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
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
DroidNinja

Charlie Collinsは私に完璧な 答え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

グローバルな "singleton"参照をアプリケーションインスタンスに設定します。

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
Whome
/*
 * 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
Dip Pokhrel

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

好きです:

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

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

Info.ID
Info.NAME

値を設定する場合

Info.ID = 5;
Info.NAME = "USER!";
4
javadaskari

コトリン

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

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

セカンドアクティビティに入る

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

提案

より管理しやすい方法で、常にキーを定数ファイルに入れてください。

companion object {
    val KEY = "key"
}
3
Khemraj

これを試して:

CurrentActivity.Java

Intent intent = new Intent(currentActivity.this, TargetActivity.class);
intent.putExtra("booktype", "favourate");
startActivity(intent);

TargetActivity.Java

Bundle b = getIntent().getExtras();
String typesofbook = b.getString("booktype");
3
MurugananthamS

最初の活動:

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

セカンドアクティビティ:

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

私は最近 Vapor API をリリースしました。これは、jQuery風のAndroidフレームワークで、このようなあらゆる種類のタスクをより簡単にします。前述したように、SharedPreferencesはこれを実行できる1つの方法です。

VaporSharedPreferences はSingletonとして実装されているため、その1つのオプションであり、Vapor APIでは.put(...)メソッドが非常にオーバーロードされているため、コミットするデータ型について明示的に心配する必要はありません。それは流暢でもあるので、あなたは電話をつなぐことができます:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

また、オプションで変更を自動保存し、読み書きプロセスを内部で統一するので、標準のAndroidの場合のように明示的にエディタを取得する必要はありません。

代わりにIntentを使うこともできます。 Vapor APIでは、 VaporIntent に対して連鎖可能なオーバーロードされた.put(...)メソッドを使用することもできます。

$.Intent().put("data", "myData").put("more", 568)...

他の答えで述べたように、それを追加として渡します。あなたはあなたのActivityからエキストラを検索することができます、そしてさらにあなたが VaporActivity を使っているならば、これはあなたのために自動的に行われるので、あなたは使うことができます:

this.extras()

Activityの反対側でそれらを取得するには、に切り替えます。

それがある人にとって興味があることを願っています:)

3
Darius

あなたは意図を通して二つの活動の間でコミュニケーションをとることができます。あなたがあなたのログインアクティビティを通して他のアクティビティにナビゲートしているときはいつでも、あなたはあなたのsessionIdを意図に入れて、getIntent()を通して他のアクティビティでそれを得ることができます。そのためのコードスニペットは次のとおりです。

LoginActivity

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を保存し、必要に応じてそれから取得することをお勧めします。

2

グローバルクラスを使う:

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

このクラスの設定メソッドと取得メソッドは、他のすべてのクラスから呼び出すことができます。そうしてください、あなたはすべてのActitityでGlobalClassオブジェクトを作る必要があります:

GlobalClass gc = (GlobalClass) getApplication();

それからあなたは例えば呼び出すことができます:

gc.getVitaminA()
2
Patricia Beier

あなたは3つの方法でアプリケーション内のアクティビティ間でデータを渡すことができます1.Intent 2.SharedPreferences 3.Application

意図的なデータの受け渡しにはある程度の制限があります。大量のデータを使用するには、アプリケーションレベルのデータ共有を使用し、sharedprefに保存することでアプリのサイズが大きくなります。

2

データオブジェクトはParcelableまたはSerializableクラスを拡張する必要があります

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
1
user5876477

あなたがkotlinを使うならば:

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")
}
1
Ali hasan

Javaでこれを行うには:

startActivity(new Intent(this, MainActivity.class).putExtra("userId", "2"));
1
Mohsinali

インテントクラスを使用して、アクティビティ間でデータを送信できます。それは基本的にあなたがデータフローのソースと宛先を記述しているOSへのメッセージです。 AからBまでの活動のデータと同様。

アクティビティA (ソース):

Intent intent = new Intent(A.this, B.class);

intent.putExtra("KEY","VALUE");

startActivity(intent);

アクティビティB(目的地) - >

Intent intent =getIntent();

String data =intent.getString("KEY");

ここではキー "KEY"のデータを取得するでしょう

より良い使用のために常にキーは単純さのためのクラスに格納されるべきであり、ITはタイプミスのリスクを最小限に抑えるのに役立ちます

このような:

public class Constants{
public static String KEY="KEY"
}

今/ アクティビティA

intent.putExtra(Constants.KEY,"VALUE");

アクティビティB

String data =intent.getString(Constants.KEY);
1
Nitish

すべてのアクティビティでセッションIDを使用するには、次の手順に従います。

1 - アプリケーションのAPPLICATIONファイルに1つのSTATIC VARIABLEセッション(session idの値を保持します)を定義します。

2 - セッションID値を取得しているクラス参照を使用してセッション変数を呼び出し、それを静的変数に割り当てます。

3 - これで、静的変数を呼び出すだけで、このセッションID値をどこでも使用できます。

1
MageNative

Activityを使用して、1つのAnothetActivityからIntentにデータを渡すための最良の方法は、

切り取られたコードを確認してください

ActivityOne.Java

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("key_name_one", "Your Data value here");
myIntent.putExtra("key_name_two", "Your data value here");
startActivity(myIntent)

あなたのSecondActivityについて

SecondActivity.Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String valueOne = intent.getStringExtra("key_name_one");
    String valueTwo = intent.getStringExtra("key_name_two");
}
1
Mehul Solanki

コールバックを使用したアクティビティー間の新規およびリアルタイムの対話

- ステップ01:共有インターフェースを実装する

public interface SharedCallback {
    public String getSharedText(/*you can define arguments here*/);
}

- ステップ02:共有クラスを実装する

final class SharedMethode {
    private static Context mContext;

    private static SharedMethode sharedMethode = new SharedMethode();

    private SharedMethode() {
        super();
    }

    public static SharedMethode getInstance() {
        return sharedMethode;
    }

    public void setContext(Context context) {
        if (mContext != null)
            return;

        mContext = context;
    }

    public boolean contextAssigned() {
        return mContext != null;
    }

    public Context getContext() {
        return mContext;
    }

    public void freeContext() {
        mContext = null;
    }
}

- ステップ03 ::ファーストアクティビティのコードで遊ぶ

public class FirstActivity extends Activity implements SharedCallback {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        // call playMe from here or there
        playMe();
    }

    private void playMe() {
        SharedMethode.getInstance().setContext(this);
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }

    @Override
    public String getSharedText(/*passed arguments*/) {
        return "your result";
    }

}

- ステップ04 :: SecondActivityでゲームを完成させる

public class SecondActivity extends Activity {

    private SharedCallback sharedCallback;

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

        if (SharedMethode.getInstance().contextAssigned()) {
            if (SharedMethode.getInstance().getContext() instanceof SharedCallback)
                sharedCallback = (SharedCallback) SharedMethode.getInstance().getContext();

            // to prevent memory leak
            SharedMethode.freeContext();
        }

        // You can now call your implemented methodes from anywhere at any time
        if (sharedCallback != null)
            Log.d("TAG", "Callback result = " + sharedCallback.getSharedText());

    }

    @Override
    protected void onDestroy() {
        sharedCallback = null;
        super.onDestroy();
    }

}
  • STEP 05 :: SecondAvtivityからいくつかの結果を得るためにバックワードコールバックを実装することもできます(FirstからSecondへ)
1
tdjprog

セッション情報をすべてのアクティビティにアクセスできるようにするためにシングルトンを使用することを検討してください。

この方法には、追加機能や静的変数と比べていくつかの利点があります。

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

アクティビティ間でデータをやり取りする方法は複数あります。 ドキュメンテーション にはその多くがあります。

ほとんどの場合、Intent.putExtrasで十分です。

1

第一の方法: - あなたが現在のアクティビティで、あなたが新しいスクリーンを開くという目的のオブジェクトを作成するとき:

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);    
  intent.putExtra("key", value);
  startActivity(intent);

次に、onCreateメソッドのnextActivityで、前のアクティビティから渡した値を取得します。

  if (getIntent().getExtras() != null) {
      String value = getIntent.getStringExtra("key");
      //The key argument must always match that used send and retrive value from one 
      activity to another.
  }

第二の方法: - あなたはバンドルオブジェクトを作成し、バンドルに値を入れてから、現在の活動からインテントにバンドルオブジェクトを入れることができます。

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);  
  Bundle bundle = new Bundle();
  bundle.putInt("key", value);  
  intent.putExtra("bundle_key", bundle);
  startActivity(intent);

次に、onCreateメソッドのnextActivityで、前のアクティビティから渡した値を取得します。

  if (getIntent().getExtras() != null) {
      Bundle bundle = getIntent().getStringExtra("bundle_key);    
      String value = bundle.getString("key");
      //The key argument must always match that used send and retrive value from one 
      activity to another.
  }

Beanクラスを使用して、直列化を使用してクラス間でデータを渡すこともできます。

0
Rahul Sharma

Destinationアクティビティでは、次のように定義します。

public class DestinationActivity extends AppCompatActivity{

    public static Model model;
    public static void open(final Context ctx, Model model){
          DestinationActivity.model = model;
          ctx.startActivity(new Intent(ctx, DestinationActivity.class))
    }

    public void onCreate(/*Parameters*/){
           //Use model here
           model.getSomething();
    }
}

最初のアクティビティで、次のように2番目のアクティビティを開始します

DestinationActivity.open(this,model);
0
Vincent Mungai

//問題は、ログイン後にセッションIDを保存し、ログアウトするアクティビティごとにそのセッションIDを利用できるようにすることです。

//あなたの問題を解決するには、ログインに成功したらセッションIDをパブリック変数に保存しなければなりません。また、ログアウトのためにセッションIDが必要なときはいつでもその変数にアクセスし、変数の値をゼロに置き換えることができます。

//Serializable class

public class YourClass  implements Serializable {
     public long session_id = 0;
}
0
Haroon Chhipa

CurrentActivity.Java に以下のコードを書く。

Intent i = new Intent(CurrentActivity.this, SignOutActivity.class);
i.putExtra("SESSION_ID",sessionId);
startActivity(i);

SignOutActivity.Java でSessionIdにアクセスする

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_out);
    Intent intent = getIntent();

    // check intent is null or not
    if(intent != null){
        String sessionId = i.getStringExtra("SESSION_ID");
        Log.d("Session_id : " + sessionId);
    }
    else{
        Toast.makeText(SignOutActivity.this, "Intent is null", Toast.LENGTH_SHORT).show();
    }
}

現在のアクティビティ内に新しいIntentを作成します

String myData="Your string/data here";
Intent intent = new Intent(this, SecondActivity.class);    
intent.putExtra("your_key",myData);
startActivity(intent);

SecondActivity.JavaonCreate()キーyour_keyを使ってそれらの値を取得

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

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String myData = extras.getString("your_key");
    }  
}
0
Vipul Prajapati
 Intent intent = new Intent(getBaseContext(), SomeActivity.class);
 intent.putExtra("USER_ID", UserId);
 startActivity(intent);

 On SomeActivity : 

 String userId= getIntent().getStringExtra("("USER_ID");
0
Raviraj Desai

意図を持って作業できます

String sessionId = "my session id";

    startActivity(new Intent(getApplicationContext(),SignOutActivity.class).putExtra("sessionId",sessionId));
0
Richard Kamere

セッションIDをすべてのアクティビティに渡す最も簡単な方法の1つです。

Intent mIntent = new Intent(getApplicationContext(), LogoutActivity.class);
mIntent.putExtra("session_id", session_id);
startActivity(mIntent);

そのため、LogoutActivityから session_id を取得できます。これは、Sign OUT操作にさらに使用されます。

これが役立つことを願っています...ありがとう

0
sahu

2つの方法で値を別のアクティビティに渡すことができます(同じ種類の回答がすでに投稿されていますが、ここで私が意図して試したコードをリダイレクトします)。

1.スルーインテント

  Activity1:
      startActivity(new Intent(getApplicationContext(),Activity2.class).putExtra("title","values"));

InActivity 2:

String recString= getIntent().getStringExtra("title");

2. SharedPreferenceを介して

  Activity1:

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
 // 0 - for private mode
Editor editor = pref.edit();
editor.putString("key_name", "string value"); // Storing string
editor.commit(); // commit changes

Activty2:
   SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 

pref.getString("key_name", null); // getting String
0
MurugananthamS
To access session id in all activities you have to store session id in SharedPreference

Please see below class that i am using for managing sessions, you can also use same.



    import Android.content.Context;
    import Android.content.SharedPreferences;

public class SessionManager {

    public static String KEY_SESSIONID = "session_id";

    public static String PREF_NAME = "AppPref";

    SharedPreferences sharedPreference;
    SharedPreferences.Editor editor;
    Context mContext;

    public SessionManager(Context context) {
        this.mContext = context;

        sharedPreference = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        editor = sharedPreference.edit();
    }


    public String getSessionId() {
        return sharedPreference.getString(KEY_SESSIONID, "");
    }

    public void setSessionID(String id) {
        editor.putString(KEY_SESSIONID, id);
        editor.commit();
        editor.apply();
    }   
}

//Now you can access your session using below methods in every activities.

    SessionManager sm = new SessionManager(MainActivity.this);
sm.getSessionId();



//below line us used to set session id on after success response on login page.

    sm.setSessionID("test");
0
Parth_Darji

パブリックスタティックフィールドを使用してアクティビティ間で共有データを格納しますが、その副作用を最小限に抑えるために、次のようにします。

  • 1つのみのフィールドを作成するか、可能な限り少なくして、それらを再利用し、それらをオブジェクト型にして、それを受け取り側のアクティビティで目的のタイプにキャストします。
  • それらのどれもがもう役に立たなくなったときはいつでも、次の代入の前に、それを明示的にnullに設定してガベージコレクタによって収集されます。
0
Mohamed Selim