Bagaimana saya meneruskan data antara Kegiatan di aplikasi Android?

Saya memiliki sebuah skenario di mana, setelah login melalui halaman login, akan ada tanda-out tombol di masing-masing kegiatan.

Dengan mengklik keluar, aku akan melewati id sesi yang ditandatangani pada pengguna untuk sign-out. Yang bisa membimbing saya tentang cara untuk menjaga session id, tersedia untuk semua kegiatan?

Alternatif lain untuk kasus ini

Mengomentari pertanyaan (5)

Dalam Aktivitas anda saat ini, membuat Niat:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

Kemudian dalam Aktivitas baru, mengambil nilai-nilai tersebut:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

Menggunakan teknik ini untuk lulus variabel dari satu aktivitas ke Aktivitas yang lain.

Komentar (5)
Larutan

Cara termudah untuk melakukan hal ini akan lulus session id untuk signout kegiatan di Niat anda're menggunakan untuk memulai kegiatan:

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

Akses yang berniat aktivitas berikutnya:

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

The docs untuk Maksud yang memiliki informasi lebih lanjut (lihat bagian yang berjudul "Ekstra").

Komentar (12)

Lewat Maksud tambahan adalah pendekatan yang baik sebagai Erich mencatat.

Aplikasi objek adalah cara lain meskipun, dan kadang-kadang lebih mudah ketika berhadapan dengan keadaan yang sama di beberapa kegiatan (sebagai lawan untuk memiliki untuk mendapatkan/taruh di mana-mana), atau benda-benda yang lebih kompleks dari yang primitif dan String.

Anda dapat memperpanjang Aplikasi, dan kemudian mengatur/mendapatkan apapun yang anda inginkan ada dan akses dari setiap Kegiatan (dalam aplikasi yang sama) dengan getApplication().

Juga perlu diingat bahwa pendekatan-pendekatan lain yang mungkin anda lihat, seperti statika, dapat menjadi masalah karena mereka dapat menyebabkan kebocoran memori. Aplikasi ini membantu memecahkan masalah ini juga.

Komentar (6)

Sumber kelas:

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

Tujuan Kelas (NewActivity kelas):

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

Anda hanya perlu mengirim tambahan sambil menelepon anda maksud.

Seperti ini:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

Sekarang di OnCreate metode anda SecondActivity anda dapat mengambil ekstra seperti ini.

Jika nilai yang anda dikirim dalam lama:

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

Jika nilai yang dikirim adalah String:

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

Jika nilai yang dikirim adalah Boolean:

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
Komentar (2)

Updated Catatan yang telah saya sebutkan penggunaan SharedPreference. Ia memiliki API sederhana dan dapat diakses di aplikasi's kegiatan. Tapi ini adalah kikuk solusi, dan risiko keamanan jika anda melewati seluruh data sensitif. It's terbaik untuk menggunakan intent. Ini memiliki daftar ekstensif kelebihan beban metode yang dapat digunakan baik untuk transfer berbagai jenis data yang berbeda antara kegiatan. Silahkan lihat di maksud.putExtra. Ini link menyajikan penggunaan putExtra cukup baik.

Dalam menyampaikan data antar kegiatan, saya pendekatan yang lebih disukai adalah untuk menciptakan sebuah metode statis untuk aktivitas yang relevan yang mencakup parameter-parameter yang dibutuhkan peluncuran maksud. Yang kemudian memberikan kemudahan setup dan mengambil parameter. Sehingga dapat terlihat seperti ini

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

Kemudian anda dapat membuat sebuah maksud untuk tujuan kegiatan dan memastikan anda memiliki semua parameter. Anda dapat beradaptasi untuk fragmen. Contoh sederhana di atas, tetapi anda mendapatkan ide.

Komentar (2)

Ini membantu saya untuk melihat hal-hal dalam konteks. Berikut ini adalah dua contoh.

Melewati Data Ke Depan

Aktivitas Utama

  • Masukan data yang ingin anda kirim di Maksud dengan pasangan key-value. Lihat jawaban untuk konvensi penamaan untuk kunci.
  • Memulai Aktivitas Kedua dengan 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);
    }
}

Kedua Kegiatan

  • Anda menggunakan getIntent() untuk mendapatkan Maksud yang memulai aktivitas kedua. Kemudian anda dapat mengekstrak data dengan getExtras() dan tombol yang anda tetapkan pada kegiatan pertama. Karena data kami adalah sebuah String, kita hanya akan menggunakan getStringExtra di sini.

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

