ログインページからログインした後、各button
にサインアウトするactivity
があるというシナリオがあります。
sign-out
をクリックすると、サインインしたユーザーのsession id
をサインアウトに渡します。誰もがsession id
をすべてのactivities
に利用可能にしておく方法について私を導くことができますか?
この場合に代わるもの
これを行う最も簡単な方法は、アクティビティを開始するために使用している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 にはより多くの情報があります( "補足"というタイトルのセクションを見てください)。
現在のアクティビティで、新しい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
}
このテクニックを使用して、一方のアクティビティから他方のアクティビティに変数を渡します。
Erichが述べたように、 Intent extraを渡すことは良いアプローチです。
ただし、 Application オブジェクトは別の方法です。複数のアクティビティにまたがって同じ状態を処理する場合(どこにでも取得/配置する必要があるのとは対照的)、プリミティブやStringより複雑なオブジェクトもあります。
Applicationを拡張し、そこに必要なものを設定/取得し、 getApplication() を使用して(同じアプリケーション内の)任意のActivityからアクセスできます。
あなたが見るかもしれない他のアプローチ、例えば静電気が メモリリークにつながる可能性がある なので問題があるかもしれないことも覚えておいてください。アプリケーションもこれを解決するのに役立ちます。
ソースクラス
Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)
宛先クラス(NewActivityクラス):
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
Intent intent = getIntent();
String fName = intent.getStringExtra("firstName");
String lName = intent.getStringExtra("lastName");
}
あなたの意図を呼んでいる間あなたはただ余分な物を送らなければならない。
このような:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
これであなたのOnCreate
のSecondActivity
メソッドで、あなたはこのようなエクストラを取得することができます。
送信した値がlong
にある場合 :
long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));
あなたが送った値がString
だった場合 :
String value = getIntent().getStringExtra("Variable name which you sent as an extra");
あなたが送った値がBoolean
だった場合 :
Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
更新 私は SharedPreference の使用について述べたことに注意してください。それは簡単なAPIを持ち、アプリケーションの活動を通してアクセス可能です。しかし、これはぎこちない解決策であり、機密データを迂回するとセキュリティ上のリスクになります。インテントを使用するのが最善です。アクティビティ間でさまざまなデータ型をより適切に転送するために使用できる、オーバーロードされたメソッドの広範なリストがあります。 intent.putExtra を見てください。この 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, ...));
...
それからあなたは意図した活動の意図を作成し、あなたがすべてのパラメータを持っていることを確認することができます。あなたはにフラグメントに適応することができます。上の簡単な例ですが、あなたはアイデアを得ます。
それは私が状況の中で物事を見るのを助けます。これが2つの例です。
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);
}
}
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);
}
}
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();
}
}
次のことを試してください。
次のように、単純な「ヘルパー」クラス(インテント用のファクトリ)を作成します。
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を使用できます。
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 オブジェクトを使用したのと同じように使用できます。
もう1つの方法は、データを格納するためのパブリック静的フィールドを使用することです。
public class MyActivity extends Activity {
public static String SharedString;
public static SomeObject SharedObject;
//...
アクティビティ間でデータを受け渡す最も便利な方法は、意図を渡すことです。データを送信したい場所からの最初のアクティビティでは、コードを追加する必要があります。
String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);
また輸入するべきです
import Android.content.Intent;
次のAcitvity(SecondActivity)では、次のコードを使用してインテントからデータを取得する必要があります。
String name = this.getIntent().getStringExtra("name");
SharedPreferences
...を使うことができます.
ロギングタイムストアセッションID(SharedPreferences
)
SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("sessionId", sessionId);
editor.commit();
サインアウト。共有設定でのタイムフェッチセッション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();
一度値を保存してからどこかのアクティビティを取得するため、これは非常に便利です。
標準的なアプローチ.
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”);
活動から
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");
}
インテントオブジェクトを使用してアクティビティ間でデータを送信できます。 FirstActivity
とSecondActivity
の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")
など.
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);
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");
これが私のベストプラクティスであり、プロジェクトが巨大で複雑な場合に非常に役立ちます。
LoginActivity
とHomeActivity
の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());
}
}
完了しました。クール:)私は自分の経験を共有したいと思います。あなたが小さなプロジェクトに取り組んでいるなら、これは大きな問題ではないはずです。しかし、あなたが大きなプロジェクトに取り組んでいるとき、それはあなたがリファクタリングやバグ修正をしたいときには本当に苦痛です。
データを渡す実際のプロセスはすでに回答されていますが、ほとんどの回答はインテント内のキー名にハードコーディングされた文字列を使用します。アプリ内でのみ使用する場合、これは通常問題ありません。しかし、 ドキュメンテーションは 標準化されたデータ型のために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));
アクティビティ間のデータの受け渡しは、主にインテントオブジェクトによって行われます。
最初にBundle
クラスを使用してデータをインテントオブジェクトに添付する必要があります。その後、startActivity()
メソッドまたはstartActivityForResult()
メソッドを使用してアクティビティを呼び出します。
ブログ記事アクティビティへのデータの受け渡しの例を見てください。
あなたは共有設定を試すことができます、それは活動間でデータを共有するための良い代替手段かもしれません
セッション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);
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();
このアクティビティパスパラメータから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);
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();
}
}
}
/*
* If you are from transferring data from one class that doesn't
* extend Activity, then you need to do something like this.
*/
public class abc {
Context context;
public abc(Context context) {
this.context = context;
}
public void something() {
context.startactivity(new Intent(context, anyone.class).putextra("key", value));
}
}
私はクラスで静的フィールドを使い、それらを取得/設定します。
好きです:
public class Info
{
public static int ID = 0;
public static String NAME = "TEST";
}
値を取得するには、アクティビティでこれを使用します。
Info.ID
Info.NAME
値を設定する場合
Info.ID = 5;
Info.NAME = "USER!";
最初のアクティビティからのパス
val intent = Intent(this, SecondActivity::class.Java)
intent.putExtra("key", "value")
startActivity(intent)
セカンドアクティビティに入る
val value = getIntent().getStringExtra("key")
提案
より管理しやすい方法で、常にキーを定数ファイルに入れてください。
companion object {
val KEY = "key"
}
これを試して:
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");
最初の活動:
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");
私は最近 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
の反対側でそれらを取得するには、に切り替えます。
それがある人にとって興味があることを願っています:)
あなたは意図を通して二つの活動の間でコミュニケーションをとることができます。あなたがあなたのログインアクティビティを通して他のアクティビティにナビゲートしているときはいつでも、あなたはあなたの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を保存し、必要に応じてそれから取得することをお勧めします。
グローバルクラスを使う:
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()
あなたは3つの方法でアプリケーション内のアクティビティ間でデータを渡すことができます1.Intent 2.SharedPreferences 3.Application
意図的なデータの受け渡しにはある程度の制限があります。大量のデータを使用するには、アプリケーションレベルのデータ共有を使用し、sharedprefに保存することでアプリのサイズが大きくなります。
データオブジェクトはParcelableまたはSerializableクラスを拡張する必要があります
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
あなたが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")
}
Javaでこれを行うには:
startActivity(new Intent(this, MainActivity.class).putExtra("userId", "2"));
インテントクラスを使用して、アクティビティ間でデータを送信できます。それは基本的にあなたがデータフローのソースと宛先を記述している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);
すべてのアクティビティでセッションIDを使用するには、次の手順に従います。
1 - アプリケーションのAPPLICATIONファイルに1つのSTATIC VARIABLEセッション(session idの値を保持します)を定義します。
2 - セッションID値を取得しているクラス参照を使用してセッション変数を呼び出し、それを静的変数に割り当てます。
3 - これで、静的変数を呼び出すだけで、このセッションID値をどこでも使用できます。
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");
}
コールバックを使用したアクティビティー間の新規およびリアルタイムの対話
public interface SharedCallback {
public String getSharedText(/*you can define arguments here*/);
}
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;
}
}
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";
}
}
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();
}
}
セッション情報をすべてのアクティビティにアクセスできるようにするためにシングルトンを使用することを検討してください。
この方法には、追加機能や静的変数と比べていくつかの利点があります。
簡単な使用法 - すべての活動で特別なものを入手する必要はありません。
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;
}
}
アクティビティ間でデータをやり取りする方法は複数あります。 ドキュメンテーション にはその多くがあります。
ほとんどの場合、Intent.putExtrasで十分です。
第一の方法: - あなたが現在のアクティビティで、あなたが新しいスクリーンを開くという目的のオブジェクトを作成するとき:
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クラスを使用して、直列化を使用してクラス間でデータを渡すこともできます。
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);
//問題は、ログイン後にセッションIDを保存し、ログアウトするアクティビティごとにそのセッションIDを利用できるようにすることです。
//あなたの問題を解決するには、ログインに成功したらセッションIDをパブリック変数に保存しなければなりません。また、ログアウトのためにセッションIDが必要なときはいつでもその変数にアクセスし、変数の値をゼロに置き換えることができます。
//Serializable class
public class YourClass implements Serializable {
public long session_id = 0;
}
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.Java
内onCreate()
キー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");
}
}
Intent intent = new Intent(getBaseContext(), SomeActivity.class);
intent.putExtra("USER_ID", UserId);
startActivity(intent);
On SomeActivity :
String userId= getIntent().getStringExtra("("USER_ID");
意図を持って作業できます
String sessionId = "my session id";
startActivity(new Intent(getApplicationContext(),SignOutActivity.class).putExtra("sessionId",sessionId));
セッションIDをすべてのアクティビティに渡す最も簡単な方法の1つです。
Intent mIntent = new Intent(getApplicationContext(), LogoutActivity.class);
mIntent.putExtra("session_id", session_id);
startActivity(mIntent);
そのため、LogoutActivityから session_id を取得できます。これは、Sign OUT操作にさらに使用されます。
これが役立つことを願っています...ありがとう
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
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");
パブリックスタティックフィールドを使用してアクティビティ間で共有データを格納しますが、その副作用を最小限に抑えるために、次のようにします。