ฉันจะส่งผ่านข้อมูลระหว่างแอพพลิเคชั่นใน Android ได้อย่างไร


1348

ฉันมีสถานการณ์ที่หลังจากเข้าสู่ระบบผ่านหน้าเข้าสู่ระบบจะมีการลงชื่อออกในแต่ละbuttonactivity

เมื่อคลิกsign-outฉันจะส่งต่อsession idผู้ใช้ที่ลงชื่อเข้าใช้เพื่อออกจากระบบ ทุกคนสามารถแนะนำฉันเกี่ยวกับวิธีการให้session idบริการแก่ทุกคนได้activitiesหรือไม่

ทางเลือกใด ๆ กับกรณีนี้


14
ฉันใช้ sharedpreference มีประโยชน์ในการเก็บข้อมูลการเข้าสู่ระบบเกี่ยวกับคุณสมบัติรหัสผ่าน
remeber

มันใช้งานได้สำหรับฉัน stackoverflow.com/a/7325248/2125322 ขอขอบคุณ Darshan Computing
matasoy

stackoverflow.com/a/37774966/6456129อาจเป็นประโยชน์
Yessy

สำหรับกรณีดังกล่าวลองสร้างคลาส commomUtils ด้วย sharedprefereces Method ... ซึ่งจะทำให้โค้ดสะอาดและข้อมูลที่เกี่ยวข้องในที่เดียว และคุณจะสามารถล้างชุดข้อมูลที่เฉพาะเจาะจงได้อย่างง่ายดายด้วยวิธีการเพียงวิธีเดียวในการล้าง
ไฟล์พรีเฟ็

คำตอบ:


1265

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการส่งรหัสเซสชันไปยังกิจกรรมการลงชื่อออกในที่Intentคุณใช้เพื่อเริ่มกิจกรรม:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

เข้าถึงเจตนาที่มีต่อกิจกรรมถัดไป:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

เอกสารสำหรับทุกเจตนามีข้อมูลที่มากขึ้น (ดูที่หัวข้อ "พิเศษ")


ตกลงถ้าฉันส่งรหัสเซสชั่นไปยังการลงทะเบียนระดับความสำเร็จในการเข้าสู่ระบบที่ประสบความสำเร็จและมันจะทำงานในหน้ากิจกรรมใด ๆ ที่จะออกจากระบบหรือด้วยตนเองฉันจะต้องกำหนดค่าในแต่ละกิจกรรม ใช้ขั้นตอนข้างต้นหรือไม่
UMAR

5
ใช่คุณต้องทำให้ ID เซสชันพร้อมใช้งานสำหรับทุกกิจกรรมที่คุณต้องการอนุญาตให้ผู้ใช้ลงชื่อออก หรือคุณสามารถเก็บไว้ในวัตถุแอปพลิเคชัน แต่คุณจะต้องจัดการสถานะของเซสชัน (ตรวจสอบว่ามันถูกต้องก่อนที่จะใช้ ฯลฯ )
Erich Douglass

1
โปรดทราบว่าเอกสารประกอบดังต่อไปนี้: เพิ่มข้อมูลเพิ่มเติมลงในเจตนา ชื่อต้องมีคำนำหน้าแพ็คเกจเช่นแอป com.android.contacts จะใช้ชื่อเช่น "com.android.contacts.ShowAll"
Serguei Fedorov

1
และเพื่ออ่านข้อมูลจากการใช้กิจกรรมอื่น ๆLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
Farid

1
เราจะส่งข้อมูลโดยใช้setDataและอะไรคือความแตกต่างระหว่างสองวิธีนี้? อันไหนดีกว่า?
โฮซินอั

1402

ในกิจกรรมปัจจุบันของคุณสร้างใหม่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
}

ใช้เทคนิคนี้เพื่อส่งผ่านตัวแปรจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่ง


58
เพียงแค่ข้อมูลสำหรับผู้ที่กำลังเพื่อให้คนตาบอดเช่นฉัน: extras.getInt("new_variable_name")ถ้าคุณใส่จำนวนเต็มในกิจกรรมปัจจุบันของคุณคุณจะต้องได้รับในหนึ่งใหม่ผ่าน หากคุณพยายามที่จะรับมันผ่านทางgetString()Android ดูว่า int ได้รับและส่งคืน null
บิส

