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
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.
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").
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.
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");
}
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);
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.
Ini membantu saya untuk melihat hal-hal dalam konteks. Berikut ini adalah dua contoh.
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()
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);
}
}
startActivityForResult
, menyediakan sewenang-wenang kode hasil.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.)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);
}
}
}
}
Niat
. Data disimpan dalam Niat
menggunakan pasangan kunci-nilai. Saya memilih untuk menggunakan Niat.EXTRA_TEXT
untuk saya kunci.RESULT_OK
dan tambahkan maksud memegang data anda.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();
}
}
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).
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.
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");
Anda dapat menggunakan SharedPreferences
...
SharedPreferences
SharedPreferences preferensi = getSharedPreferences("sesi",getApplicationContext().MODE_PRIVATE); Editor editor = preferensi.edit(); editor.putString("sessionId", sessionId); editor.commit();
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.
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”);
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");
}
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.
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);
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");
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.
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
<string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>
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));
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<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;
}
}
Dari FirstActivity
private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);
Pada SecondActivity
private List<Model> dataList = DataHolder.getInstance().getDataList();