Como obtenho dados extras da intenção no Android?

750

Como posso enviar dados de uma atividade (intenção) para outra?

Eu uso esse código para enviar dados:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
Adham
fonte
82
Nota lateral de Java: nunca é uma boa ideia "stringificar" um número inteiro como esse (especialmente para fins de exemplo) e, infelizmente, é frequentemente considerada uma maneira rápida e boa de converter int para string em java:, user.getUserAccountId()+""pois isso criaria objetos desnecessários para ser coletado. Considere usar String.valueOf(user.getUserAccountId)ouInteger.toString(user.getUserAccountId) vez disso.
pkk
5
@ Andrew S Esta não é a web? Este é o resultado do número um para "obter dados de intenção"
McGuile
@ Andrews Eu concordo com McGuile. Além disso, esta pergunta foi publicada há um tempo, portanto a resposta provavelmente não era tão fácil de encontrar naquela época. E se uma pergunta semelhante ainda não havia sido postada no SO, era uma postagem válida.
0xCursor

Respostas:

1212

Primeiro, obtenha a intenção que iniciou sua atividade usando o getIntent()método:

Intent intent = getIntent();

Se seus dados extras estiverem representados como strings, você poderá usar intent.getStringExtra(String name) método No seu caso:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
Malcolm
fonte
6
de onde eu posso todo esse método?
Adham
46
@adham: Se você estiver em uma atividade, de dentro onCreate, você chamar getIntent().getStringExtra("id");para obter a string id
ccheneson
1
Você pode obter a intenção que iniciou sua atividade chamando o getIntent()método Eu atualizei a resposta.
Malcolm
1
@ Etat Se você tiver um problema com uma biblioteca específica, crie uma pergunta separada sobre isso.
Malcolm
1
@MelColm, qual é a diferença entre getExtra (). GetString e getStringExtra ()?
Amit Tripathi
188

Na atividade de recebimento

Bundle extras = getIntent().getExtras(); 
String userName;

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}
NickT
fonte
6
Por que isso é preferível ao getStringExtra?
invés de
6
Meu palpite é: se os extras podem ser null, toda a busca de extras pode ser ignorada. Ao usar getStringExtra, você basicamente altera para uma série de if(extras != null) { return extras.getString(name) }. Um para cada um que getStringExtravocê ligar. Esta opção irá verificar nulluma vez e, se for o caso, não se incomodará em ler Bundle. Além disso, getStringExtraprovavelmente continuará perguntando getExtrasinternamente também. Então você simplesmente tem mais chamadas para funções.
Daniël Sonck 21/02
39
//  How to send value using intent from one class to another class
//  class A(which will send data)
    Intent theIntent = new Intent(this, B.class);
    theIntent.putExtra("name", john);
    startActivity(theIntent);
//  How to get these values in another class
//  Class B
    Intent i= getIntent();
    i.getStringExtra("name");
//  if you log here i than you will get the value of i i.e. john
Sumit Sharma
fonte
31

Adicionar

Definir dados

String value = "Hello World!";
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("sample_name", value);
startActivity(intent);

Adquirir dados

String value;
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    value = bundle.getString("sample_name");
}
kenju
fonte
17

Em vez de inicializar outra nova intenção para receber os dados, faça o seguinte:

String id = getIntent().getStringExtra("id");
r_allela
fonte
11

Se usado em um FragmentActivity, tente o seguinte:

A primeira página estende FragmentActivity

Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);

No fragmento, você só precisa ligar getActivity()primeiro,

A segunda página estende o fragmento :

String receive = getActivity().getIntent().getExtras().getString("name");
Bundit Ng
fonte
1
Além disso, você pode usar getStringExtra ("name") em vez de getExtras (). GetString ("name")
Plot
7

Se você estiver tentando obter dados extras em fragmentos, tente usar:

Coloque os dados usando:

Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER);

Obtenha dados usando:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


  getArguments().getInt(ARG_SECTION_NUMBER);
  getArguments().getString(ARG_SECTION_STRING);
  getArguments().getBoolean(ARG_SECTION_BOOL);
  getArguments().getChar(ARG_SECTION_CHAR);
  getArguments().getByte(ARG_SECTION_DATA);

}
star18bit
fonte
6

Você pode obter qualquer tipo de dados extras a partir da intenção , não importa se é um objeto ou sequência ou qualquer tipo de dado.

Bundle extra = getIntent().getExtras();

if (extra != null){
    String str1 = (String) extra.get("obj"); // get a object

    String str2 =  extra.getString("string"); //get a string
}

e a solução mais curta é:

Boolean isGranted = getIntent().getBooleanExtra("tag", false);
Hasib Akter
fonte
4

** Colocar dados por intenção - **

 Intent intent = new Intent(mContext, HomeWorkReportActivity.class);
            intent.putExtra("subjectName","Maths");
            intent.putExtra("instituteId",22);
            mContext.startActivity(intent);

** Obter dados por intenção - **

  String subName = getIntent().getStringExtra("subjectName");
  int insId  getIntent().getIntExtra("instituteId",0);

se enviarmos valor inteiro por Intent. quando devemos usar o 2º parâmetro 0 em getIntent (). getIntExtra ("instituteId", 0) caso contrário, não usamos 0, o Android me dá um erro.