4
จะเกิดอะไรขึ้นถ้ากิจกรรมกำลังทำงานอยู่จะต้องทำstartActivity(i);อย่างไร ฉันหมายถึงฉันสามารถสร้างกิจกรรม A กิจกรรมการโทรBและส่งคืนข้อมูลไปยังกิจกรรม A ได้หรือไม่ ฉันสับสนหรือเปล่า
Francisco Corrales Morales


ฉันชอบตัวแปรสตริง คุณสามารถแปลงสตริงเป็นจำนวนเต็มหรือลอยได้ในภายหลัง
user914425

140

การผ่านความตั้งใจพิเศษเป็นวิธีการที่ดีตามที่ Erich กล่าว

ประยุกต์ใช้วัตถุเป็นวิธีแม้ว่าอีกและบางครั้งก็เป็นได้ง่ายขึ้นเมื่อต้องรับมือกับรัฐเดียวกันทั่วหลายกิจกรรม (เมื่อเทียบกับที่มีการรับ / วางมันทุกที่) หรือวัตถุที่ซับซ้อนมากขึ้นกว่าพื้นฐานและสตริง

คุณสามารถขยายการประยุกต์ใช้และจากนั้นตั้ง / ได้รับสิ่งที่คุณต้องการและมีการเข้าถึงได้จากกิจกรรมใด ๆ (ในโปรแกรมเดียวกัน) กับgetApplication ()

นอกจากนี้ยังทราบว่าวิธีการอื่น ๆ ที่คุณอาจจะเห็นเหมือนสถิต, อาจเป็นปัญหาได้เพราะพวกเขาสามารถนำไปสู่การรั่วไหลของหน่วยความจำ แอปพลิเคชั่นช่วยแก้ปัญหานี้ด้วย


8
+1 สำหรับปัญหาสถิต การล้างค่าสามารถแก้ไขได้โดยการรวมซิงเกิลตันกับเมธอด onCreate / onTerminate คลาสแอปพลิเคชัน
ซิด

10
เฮ้ฉันรู้ว่ากระทู้นี้ค่อนข้างจะย้อนกลับไปนาน แต่ลิงค์ที่ให้ไว้ตอนนี้กลายเป็นจุดจบ มีที่ไหนฉันสามารถหาตัวอย่างได้หรือไม่?
JuiCe

วิธีการบรรลุสิ่งนี้โดยใช้แอปพลิเคชัน? @CharlieCollins
Banee Ishaque K

นี่คือตัวอย่างที่อัปเดตของที่นี่จากหนังสือที่เก่าแก่มาก :) github.com/charlieCollins/android-in-practice/blob/master/ch07/…
Charlie Collins

@JuiCe โพสต์บล็อกนักพัฒนา Android ในหน่วยความจำรั่วไม่ถูกต้องอีกต่อไป
Edric

94

ชั้นแหล่งที่มา:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

ระดับปลายทาง (ระดับกิจกรรมใหม่):

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

3
ความตั้งใจจะเป็นโมฆะหรือไม่? เราควรตรวจสอบว่ามันไม่เป็นโมฆะ?
Micro


85

คุณเพียงแค่ต้องส่งสิ่งพิเศษในขณะที่เรียกความตั้งใจของคุณ

แบบนี้:

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

3
โปรดทราบว่าเอกสารประกอบดังต่อไปนี้: เพิ่มข้อมูลเพิ่มเติมลงในเจตนา ชื่อต้องมีคำนำหน้าแพ็คเกจเช่นแอป com.android.contacts จะใช้ชื่อเช่น "com.android.contacts.ShowAll"
Serguei Fedorov

นี่คือคำตอบที่ได้รับการโหวตมากที่สุดซ้ำสองปีก่อนหน้านี้และคำตอบของSahil Mahajan Mjซึ่งมีอายุมากกว่า 1 ปี ความแตกต่างเท่านั้น: ตัวอย่างสำหรับbooleanและlonggetters ซึ่งมีมูลค่าความคิดเห็น IMO ไม่คำตอบ
Murmel

