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

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

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

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

Ответы [ 52 ]

1 голос
/ 19 мая 2017

Для использования идентификатора сеанса во всех действиях вы можете выполнить следующие шаги.

1 - Определите один сеанс STATIC VARIABLE (который будет содержать значение идентификатора сеанса) в файле APPLICATION вашего приложения.

2-Теперь вызовите переменную сеанса со ссылкой на класс, по которой вы выбираете значение идентификатора сеанса, и назначьте его статической переменной.

3-Теперь вы можете использовать это значение идентификатора сеанса в любом месте, просто вызвав статическую переменную с помощью

1 голос
/ 12 января 2019

Новое взаимодействие в реальном времени между активами с использованием обратных вызовов:

- ШАГ 01: Реализация общего интерфейса

public interface SharedCallback {
    public String getSharedText(/*you can define arguments here*/);
}

- ШАГ 02: реализовать общий класс

final class SharedMethode {
    private static Context mContext;

    private static SharedMethode sharedMethode = new SharedMethode();

    private SharedMethode() {
        super();
    }

    public static SharedMethode getInstance() {
        return sharedMethode;
    }

    public void setContext(Context context) {
        if (mContext != null)
            return;

        mContext = context;
    }

    public boolean contextAssigned() {
        return mContext != null;
    }

    public Context getContext() {
        return mContext;
    }

    public void freeContext() {
        mContext = null;
    }
}

- ШАГ 03 :: Играть с кодом в первом занятии

public class FirstActivity extends Activity implements SharedCallback {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        // call playMe from here or there
        playMe();
    }

    private void playMe() {
        SharedMethode.getInstance().setContext(this);
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }

    @Override
    public String getSharedText(/*passed arguments*/) {
        return "your result";
    }

}

- ШАГ 04 :: Завершить игру в SecondActivity

public class SecondActivity extends Activity {

    private SharedCallback sharedCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        if (SharedMethode.getInstance().contextAssigned()) {
            if (SharedMethode.getInstance().getContext() instanceof SharedCallback)
                sharedCallback = (SharedCallback) SharedMethode.getInstance().getContext();

            // to prevent memory leak
            SharedMethode.freeContext();
        }

        // You can now call your implemented methodes from anywhere at any time
        if (sharedCallback != null)
            Log.d("TAG", "Callback result = " + sharedCallback.getSharedText());

    }

    @Override
    protected void onDestroy() {
        sharedCallback = null;
        super.onDestroy();
    }

}
  • ШАГ 05 :: Вы также можете реализовать обратный вызов обратного слова (от первого до второго), чтобы получить некоторые результаты из SecondAvtivity или вызвать некоторые методы
1 голос
/ 29 марта 2019

1-й способ: - В вашей текущей деятельности, когда вы создаете объект намерения открыть новый экран:

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);    
  intent.putExtra("key", value);
  startActivity(intent);

Затем в методе nextActivity в методе onCreate извлеките те значения, которые вы передали из предыдущей операции:

  if (getIntent().getExtras() != null) {
      String value = getIntent.getStringExtra("key");
      //The key argument must always match that used send and retrive value from one 
      activity to another.
  }

2-й способ: - Вы можете создать объект пакета и поместить значения в пакет, а затем поместить объект пакета в намерение из вашей текущей деятельности: -

  String value="xyz";
  Intent intent = new Intent(CurrentActivity.this, NextActivity.class);  
  Bundle bundle = new Bundle();
  bundle.putInt("key", value);  
  intent.putExtra("bundle_key", bundle);
  startActivity(intent);

