android - getintextra 引数




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

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

ログアウトをクリックすると、 sign-outたユーザーのsession idを渡してsession idします。 session idをすべてのactivities利用できるようにする方法については、誰でも私を案内できますか?

この場合の代替案


補足解説:キーストリングの命名規則

データを渡す実際のプロセスはすでに回答済みですが、ほとんどの回答はIntentのキー名にハードコードされた文字列を使用します。 これは通常、アプリ内でのみ使用されると問題ありません。 ただし、標準化されたデータ型にはEXTRA_*定数を使用すること推奨しています。

例1: Intent.EXTRA_*キーを使用する

最初のアクティビティ

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

第二の活動:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

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

Intent.EXTRA_*文字Intent.EXTRA_* 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);

第二の活動:

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

Charlie Collinsは、 Application.classを使って私に完全なanswerを与えました。 私はそれを簡単にサブクラス化できることに気づいていませんでした。 ここでは、カスタムアプリケーションクラスを使用した簡単な例を示します。

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

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

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


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

その後、意図したアクティビティのインテントを作成し、すべてのパラメータを確認することができます。 あなたは、フラグメントに適応することができます。 上記の単純な例ですが、あなたはそのアイディアを得ています。


ビットマップをアクティビティ/フラグメント間で転送する場合は

アクティビティ

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

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

parcelableクラスを作成して、カスタムクラスオブジェクトを渡すこともできます。 それを分別可能にする最も良い方法は、クラスを作成し、それを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オブジェクトを簡単に使用できます。


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

あなたはSharedPreferencesを使うことができます...

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

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

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


ここに私のベストプラクティスがあり、プロジェクトが巨大で複雑なものになると多くの助けになります。

LoginActivityHomeActivity 2つのアクティビティがあるとしHomeActivityLoginActivityから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データを受け取る方法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());
    }
}

完了! クール:)私は私の経験を共有したいです。 あなたが小さなプロジェクトに取り組んでいるなら、これは大きな問題ではありません。 しかし、大きなプロジェクトに取り組んでいるときには、リファクタリングやバグの修正をしたいときには本当に苦労します。


このアクティビティから別のアクティビティを開始するには、Bundle Objectを使用してパラメータを渡します。

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

これを試して:

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

それは文脈の中で物事を見るのに役立ちます。 ここに2つの例があります。

データの受け渡し

主な活動

  • 送信したいデータをキーと値のペアを持つインテントに入れます。 キーの命名規則については、 この回答を参照してください。
  • startActivityを使用して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);
    }
}

第二の活動

  • getIntent()を使用して、2番目のアクティビティを開始したIntentを取得します。 次に、 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オーバーライドonActivityResultます。 これは、Second Activityが終了したときに呼び出されます。 結果コードをチェックすることで、実際には第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);
            }
        }
    }
}

第二の活動

  • 以前のアクティビティに送り返したいデータをIntentます。 データは、キーと値のペアを使用してIntent格納されます。 私は自分のキーにIntent.EXTRA_TEXTを使用することを選択しました。
  • 結果をRESULT_OK設定し、データを保持するインテントを追加します。
  • finish()を呼び出してセカンドアクティビティを終了します。

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

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

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

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


共有設定を試すことができます。これは、アクティビティ間でデータを共有するための良い方法です

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

別の方法は、データを格納するpublic staticフィールドを使用することです。

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

次の操作を実行してください。

次のように、簡単な "ヘルパー"クラス(Intentのファクトリ)を作成します。

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作成します:

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
}

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


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

VaporSharedPreferencesはシングルトンとして実装されているため、これはVapor APIでは.put(...)なオーバーロードされた.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あなたの他端でそれらを取得するには、に切り替える。

希望は、いくつかの興味がある:)


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




android-activity