48

มันช่วยให้ฉันเห็นสิ่งต่าง ๆ ในบริบท นี่คือสองตัวอย่าง

ส่งต่อข้อมูล

ป้อนคำอธิบายรูปภาพที่นี่

กิจกรรมหลัก

  • ใส่ข้อมูลที่คุณต้องการส่งในเจตนาด้วยคู่ของคีย์ - ค่า ดูคำตอบนี้สำหรับการตั้งชื่อข้อตกลงสำหรับกุญแจ
  • 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เริ่มกิจกรรมที่สอง จากนั้นคุณสามารถแยกข้อมูลด้วย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การให้รหัสผลลัพธ์โดยพลการ
  • แทนที่ onActivityResultเอาชนะกิจกรรมนี้เรียกว่าเมื่อกิจกรรมที่สองเสร็จสิ้น คุณสามารถตรวจสอบให้แน่ใจว่าเป็นกิจกรรมที่สองจริง ๆ โดยการตรวจสอบรหัสผลลัพธ์ (สิ่งนี้มีประโยชน์เมื่อคุณเริ่มกิจกรรมที่หลากหลายจากกิจกรรมหลักเดียวกัน)
  • 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();
    }
}

3
ว้าวขอบคุณ! นี่คือสิ่งที่ฉันกำลังมองหา มันค่อนข้างชัดเจนเมื่อใช้กล้องหรือภายนอกอื่น ๆ ที่ฉันคาดหวังผลลัพธ์ แต่ฉันไม่คิดว่าจะใช้ภายใน คุณเป็นคนแรกที่พูดได้อย่างเปิดเผย
user3195231

45

Updatedหมายเหตุว่าผมได้กล่าวถึงการใช้งานของ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, ...));
...

จากนั้นคุณสามารถสร้างความตั้งใจสำหรับกิจกรรมที่ต้องการและให้แน่ใจว่าคุณมีพารามิเตอร์ทั้งหมด คุณสามารถปรับให้เข้ากับเศษ ตัวอย่างง่ายๆด้านบน แต่คุณเข้าใจแล้ว


2
ฉันชอบคำตอบของคุณดีที่สุด ... ผ่านมันไปด้วยความตั้งใจหมายความว่าเกือบทุกที่ที่ฉันเริ่มกิจกรรมที่คุณจะต้องจำไว้ว่าให้ใส่รหัสประจำตัว ด้วยการวางไว้ใน SharedPreferences คุณสามารถรับได้ทุกที่ทุกเวลา : 0)
bytebender

@bybender ฉันรู้ว่ามันค่อนข้างช้าสำหรับการตอบสนองฉันขอขอบคุณที่คุณชอบคำตอบดั้งเดิมของฉันสำหรับความง่าย แต่ฉันจะระมัดระวังในการจัดเก็บ ID เซสชันในการตั้งค่าที่ใช้ร่วมกัน หากคุณต้องเก็บไว้ในฮาร์ดไดรฟ์ให้ใช้การเข้ารหัส ถ้าคุณสามารถใช้เฟรมเวิร์กการพิสูจน์ตัวตนที่ใช้ JWT มันจะรวม refreshTokens ที่ปลอดภัยสำหรับการจัดเก็บระยะยาวจากนั้นเก็บโทเค็นเซสชันปัจจุบันเป็นคุณสมบัติสาธารณะของวัตถุแอปพลิเคชันที่กำหนดเองเพื่อเข้าถึงโทเค็นการรับรองความถูกต้องได้ง่าย ลายเซ็นเจตนา
angryITguy

38

ลองทำสิ่งต่อไปนี้:

สร้างคลาส "ผู้ช่วยเหลือ" อย่างง่าย (โรงงานสำหรับเจตนาของคุณ) เช่นนี้:

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 เหมือนกับเซสชั่นเก่า (เช่นใน servlets หรือJSP )


28

