Como passar dados de uma Activity para outra?
sobes.tech IA
Resposta da IA
Formas de transferência de dados:
-
Extras de Intent: A forma mais comum. Os dados em pares chave-valor são adicionados ao
Intent.// Na Activity que envia Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("key_string", "Olá!"); intent.putExtra("key_int", 42); intent.putExtra("key_boolean", true); startActivity(intent);// Na Activity que recebe Bundle extras = getIntent().getExtras(); if (extras != null) { String stringData = extras.getString("key_string"); int intData = extras.getInt("key_int"); boolean booleanData = extras.getBoolean("key_boolean", false); // Com valor padrão }Tipos suportados: primitivos,
String,Bundle,Parcelable,Serializable. Para objetos complexos, prefiraParcelable. -
ViewModel (com LiveData ou Channel): Adequado para cenários mais complexos, onde os dados devem ser preservados durante rotações de tela ou utilizados por múltiplos componentes. A transmissão de dados pode ser implementada via
MutableLiveDataouChannel.// No ViewModel compartilhado (por exemplo, compartilhado entre uma Activity e fragments) private val _data = MutableLiveData<MyData>() val data: LiveData<MyData> = _data fun setData(newData: MyData) { _data.value = newData }// Na Activity/Fragment que envia viewModel.setData(MyData(...))// Na Activity/Fragment que observa o ViewModel viewModel.data.observe(viewLifecycleOwner) { data -> // Usar os dados } -
Callback / Interface (ao iniciar uma Activity para resultado): Usado quando a Activity receptora deve retornar um resultado à que a iniciou.
// Na Activity que envia ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null && data.getExtras() != null) { String resultData = data.getExtras().getString("result_key"); } } }); // Iniciar a Activity para resultado Intent intent = new Intent(this, TargetActivity.class); someActivityResultLauncher.launch(intent);// Na Activity receptora Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "Resultado"); setResult(Activity.RESULT_OK, resultIntent); finish(); -
Base de dados local / Shared Preferences / Internal Storage: Para transferir grandes volumes de dados ou dados que devem ser preservados. Os dados são gravados em armazenamento em uma Activity e lidos em outra.
// Gravação (exemplo com Shared Preferences) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString("saved_data", "Dados salvos"); editor.apply();// Leitura (exemplo com Shared Preferences) SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE); String savedData = sharedPref.getString("saved_data", null);Essa abordagem requer lógica adicional para gerenciar o ciclo de vida dos dados (quando apagá-los).
-
Singleton / Objeto estático global: Não recomendado devido a potenciais problemas de vazamentos de memória e violação da arquitetura. Use apenas em casos extremos e muito simples.
// Classe singleton public class DataHolder { private static final DataHolder instance = new DataHolder(); private String data; private DataHolder() {} public static DataHolder getInstance() { return instance; } public String getData() { return data; } public void setData(String data) { this.data = data; } }// Na Activity que envia DataHolder.getInstance().setData("Dados via singleton");// Na Activity que recebe String data = DataHolder.getInstance().getData();
A escolha do método depende do volume de dados, sua complexidade, necessidade de persistência e interação requerida entre Activities. Os métodos mais comuns e recomendados são Extras de Intent e ViewModel.