Om Prakash Sharma
fonte
2

Kotlin

Primeira atividade

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

Segunda atividade

val value = getIntent().getStringExtra("key")

Sugestão

Sempre coloque as chaves em um arquivo constante para uma maneira mais gerenciada.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}
Khemraj
fonte
1

Apenas uma sugestão:

Em vez de usar "id" ou "nome" em seu i.putExtra ("id" .....), sugiro, quando faz sentido, usar os campos padrão atuais que podem ser usados ​​com putExtra (), ou seja, Intent.EXTRA_something.

Uma lista completa pode ser encontrada em Intent (Android Developers).

eva
fonte
1

Podemos fazê-lo por meios simples:

Em FirstActivity:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Em SecondActivity:

    try {
        Intent intent = getIntent();

        String uid = intent.getStringExtra("uid");
        String pwd = intent.getStringExtra("pwd");

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("getStringExtra_EX", e + "");
    }
sam
fonte
1

Passe a intenção com valor na Primeira Atividade:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Receber intenção na segunda Atividade;

Intent intent = getIntent();
String user = intent.getStringExtra("uid");
String pass = intent.getStringExtra("pwd");

Geralmente, usamos dois métodos com a intenção de enviar o valor e obter o valor. Para enviar o valor que irá utilizar intent.putExtra("key", Value);e durante receber a intenção de outra atividade, vamos utilizar intent.getStringExtra("key");para obter os dados de intenção como Stringou usar algum outro método disponível para obter outros tipos de dados ( Integer, Boolean, etc.). A chave pode ser qualquer palavra-chave para identificar o valor significa que valor você está compartilhando. Espero que funcione para você.

Pradeep Sheoran
fonte
0

Você também pode fazer assim
// colocar valor na intenção

    Intent in = new Intent(MainActivity.this, Booked.class);
    in.putExtra("filter", "Booked");
    startActivity(in);

// obtém valor da intenção

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");
Savita Sharma
fonte
0

Obtendo diferentes tipos de extras a partir da intenção

Para acessar dados do Intent, você deve saber duas coisas.

  • CHAVE
  • DataType dos seus dados.

Existem métodos diferentes na classe Intent para extrair diferentes tipos de tipos de dados. Se parece com isso

getIntent (). XXXX (KEY) ou intent.XXX (KEY);


Portanto, se você souber o tipo de dados da sua varibale que você definiu em otherActivity, poderá usar o respectivo método.

Exemplo para recuperar String em sua atividade do Intent

String profileName = getIntent().getStringExtra("SomeKey");

Lista de diferentes variantes de métodos para diferentes dataType

Você pode ver a lista de métodos disponíveis na Documentação oficial de intenções .

Rohit Singh
fonte
0

Isso é para adaptador, para atividade, você só precisa alterar o mContext para o seu nome de Activty e, para o fragmento, você precisa alterar o mContext para getActivity ()

 public static ArrayList<String> tags_array ;// static array list if you want to pass array data

      public void sendDataBundle(){
            tags_array = new ArrayList();
            tags_array.add("hashtag");//few array data
            tags_array.add("selling");
            tags_array.add("cityname");
            tags_array.add("more");
            tags_array.add("mobile");
            tags_array.add("android");
            tags_array.add("dress");
            Intent su = new Intent(mContext, ViewItemActivity.class);
            Bundle bun1 = new Bundle();
            bun1.putString("product_title","My Product Titile");
            bun1.putString("product_description", "My Product Discription");
            bun1.putString("category", "Product Category");
            bun1.putStringArrayList("hashtag", tags_array);//to pass array list 
            su.putExtras(bun1);
            mContext.startActivity(su);
        }
Android Geek
fonte
-2

Acabei de publicar uma resposta aqui que aborda esse tópico com mais detalhes, incluindo algumas alternativas.

Utiliza a API Vapor , uma nova estrutura Android inspirada em jQuery que escrevi para simplificar o desenvolvimento do Android. Confira o exemplo nessa resposta para saber como você pode passar dados facilmente entre as atividades.

Também demonstra VaporIntent, o que permite encadear chamadas de método e utilizar o .put(...)método sobrecarregado :

$.Intent().put("data", "myData").put("more", 568)...

Você pode transmitir dados com facilidade por todo o aplicativo usando a API do Vapor , por isso espero que seja útil para você e outras pessoas durante o desenvolvimento do aplicativo.

Darius
fonte
1
Eu vi algumas de suas respostas sobre a API do vapor. É interessante. Como você obtém esses dados (como Intent.getextras ())?
Kalai.G
Confira este , ele explica como recuperar Intenção extras. Mais detalhes estão aqui . Isso ajuda?
Darius
2
Eu acho que os métodos de encadeamento têm muita sobrecarga. Se você está chamando qualquer método que retorne "this" apenas para ser encadeado (ou seja, "setters"), isso está violando os princípios de design do OOP. Eu gosto da simplicidade, mas a depuração também pode ser uma dor se você tiver uma cadeia de métodos. Vejo valor na API, mas não concordo com o encadeamento do método.
Nckbrz