Lewat Data Kembali

Aktivitas Utama

  • Memulai Aktivitas Kedua dengan startActivityForResult, menyediakan sewenang-wenang kode hasil.
  • Override onActivityResult. Ini disebut ketika Kedua Kegiatan selesai. Anda dapat memastikan bahwa itu adalah benar-benar Kegiatan yang Kedua dengan memeriksa kode hasil. (Hal ini berguna ketika anda memulai beberapa kegiatan yang berbeda dari kegiatan utama.)
  • Ekstrak data yang anda dapatkan dari return Niat. Data diekstrak menggunakan pasangan kunci-nilai. Saya bisa menggunakan string untuk kunci tapi aku'll menggunakan standar Niat.EXTRA_TEXT sejak saya'm mengirimkan teks.

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

Kedua Kegiatan

  • Masukan data yang ingin anda kirim kembali ke aktivitas sebelumnya menjadi Niat. Data disimpan dalam Niat menggunakan pasangan kunci-nilai. Saya memilih untuk menggunakan Niat.EXTRA_TEXT untuk saya kunci.
  • Menetapkan hasil untuk RESULT_OK dan tambahkan maksud memegang data anda.
  • Panggilan finish() untuk menutup Aktivitas Kedua.

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();
    }
}
Komentar (1)

Cobalah untuk melakukan hal-hal berikut:

Membuat sederhana "pembantu" kelas (pabrik untuk anda Maksud), seperti ini:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Ini akan menjadi pabrik untuk semua Maksud anda. Setiap kali anda perlu Intent baru, membuat statis metode pabrik di IntentHelper. Untuk membuat Intent baru, anda hanya harus mengatakan seperti ini:

IntentHelper.createYourSpecialIntent(getIntent());

Dalam aktivitas anda. Bila anda ingin "simpan" beberapa data dalam "sesi" hanya digunakan sebagai berikut:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

Dan mengirim Maksud ini. Dalam sasaran Kegiatan bidang anda akan tersedia seperti:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Jadi sekarang kita dapat menggunakan Intent suka sama sesi (seperti di servlet atau JSP]1).

Komentar (0)

Anda juga dapat melewati kelas kustom objek dengan membuat parcelable kelas. Cara terbaik untuk membuat itu parcelable adalah untuk menulis kelas anda dan kemudian hanya paste ke situs seperti http://www.parcelabler.com/. Klik pada membangun dan anda akan mendapatkan kode baru. Copy semua ini dan mengganti isi kelas. Kemudian-

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

dan dapatkan hasilnya di NextActivity suka-

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

Sekarang anda hanya dapat menggunakan foo objek seperti anda akan digunakan.

Komentar (0)

Cara lain adalah dengan menggunakan public static bidang di mana anda menyimpan data, yaitu:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...
Komentar (8)

Cara yang paling nyaman untuk meneruskan data antara kegiatan ini dengan melewati maksud. Dalam kegiatan pertama dari mana anda ingin mengirim data, anda harus menambahkan kode,

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

Anda juga harus impor

import android.content.Intent;

Kemudian di depan Acitvity(SecondActivity), anda harus mengambil data dari intent menggunakan kode berikut.

String name = this.getIntent().getStringExtra("name");
Komentar (1)

Anda dapat menggunakan SharedPreferences...

  1. Logging. Waktu menyimpan session id di SharedPreferences

SharedPreferences preferensi = getSharedPreferences("sesi",getApplicationContext().MODE_PRIVATE); Editor editor = preferensi.edit(); editor.putString("sessionId", sessionId); editor.commit();

  1. Signout. Waktu mengambil session id dalam sharedpreferences

SharedPreferences preferensi = getSharedPreferences("sesi", getApplicationContext().MODE_PRIVATE); String sessionId = preferensi.getString("sessionId", null);

Jika anda don't memiliki id sesi, kemudian menghapus sharedpreferences:

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

Yang sangat berguna, karena suatu saat anda menyimpan nilai dan kemudian mengambil mana saja dari aktivitas.

Komentar (0)

Pendekatan standar.

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

Sekarang kedua kegiatan mengambil data anda dari bundel:

Dapatkan bundel

Bundle bundle = getIntent().getExtras();

Ekstrak data...

String stuff = bundle.getString(“stuff”); 
Komentar (1)