นอกจากนี้คุณยังสามารถส่งผ่านคลาสวัตถุที่กำหนดเองได้โดยสร้างคลาสที่parcelable วิธีที่ดีที่สุดที่จะทำให้มัน parcelable คือการเขียนชั้นเรียนของคุณแล้วก็วางไปยังเว็บไซต์เช่นhttp://www.parcelabler.com/ คลิกที่บิลด์แล้วคุณจะได้รับรหัสใหม่ คัดลอกทั้งหมดนี้และแทนที่เนื้อหาคลาสต้นฉบับ ณ ขณะนั้น

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

และรับผลลัพธ์ใน NextActivity like-

Foo foo = getIntent().getExtras().getParcelable("foo");

ตอนนี้คุณสามารถใช้ วัตถุfooอย่างที่คุณต้องการได้


23

อีกวิธีหนึ่งคือการใช้ฟิลด์คงที่สาธารณะที่คุณเก็บข้อมูลเช่น:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

5
ฉันสงสัยว่าทำไมข้อเสนอแนะของคุณไม่ได้รับการลงคะแนนมันง่ายและใช้งานได้จริง
Porizm

7
อืม ... นี่ไม่ได้ละเมิดหลักการ OO ใช่ไหม
Christian Vielma

2
@ChristianVielma ดีมันเป็นเหมือนพื้นที่สีเทา ... คุณสามารถทำมันได้หลายวิธีสำหรับฉันดูเหมือนว่าสะอาด "หนี" ดังนั้น ... ขึ้นอยู่กับคุณ (นักพัฒนา) ที่จะตัดสินใจถ้ามัน ใช้งานได้ดีสำหรับคุณหรือไม่ฉันชอบวิธีนี้เพราะมันง่ายกว่าที่จะติดตาม แต่มันอาจสกปรกได้เร็วมาก ...
ComputerSaysNo

2
ทำไมคุณถึงพูดแบบนี้ว่าสกปรก? iOS ทำเช่นนี้เพื่อส่งผ่านข้อมูลระหว่าง viewcontrollers โดยตั้งค่า "คุณสมบัติ" ซึ่งคล้ายกับสิ่งนี้หรือไม่ วิธีนี้ง่ายกว่าการใช้ Intents
Terry Bu

2
ใช่คุณส่งผ่านข้อมูลระหว่างตัวควบคุมมุมมอง แต่ไม่ใช่ด้วยคุณสมบัติแบบคงที่ ปัญหาคือไม่ใช่คุณสมบัติในอินสแตนซ์ของกิจกรรมที่ต้องการ วิธีที่ Android เปิดตัวกิจกรรมผ่าน startActivity () จะไม่สร้างอินสแตนซ์ของวัตถุในทันทีและอนุญาตให้ผู้พัฒนาตั้งค่าตัวแปรอินสแตนซ์ มันค่อนข้างน่ารำคาญ ...
Shawn

20

วิธีที่สะดวกที่สุดในการส่งผ่านข้อมูลระหว่างกิจกรรมคือการผ่านเจตนา ในกิจกรรมแรกที่คุณต้องการส่งข้อมูลคุณควรเพิ่มรหัส

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

2
นี่คือคำตอบที่ซ้ำกันมากที่สุดซึ่งเคยมีมานานกว่า 1 ปี
Murmel

19

คุณสามารถใช้SharedPreferences...

  1. เข้าสู่ระบบ รหัสเซสชันของร้านค้าเวลาSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
  2. ออกจากระบบ. ดึงข้อมูลรหัสเซสชันใน sharedpreferences

    SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
    String sessionId = preferences.getString("sessionId", null);

หากคุณไม่มีรหัสเซสชันที่ต้องการให้ลบการแชร์ล่วงหน้า:

SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();

มีประโยชน์มากเพราะครั้งหนึ่งคุณบันทึกค่าและดึงกิจกรรมใด ๆ


17

วิธีการมาตรฐาน

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

1
ซ้ำตามที่เสนอแล้วโดยPRABEESH RKในปี 2012 และอาจจะลดลงไปi.putExtras()/ getIntent().getString()ซึ่งเป็นที่เสนอโดย 6 คำตอบอื่น ๆ ...
Murmel