Затем в nextActivity вМетод onCreate, извлекает те значения, которые вы передаете из предыдущего действия:

  if (getIntent().getExtras() != null) {
      Bundle bundle = getIntent().getStringExtra("bundle_key);    
      String value = bundle.getString("key");
      //The key argument must always match that used send and retrive value from one 
      activity to another.
  }

Вы также можете использовать класс bean для передачи данных между классами, используя сериализацию.

1 голос
/ 30 августа 2018

Вы можете использовать класс намерений для отправки данных между операциями.Это в основном сообщение для ОС, где вы описываете источник и назначение потока данных.Подобно данным от действия A до B.

В ДЕЯТЕЛЬНОСТЬ A (источник):

Intent intent = new Intent(A.this, B.class);

intent.putExtra("KEY","VALUE");

startActivity(intent);

В действии B (место назначения) ->

Intent intent =getIntent();

String data =intent.getString("KEY");

Здесь вы получите данные для ключа «КЛЮЧ»

ДЛЯ ЛУЧШЕГО ИСПОЛЬЗОВАНИЯ ВСЕГДА КЛЮЧИ ДОЛЖНЫ ХРАНИТЬСЯ В КЛАССЕ ДЛЯ ПРОСТОТА, И ЭТО ПОМОЖЕТ В МИНИМАЛЬНОМ РИСКЕ ОШИБОК ПЕЧАТИ

Вот так:

public class Constants{
public static String KEY="KEY"
}

Сейчас в ДЕЯТЕЛЬНОСТЬ A :

intent.putExtra(Constants.KEY,"VALUE");

В Деятельность B :

String data =intent.getString(Constants.KEY);
0 голосов
/ 31 мая 2019
 Intent intent = new Intent(getBaseContext(), SomeActivity.class);
 intent.putExtra("USER_ID", UserId);
 startActivity(intent);

 On SomeActivity : 

 String userId= getIntent().getStringExtra("("USER_ID");
0 голосов
/ 29 мая 2019
To access session id in all activities you have to store session id in SharedPreference

Please see below class that i am using for managing sessions, you can also use same.



    import android.content.Context;
    import android.content.SharedPreferences;

public class SessionManager {

    public static String KEY_SESSIONID = "session_id";

    public static String PREF_NAME = "AppPref";

    SharedPreferences sharedPreference;
    SharedPreferences.Editor editor;
    Context mContext;

    public SessionManager(Context context) {
        this.mContext = context;

        sharedPreference = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        editor = sharedPreference.edit();
    }


    public String getSessionId() {
        return sharedPreference.getString(KEY_SESSIONID, "");
    }

    public void setSessionID(String id) {
        editor.putString(KEY_SESSIONID, id);
        editor.commit();
        editor.apply();
    }   
}

//Now you can access your session using below methods in every activities.

    SessionManager sm = new SessionManager(MainActivity.this);
sm.getSessionId();



//below line us used to set session id on after success response on login page.

    sm.setSessionID("test");
0 голосов
/ 26 июня 2015

Это один из простейших способов для передачи идентификатора сеанса всем действиям .

Intent mIntent = new Intent(getApplicationContext(), LogoutActivity.class);
mIntent.putExtra("session_id", session_id);
startActivity(mIntent);

Таким образом, из LogoutActivity вы можете получить session_id , и это будет в дальнейшем использоваться для операции Sign OUT.

Надеюсь, это будет полезно ... спасибо

0 голосов
/ 08 апреля 2019

Мы можем передать значения в другое задание двумя способами (такой же тип ответа уже опубликован, но здесь я опубликовал код для восстановления, который пытался выполнить намерение)

1. Через намерение

  Activity1:
      startActivity(new Intent(getApplicationContext(),Activity2.class).putExtra("title","values"));

InActivity 2:

String recString= getIntent().getStringExtra("title");

2. Через SharedPreference

  Activity1:

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
 // 0 - for private mode
Editor editor = pref.edit();
editor.putString("key_name", "string value"); // Storing string
editor.commit(); // commit changes

Activty2:
   SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); 

pref.getString("key_name", null); // getting String
0 голосов
/ 14 ноября 2015

Я использую открытые статические поля для хранения общих данных между действиями, но чтобы минимизировать их побочные эффекты, вы можете:

  • Создайте только одно поле или как можно меньше, и используйте их повторно, сделайте из них объект типа и приведите его к нужному типу в операции получения.
  • Если какой-либо из них больше не нужен, перед следующим назначением установите для него значение null, которое будет собираться сборщиком мусора.
0 голосов
/ 26 апреля 2016

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

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

//Serializable class

public class YourClass  implements Serializable {
     public long session_id = 0;
}
...