ログインページからログインした後button
、それぞれにサインアウトするシナリオがありますactivity
。
をクリックするとsign-out
、session id
サインインしているユーザーのがサインアウトに渡されます。誰でもsession id
利用できるようにする方法について誰かが私を案内できますactivities
か?
このケースの代替案
ログインページからログインした後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");
インテントのドキュメントに詳細情報があります(「その他」というタイトルのセクションをご覧ください)。
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
してデータを渡すことができますか、これら2つのアプローチの違いは何ですか?どっちがいいですか?
現在のアクティビティで、新しいを作成します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
}
この手法を使用して、あるアクティビティから別のアクティビティに変数を渡します。
extras.getInt("new_variable_name")
。あなたがgetString()
アンドロイドを介してそれを取得しようとすると、intが与えられてnullを返すことがわかります!
startActivity(i);
ますか?私は私が作ることができ、意味の活動Aのコール・アクティビティ・Bを、およびにそのデータを戻す活動A?私は混乱していますか?
Erichが指摘したように、Intentエキストラを渡すことは良いアプローチです。
アプリケーションオブジェクトは、しかし、別の方法であり、それは(/取得どこでもそれを置くためにするものではなく)複数のアクティビティ間で同じ状態を扱うときに、時には簡単です、またはプリミティブと文字列よりも複雑なオブジェクト。
Applicationを拡張し、そこに必要なものを設定/取得し、getApplication()を使用して(同じアプリケーション内の)アクティビティからアクセスできます。
また、静的など、メモリリークが発生する可能性があるため、他のアプローチが問題となる可能性があることにも注意してください。アプリケーションもこれを解決するのに役立ちます。
ソースクラス:
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);
boolean
とlong
ではなく、コメントIMOに値するゲッターの例。回答ではありません。
状況を把握するのに役立ちます。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()
して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);
}
}
}
}
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();
}
}
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, ...));
...
次に、目的のアクティビティのインテントを作成し、すべてのパラメーターがあることを確認できます。フラグメントに適応できます。上記の簡単な例ですが、あなたはアイデアを理解しています。
次のことを試してください。
次のような単純な「ヘルパー」クラス(インテントのファクトリー)を作成します。
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を使用できるようになりました。
パーセル可能なクラスを作成して、カスタムクラスオブジェクトを渡すこともできます。パーセル化するための最良の方法は、クラスを記述して、それを単に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
...
ロギング。タイムストアセッションIDSharedPreferences
SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("sessionId", sessionId);
editor.commit();
サインアウト。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();
一度値を保存してから、どこでもアクティビティを取得できるので、非常に便利です。
標準的なアプローチ。
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”);
i.putExtras()
/に削減できgetIntent().getString()
ます...
アクティビティから
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");
}
Bundle
ベースのアプローチは、2012年にPRABEESH RKおよびAjay Venugopal、クリシュナによってすでに提案されました。そして、他の8つの回答で提案されているi.putExtras()
/に削減することができますgetIntent().getString()
...
インテントオブジェクトを使用して、アクティビティ間でデータを送信できます。との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")
など
Bundle
ベースのアプローチは、2012年にPRABEESH RKおよびAjay Venugopalによってすでに提案されました。そして、他の7つの回答によって提案されたi.putExtras()
/に削減できますgetIntent().getString()
...
アクティビティ/フラグメント間でビットマップを転送したい場合
アクティビティ
アクティビティ間でビットマップを渡すには
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);
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");
これが私のベストプラクティスであり、プロジェクトが巨大で複雑な場合に役立ちます。
2つのアクティビティがあるLoginActivity
としHomeActivity
ます。私はから2つのパラメータ(ユーザー名とパスワード)を渡したいLoginActivity
のHomeActivity
。
まず、自分の 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 = 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));
使用できます 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
クラスを使用してデータをインテントオブジェクトにアタッチする必要があります。次に、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 = 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);
/*
* 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));
}
}
チャーリーコリンズは、を使用して完璧な答えをくれました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();
}
}
}
最近、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
あなたが切り替える他の端でそれらを取得するには。
いくつかに興味があることを願っています:)
最初のアクティビティ:
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");
アプリケーションのアクティビティ間で3つの方法でデータを渡すことができます
インテントでデータを渡すには、いくつかの制限があります。大量のデータの場合、アプリケーションレベルのデータ共有を使用でき、SharedPreferenceに保存することでアプリのサイズが大きくなります
グローバルクラスを使用します。
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()