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

現在在SecondActivityOnCreate方法中,您可以像這樣獲取額外的內容。

如果您發送的值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 ...

  1. 日誌記錄。 在SharedPreferences存儲會話ID

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

這非常有用,因為您一次保存該值,然後檢索任何活動。


您可以使用意向對像在活動之間發送數據。 考慮你有兩個活動,即FirstActivitySecondActivity

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個活動, LoginActivityHomeActivity 。 我想將2個參數(用戶名和密碼)從LoginActivityHomeActivity

首先,我創建了我的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));
    }
}






android-activity