17

จากกิจกรรม

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

1
ซ้ำการBundleตามแนวทางที่เสนอแล้วโดยPRABEESH RKในปี 2012 และAjay Venugopal , กฤษณะ และอาจจะลดลงไปi.putExtras()/ getIntent().getString()ซึ่งเป็นที่เสนอโดย 8 คำตอบอื่น ๆ ...
Murmel

11

คุณสามารถส่งข้อมูลระหว่างกิจกรรมโดยใช้วัตถุเจตนา พิจารณาว่าคุณมีสองกิจกรรมคือFirstActivityและSecondActivityและ

ภายในกิจกรรมแรก:

ใช้เจตนา:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

ภายในกิจกรรมที่สอง

Bundle bundle= getIntent().getExtras();

ตอนนี้คุณสามารถใช้วิธีการเรียนรวมกลุ่มที่แตกต่างกันเพื่อรับค่าที่ส่งผ่านจาก FirstActivity by Key

เช่น bundle.getString("key"), bundle.getDouble("key"), bundle.getInt("key")ฯลฯ


1
ซ้ำ: Bundleวิธีการแบบพื้นฐานได้รับการเสนอโดยPRABEESH RKในปี 2012 และAjay Venugopalแล้ว และอาจจะลดลงไปi.putExtras()/ getIntent().getString()ซึ่งเป็นที่เสนอโดย 7 คำตอบอื่น ๆ ...
Murmel

11

หากคุณต้องการถ่ายโอนบิตแมประหว่าง Activites / Fragments


กิจกรรม

เพื่อส่งบิตแมประหว่างกิจกรรม

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

ถ่ายโอนบิตแมปขนาดใหญ่

หากคุณได้รับการทำธุรกรรมเครื่องผูกที่ล้มเหลวนั่นหมายความว่าคุณมีขนาดเกินบัฟเฟอร์การทำธุรกรรมเครื่องผูกโดยการโอนองค์ประกอบขนาดใหญ่จากกิจกรรมหนึ่งไปยังกิจกรรมอื่น

ดังนั้นในกรณีนี้คุณต้องบีบอัดบิตแมปเป็นอาร์เรย์ของไบต์แล้วคลายการบีบอัดในกิจกรรมอื่นเช่นนี้

ในกิจกรรมแรก

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

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

วิธีที่สองคือ:

Intent i = getIntent();
String name = i.getStringExtra("name");


8

นี่คือวิธีปฏิบัติที่ดีที่สุดของฉันและช่วยได้มากเมื่อโครงการมีขนาดใหญ่และซับซ้อน

สมมติว่าผมมี 2 กิจกรรมและLoginActivity HomeActivityฉันต้องการที่จะผ่าน 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());
    }
}

ทำ! เจ๋ง :) ฉันแค่อยากจะแบ่งปันประสบการณ์ของฉัน หากคุณทำงานในโครงการขนาดเล็กสิ่งนี้ไม่ควรเป็นปัญหาใหญ่ แต่เมื่อคุณทำงานในโครงการขนาดใหญ่มันเจ็บปวดจริง ๆ เมื่อคุณต้องการ refactoring หรือแก้ไขข้อบกพร่อง


7

คำตอบเพิ่มเติม: แบบแผนการตั้งชื่อสำหรับ Key String

กระบวนการที่แท้จริงของการส่งผ่านข้อมูลได้รับการตอบแล้วอย่างไรก็ตามคำตอบส่วนใหญ่ใช้สตริงที่เข้ารหัสอย่างหนักสำหรับชื่อคีย์ใน 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_*เงื่อนไขไม่ตรงกับความต้องการของคุณคุณสามารถกำหนดของคุณเองที่จุดเริ่มต้นของกิจกรรมแรก

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

7

คุณสามารถใช้ได้ 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;
 }
}

จากกิจกรรมแรกของคุณ

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

ในกิจกรรมที่สอง

private List<Model> dataList = DataHolder.getInstance().getDataList();


6