Dari Aktivitas

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

Aktivitas

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }
Komentar (1)

Anda dapat mengirim data antara kegiatan dengan menggunakan intent objek. Anggap anda memiliki dua kegiatan yaitu FirstActivity dan SecondActivity.

Dalam FirstActivity:

Menggunakan Intent:

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

Dalam SecondActivity

Bundle bundle= getIntent().getExtras();

Sekarang anda dapat menggunakan berbagai bundel kelas metode untuk mendapatkan nilai-nilai yang diwariskan dari FirstActivity oleh Kunci.

E. g. bundel.getString("kunci"),bundel.getDouble("kunci") ,bundel.getInt("kunci") dll.

Komentar (1)

Jika anda ingin tranfer bitmap antara Kegiatan/Fragmen


Aktivitas

Untuk lulus bitmap antara Kegiatan

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

Dan dalam Kegiatan kelas

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

Fragmen

Untuk lulus bitmap antara Fragmen

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

Untuk menerima dalam SecondFragment

Bitmap bitmap = getArguments().getParcelable("bitmap");

Transfer Besar Bitmap

Jika anda mendapatkan gagal pengikat transaksi, ini berarti anda melebihi pengikat penyangga transaksi dengan mentransfer elemen besar dari satu kegiatan ke kegiatan lain.

Jadi dalam hal ini anda harus kompres bitmap sebagai byte's array dan kemudian membukanya di lain kegiatan, seperti ini

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

Dan di SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Komentar (0)
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

Anda dapat mengambilnya di kegiatan lain. Dua cara:

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

Cara kedua adalah:

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

Di sini saya praktek terbaik dan itu banyak membantu ketika proyek besar dan kompleks.

Misalkan saya punya 2 kegiatan, LoginActivity dan HomeActivity. Saya ingin lulus 2 parameter (username & password) dari LoginActivity untuk HomeActivity.

Pertama, saya membuat 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);
    }
}

Berikut adalah bagaimana saya lulus data di saya 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);

    }
}

Langkah terakhir, di sini adalah bagaimana saya menerima data dalam 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());
    }
}

Selesai! Keren :) aku hanya ingin berbagi pengalaman saya. Jika anda bekerja pada proyek kecil ini seharusnya't menjadi masalah besar. Tetapi ketika anda bekerja pada proyek besar, itu benar-benar sakit ketika anda ingin melakukan refactoring atau memperbaiki bug.

Komentar (0)

Tambahan Jawaban: Konvensi Penamaan untuk Kunci String

Sebenarnya proses lewat data sudah dijawab, namun sebagian besar jawaban menggunakan kode keras string untuk nama kunci yang di Maksud. Hal ini biasanya baik bila digunakan hanya dalam aplikasi anda. Namun, dokumentasi merekomendasikan menggunakan EXTRA_* konstanta untuk standar tipe data.

*Contoh 1: Menggunakan `Niat.EXTRA_` kunci**

Kegiatan pertama

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

Kedua kegiatan:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

Contoh 2: Mendefinisikan sendiri static final kunci

Jika salah satu dari Niat.EXTRA_* String tidak sesuai dengan kebutuhan anda, anda dapat menentukan sendiri pada awal kegiatan pertama.

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

Termasuk nama paket adalah konvensi jika anda hanya menggunakan tombol dalam aplikasi anda sendiri. Tapi itu adalah suatu keharusan untuk menghindari konflik penamaan jika anda membuat beberapa jenis layanan yang aplikasi lain dapat memanggil dengan suatu Maksud.

Kegiatan pertama:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

Kedua kegiatan:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

Contoh 3: Menggunakan String sumber daya kunci

Meskipun tidak disebutkan dalam dokumentasi, jawaban merekomendasikan menggunakan String sumber daya untuk menghindari ketergantungan antar kegiatan.

strings.xml

 com.myPackageName.MY_NAME

Kegiatan pertama

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

Kedua aktivitas

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));
Komentar (0)

Anda dapat menggunakan Niat

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

Cara lain bisa menggunakan singleton pattern juga:

public class DataHolder {

 private static DataHolder dataHolder;
 private List dataList;

 public void setDataList(ListdataList) {
    this.dataList = dataList;
 }

 public List getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

Dari FirstActivity

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

Pada SecondActivity

private List dataList = DataHolder.getInstance().getDataList();
Komentar (1)