intent - android studio傳送資料
如何在Android應用程序中的活動之間傳遞數據? (20)
我有一個場景,在通過登錄頁面登錄後,每個activity
都會有一個註銷button
。
在點擊退出時,我會傳遞登錄用戶的session id
以註銷。 任何人都可以指導我如何保持session id
可用於所有activities
?
任何替代這種情況
補充答案:密鑰字符串的命名約定
傳遞數據的實際過程已經得到解答,但大多數答案使用硬編碼的字符串作為意圖中的密鑰名稱。 這通常只適用於您的應用程序。 但是, 文檔建議將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_*
字符串不適合您的需求,您可以在第一個活動的開始時定義您自己的。
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);
第二項活動:
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();
}
}
}
如果你想在Activites / Fragments之間傳送位圖
活動
在Activites之間傳遞位圖
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);
並在第二活動
byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
從活動
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");
}
If you use kotlin:
In MainActivity1:
var intent=Intent(this,MainActivity2::class.java)
intent.putExtra("EXTRA_SESSION_ID",sessionId)
startActivity(intent)
In MainActivity2:
if (intent.hasExtra("EXTRA_SESSION_ID")){
var name:String=intent.extras.getString("sessionId")
}
There are multiple ways to pass data between activities, and the documentation has many of them.
For most cases, Intent.putExtras is enough.
You can use Intent
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
Another way you can use singleton pattern also:
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;
}
}
From your FirstActivity
private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);
On SecondActivity
private List<Model> dataList = DataHolder.getInstance().getDataList();
你只需在發送你的意圖的同時發送額外信息。
喜歡這個:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
現在在SecondActivity
的OnCreate
方法中,您可以像這樣獲取額外的內容。
如果您發送的值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);
另一種方法是使用存儲數據的公共靜態字段,即:
public class MyActivity extends Activity {
public static String SharedString;
public static SomeObject SharedObject;
//...
嘗試執行以下操作:
創建一個簡單的“助手”類(工廠為您的意圖),如下所示:
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");
所以現在我們可以像使用相同的舊會話一樣使用Intent(就像在servlet或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
}
使用這種技術將變量從一個Activity傳遞到另一個。
在活動之間傳遞數據最方便的方式是傳遞意圖。 在您想要發送數據的第一個活動中,您應該添加代碼,
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
...
日誌記錄。 在
SharedPreferences
存儲會話IDSharedPreferences 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();
這非常有用,因為您一次保存該值,然後檢索任何活動。
您可以使用意向對像在活動之間發送數據。 考慮你有兩個活動,即FirstActivity
和SecondActivity
。
FirstActivity內部:
使用意圖:
i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)
SecondActivity內部
Bundle bundle= getIntent().getExtras();
現在您可以使用不同的bundle類方法來獲取通過Key從FirstActivity傳遞的值。
例如, bundle.getString("key")
, bundle.getDouble("key")
, bundle.getInt("key")
等
您還可以通過創建可分類的類來傳遞自定義類對象。 最好的方法是讓你的課程寫出來,然後把它粘貼到像http://www.parcelabler.com/這樣的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對象,就像您使用過的一樣。
我在一個類中使用靜態字段,並獲取/設置它們:
喜歡:
public class Info
{
public static int ID = 0;
public static String NAME = "TEST";
}
為了獲得一個值,在一個活動中使用它:
Info.ID
Info.NAME
設置一個值:
Info.ID = 5;
Info.NAME = "USER!";
最簡單的方法是將會話ID傳遞給用於啟動活動的Intent
的註銷活動:
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);
訪問意圖下一個活動
String s = getIntent().getStringExtra("EXTRA_SESSION_ID");
Intents的docs包含更多信息(請參閱標題為“Extras”的部分)。
標準方法。
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);
現在在第二個活動中從包中檢索數據:
獲得捆綁
Bundle bundle = getIntent().getExtras();
提取數據...
String stuff = bundle.getString(“stuff”);
這是我的最佳實踐,當項目龐大而復雜時,它會有很大的幫助。
假設我有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());
}
}
完成! 酷:)我只是想分享我的經驗。 如果你在小項目上工作,這不應該是大問題。 但是當你在大項目上工作時,當你想重構或修復錯誤時,真的很痛苦。
/*
* 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));
}
}