การส่งผ่านข้อมูลระหว่างกิจกรรมนั้นส่วนใหญ่จะกระทำโดยเจตนาของวัตถุ

ก่อนอื่นคุณต้องแนบข้อมูลไปยังวัตถุเจตนาด้วยการใช้Bundleคลาส แล้วโทรกิจกรรมโดยใช้อย่างใดอย่างหนึ่งstartActivity()หรือstartActivityForResult()วิธีการ

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ด้วยตัวอย่างจากบล็อกโพสต์ที่ผ่านข้อมูลไปยังกิจกรรม


สิ่งนี้จะมากหรือน้อยเหมือนกับการใช้วิธีการที่Intent ให้ไว้โดยตรง ( Intent#putExtra()) แต่เพิ่มสิ่งอื่นBundleและทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้น
Murmel

6

คุณสามารถลองใช้การตั้งค่าร่วมกันมันอาจเป็นทางเลือกที่ดีสำหรับการแชร์ข้อมูลระหว่างกิจกรรม

วิธีบันทึกรหัสเซสชัน -

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

ซ้ำ: วิธีการนี้ได้รับการจัดทำโดยRavi Parsaniaในปี 2014
Murmel

5

เริ่มกิจกรรมอื่นจากกิจกรรมนี้ผ่านพารามิเตอร์ผ่านทาง Bundle Object

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...
}

คุณสามารถใช้ Gson lib ที่จัดทำโดย google เพื่อจัดทำข้อมูลที่ซับซ้อนเช่นนี้

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

5

Kotlin

ผ่านจากกิจกรรมแรก

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

รับในกิจกรรมที่สอง

val value = getIntent().getStringExtra("key")

ข้อเสนอแนะ

วางกุญแจไว้ในไฟล์คงที่เสมอเพื่อการจัดการที่มากขึ้น

companion object {
    val KEY = "key"
}

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

4

ชาร์ลีคอลลินให้ผมที่สมบูรณ์แบบคำตอบ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();
        }
    }
}

4

ฉันเพิ่งเปิดตัวVapor APIซึ่งเป็นเฟรมเวิร์ก Android ที่มีรสชาติ jQuery ที่ทำให้งานทุกประเภทเช่นนี้ง่ายขึ้น ดังกล่าวSharedPreferencesเป็นวิธีหนึ่งที่คุณสามารถทำได้

VaporSharedPreferencesมีการใช้งานเป็น Singleton เพื่อให้เป็นหนึ่งในตัวเลือกและใน 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คุณสลับไปที่

หวังว่าจะเป็นที่สนใจของบางคน :)


@BaneeIshaqueK อ๋อขออภัยยังไม่ได้ดูแลมันซักพัก อัปเดตลิงก์ให้ชี้ไปที่ Github โดยตรงสำหรับโครงการในกรณีที่ช่วยได้ PS ไม่แน่ใจว่าฉันคิดอย่างไรกับใบอนุญาตนั้น ... ขอโทษด้วย
Darius

4

กิจกรรมแรก:

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

4

คุณสามารถส่งผ่านข้อมูลระหว่างกิจกรรมในแอปพลิเคชันได้ 3 วิธี

  1. เจตนา
  2. SharedPreferences
  3. ใบสมัคร

การส่งข้อมูลโดยเจตนามีขีด จำกัด สำหรับข้อมูลจำนวนมากคุณสามารถใช้การแชร์ข้อมูลระดับแอปพลิเคชันและเก็บไว้ใน SharedPreference ทำให้ขนาดแอปของคุณเพิ่มขึ้น


3

ใช้คลาสระดับโลก:

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

คุณสามารถเรียก setters และ getters ของคลาสนี้จากคลาสอื่นทั้งหมด คุณต้องสร้าง GlobalClass-Object ในทุกกิจกรรม:

GlobalClass gc = (GlobalClass) getApplication();

จากนั้นคุณสามารถเรียกตัวอย่าง:

gc.getVitaminA()

แอปพลิเคชั่นที่ทับซ้อนกัน - นี่เป็นคำซ้ำซ้อนของคำตอบของ
Whome
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.