У меня есть сценарий, в котором после входа в систему через страницу логина на каждой активности
будет находиться кнопка выхода
.
При нажатии на выход
, я буду передавать session id
вошедшего пользователя для выхода. Может ли кто-нибудь подсказать мне, как сделать так, чтобы session id
был доступен для всех активностей
?
Любая альтернатива для этого случая
В вашей текущей деятельности, создать новую "намерения":
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
}
Использовать эту технику для передачи переменных от одной деятельности к другой.
Самый простой способ сделать это - передать идентификатор сеанса активности выхода из системы в Intent
, который вы используете для запуска активности:
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);
Получить доступ к этому намерению в следующем действии:
String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");
В docs для намерений есть больше информации (посмотрите раздел под названием "Extras").
Передача Intent extras - хороший подход, как отметил Эрих.
Однако объект Application - это другой способ, и он иногда проще, когда приходится иметь дело с одним и тем же состоянием в нескольких действиях (в отличие от необходимости получать/вставлять его везде), или с объектами более сложными, чем примитивы и строки.
Вы можете расширить Application, а затем установить/получить там все, что вам нужно, и получить доступ к нему из любой Activity (в том же приложении) с помощью getApplication().
Также не забывайте, что другие подходы, которые вы можете увидеть, например, статику, могут быть проблематичными, потому что они могут привести к утечкам памяти. Приложение помогает решить и эту проблему.
Класс источника:
Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)
Класса (класс NewActivity):
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");
}
Вы просто должны отправить дополнительно при вызове вашего намерения.
Как это:
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);
Теперь на метод
метод SecondActivity ваш", " вы можете принести такой массовки.
Если значение, которое вы отправили в "длинные":
long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));
Если значение, которое вы отправили в строку
:
String value = getIntent().getStringExtra("Variable name which you sent as an extra");
Если значение, которое вы послали был логическое
:
Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);
Обновлено обратите внимание, что я упомянул использование SharedPreference. Она имеет простой API и доступен через приложение'ы деятельность. Но это неповоротливое решение, и представляет собой угрозу безопасности, если вы проходите вокруг конфиденциальные данные. Это'ы лучше использовать намерения. Он имеет обширный список перегруженных методов, которые можно использовать для лучшей передачи различных типов данных между мероприятиями. Посмотрите на намерениях.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, ...));
...
Затем вы можете создать намерение для мероприятия и обеспечить вас есть все параметры. Вы можете адаптировать для фрагментов. Простой пример выше, но вы получаете идею.
Это помогает мне видеть вещи в контексте. Вот два примера.
Передача Данных #Вперед
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);
}
}
мы ()
, чтобы получить намерение
, что началось второе действие. Затем вы можете извлечь данные с 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);
}
}
Передача Данных #Обратно
метод onActivityResult
. Это называется, когда второе действие заканчивается. Вы можете убедиться в том, что это фактически второе действие проверка кода результата. (Это полезно, когда вы начинаете нескольких различных видов деятельности из той же основной вид деятельности.)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);
}
}
}
}
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();
}
}
Постарайтесь сделать следующее:
Создайте простой класс "helper" (фабрику для ваших интентов), например, так:
import android.content.Intent;
public class IntentHelper {
public static final Intent createYourSpecialIntent(Intent src) {
return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
}
}
Это будет фабрика для всех ваших интентов. Каждый раз, когда вам нужен новый интент, создавайте статический метод фабрики в IntentHelper. Для создания нового интента вам нужно просто сказать это следующим образом:
IntentHelper.createYourSpecialIntent(getIntent());
В вашей активности. Когда вы хотите "сохранить" некоторые данные в "сессии", просто используйте следующее:
IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);
И отправьте это намерение. В целевой активности ваше поле будет доступно как:
getIntent().getStringExtra("YOUR_FIELD_NAME");
Таким образом, теперь мы можем использовать Intent как старую сессию (как в сервлетах или JSP).
Вы также можете передать пользовательские объекты класса делает parcelable класса. Лучший способ, чтобы сделать это parcelable-это написать свой класс, а затем просто вставить его на сайт, как 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");
Теперь вы можете просто использовать фу объект, как вы бы использовали.
Другой способ-использовать статическое поле, в котором вы храните данные, т. е.:
public class MyActivity extends Activity {
public static String SharedString;
public static SomeObject SharedObject;
//...
Самый удобный способ для передачи данных между деятельностью является передача намерений. В первом задании, из которого вы хотите отправить данные, вы должны добавить код,
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;
Затем в следующей деятельности(SecondActivity), вы должны получить данные из умысла, используя следующий код.
String name = this.getIntent().getStringExtra("name");
Вы можете использовать SharedPreferences`...
SharedPreferences предпочтения = getSharedPreferences (на"сессии",getApplicationContext().MODE_PRIVATE); Редактор редактор = предпочтения.редактировать(); редактор.putString (на"сеанса" и, сеанса); редактор.коммит();
SharedPreferences предпочтения = getSharedPreferences (на"сессии", getApplicationContext().MODE_PRIVATE); Строка sessionId = предпочтения.метода getString (на"сеанса" но, значение null);
Если вы Don'т иметь идентификатор сеанса, затем удалить sharedpreferences:
SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();
Это очень полезно, потому что один раз, когда вы сохраняете значение, а затем извлекать любой деятельности.
Стандартный подход.
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”);
Деятельности
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");
}
Вы можете передавать данные между видами деятельности через объект intent.
Считаю у вас два вида деятельности, а именно FirstActivity
и SecondActivity
.
Внутри FirstActivity:
Используя Намерениях:
i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)
Внутри SecondActivity
Bundle bundle= getIntent().getExtras();
Теперь вы можете использовать различный набор методов класса, чтобы получить значения, переданные от FirstActivity ключом.
Е. Г.
пакет.метода getString("по ключ", у)
,связка.getDouble("по ключ", у)
,`связка.метода getint("по ключ", У) и т. д.
Если вы хотите передать растровое между мероприятиями/фрагменты
Активность
Чтобы передать растровое между мероприятиями
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");
Переносить Большие Рисунки
Если вы получаете неудачной сделки Биндер, это означает, что вы более буферного связующего сделки по передаче больших элемента с одного вида деятельности на другой вид деятельности.
Так что в этом случае вам придется сжать растровое изображение как байт's в массив, а затем распаковать его в другом действии, как это
В 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);
И в 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);
Вы можете получить его в другом действии. Двумя способами:
int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);
Второй способ:
Intent i = getIntent();
String name = i.getStringExtra("name");
Вот моя лучшая практика, и это помогает много, когда проект огромный и сложный.
Предположим, что у меня есть 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());
}
}
Молодец! Круто :) я просто хочу поделиться своим опытом. Если вы работаете на небольшой проект, это стоило'т быть большой проблемой. Но когда ты работаешь над большим проектом, это действительно боль, когда вы хотите сделать рефакторинг и исправление ошибок.
Фактический процесс передачи данных уже ответили, однако большинство из ответов использовать жестко закодированные строки для имени ключа в намерениях. Обычно это хорошо, когда используется только внутри вашего приложения. Однако документация рекомендует с помощью EXTRA_*` константы для стандартных типов данных.
*Пример 1: Используя Намерение.Ключи 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: ключевые определения собственных статическая финал`
Если одна из намерения.Строки 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: Использование строкового ресурса ключа
Хотя и не упомянутые в документации, этот ответ рекомендует использовать строковый ресурс чтобы избежать зависимостей между деятельностью.
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));
Вы можете использовать намерение
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);
Другим способом может быть использование паттерн Singleton также:
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;
}
}
Из своего FirstActivity
private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);
На SecondActivity
private List<Model> dataList = DataHolder.getInstance().getDataList();