Как передать данные между действиями в приложении Android? - PullRequest
1239 голосов
/ 19 января 2010

У меня есть сценарий, в котором после входа на страницу входа будет выход button на каждом activity.

При нажатии sign-out я буду передаватьsession id зарегистрированного пользователя для выхода.Кто-нибудь может подсказать мне, как сделать session id доступным для всех activities?

Любая альтернатива этому делу

Ответы [ 52 ]

19 голосов
/ 27 августа 2012

Самый удобный способ передачи данных между действиями - передача намерений. В первом упражнении, из которого вы хотите отправить данные, вы должны добавить код

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");
18 голосов
/ 21 октября 2014

Вы можете использовать SharedPreferences ...

  1. Logging. ID сеанса хранения времени в SharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
    
  2. SignOut. Время получения идентификатора сеанса в общих настройках

    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 голосов
/ 28 января 2015

Стандартный подход.

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”); 
15 голосов
/ 23 июня 2016

Из мероприятия

 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");
  }
11 голосов
/ 18 декабря 2015

Вы можете отправлять данные между действиями, используя объект намерения. Предположим, у вас есть два действия, а именно FirstActivity и SecondActivity.

Inside FirstActivity:

Использование намерения:

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

Inside SecondActivity

Bundle bundle= getIntent().getExtras();

Теперь вы можете использовать различные методы класса комплектов для получения значений, переданных из FirstActivity по Key.

например. bundle.getString("key"), bundle.getDouble("key"), bundle.getInt("key") и т. Д.

10 голосов
/ 22 января 2016

Если вы хотите перенести растровое изображение между Активами / Фрагментами


Активность

Для передачи растрового изображения между Activites

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

И в классе Activity

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

Фрагмент

Для передачи растрового изображения между фрагментами

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

Кполучать внутри SecondFragment

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

Передача больших растровых изображений

Если вы получаете сбойную операцию связывания, это означает, чтоВы превышаете буфер транзакции связывания, переводя большой элемент из одного действия в другое.

Таким образом, в этом случае вам нужно сжать растровое изображение как массив байтов, а затем распаковать его в другоеактивность , вот так

В FirstActivity

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

И во SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
8 голосов
/ 18 июня 2014
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");
7 голосов
/ 08 августа 2016

Вот моя лучшая практика, и она очень помогает, когда проект огромен и сложен.

Предположим, у меня есть 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());
    }
}

Готово! Круто :) Я просто хочу поделиться своим опытом. Если вы работаете над небольшим проектом, это не должно быть большой проблемой. Но когда вы работаете над большим проектом, вам действительно больно, когда вы хотите выполнить рефакторинг или исправление ошибок.

6 голосов
/ 13 ноября 2016

Дополнительный ответ: Соглашения об именах для ключевой строки

Фактический процесс передачи данных уже получен, однако в большинстве ответов используются жестко закодированные строки для имени ключа в намерении.Это обычно хорошо, когда используется только в вашем приложении.Однако в документации рекомендуется с использованием констант 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

Хотя это не упоминается в документации, этот ответ рекомендует использовать ресурс 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));
6 голосов
/ 28 ноября 2016

Вы можете использовать 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);

On SecondActivity

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