Как получить дополнительные данные от намерения на Android?

Как я могу отправить данные от одного действия (намерения) к другому?

Я использую этот код для отправки данных:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);

19 ответов

Решение

Сначала получите намерение, с которого началась ваша деятельность, используя getIntent() метод:

Intent intent = getIntent();

Если ваши дополнительные данные представлены в виде строк, то вы можете использовать intent.getStringExtra(String name) метод. В твоем случае:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");

В принимающей деятельности

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

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}
//  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

Добавить вверх

Установить данные

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

Получить данные

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

Вместо инициализации другого нового Намерения для получения данных, просто сделайте это:

String id = getIntent().getStringExtra("id");

** Поместите данные по намерению - **

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

** Получить данные по намерению - **

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

если мы отправим целочисленное значение по намерению. когда мы должны использовать второй параметр 0 в getIntent().getIntExtra("InstituteId",0), иначе мы не используем 0, тогда android выдаст мне ошибку.

Если используется в FragmentActivity, попробуйте это:

Первая страница расширяет FragmentActivity

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

Во фрагменте нужно просто позвонить getActivity() первый,

Вторая страница расширяет фрагмент:

String receive = getActivity().getIntent().getExtras().getString("name");

Если вы пытаетесь получить дополнительные данные во фрагментах, то вы можете попробовать использовать:

Поместите данные, используя:

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

Получить данные, используя:

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);

}

Котлин

Первое занятие

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

Второе занятие

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

Предложение

Всегда помещайте ключи в постоянный файл для более управляемого пути.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

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

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

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

Передайте намерение со значением в первом действии:

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

Получить намерение на второй деятельности;-

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

Обычно мы используем два метода, чтобы отправить значение и получить его. Для отправки значения мы будем использовать intent.putExtra("key", Value); и во время получения намерения о другой деятельности мы будем использовать intent.getStringExtra("key"); чтобы получить данные намерения как String или использовать другой доступный метод для получения других типов данных (Integer, Boolean, так далее.). Ключом может быть любое ключевое слово, чтобы идентифицировать значение, значит, какое значение вы разделяете. Надеюсь, это сработает для вас.

Просто предложение:

Вместо использования "id" или "name" в вашем i.putExtra("id".....), я бы предложил, когда это имеет смысл, использовать текущие стандартные поля, которые можно использовать с putExtra(), т.е. Intent.EXTRA_something.

Полный список можно найти в Intent (Android Developers).

Мы можем сделать это простыми средствами:

В FirstActivity:

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

В 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 + "");
    }

Это для адаптера, для активности вам просто нужно изменить mContext на ваше имя Activty, а для фрагмента вам нужно изменить mContext на 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);
        }

Вы также можете сделать это
// положить значение в намерение

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

// получить значение из намерения

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");

Получение различных типов экстра из намерения

Для доступа к данным из Intent вы должны знать две вещи.

  • KEY
  • DataType ваших данных.

В классе Intent есть разные методы для извлечения разных типов данных. Это выглядит так

getIntent().XXXX(KEY) или intent.XXX(KEY);


Поэтому, если вы знаете тип данных вашей переменной, который вы установили в otherActivity, вы можете использовать соответствующий метод.

Пример получения строки в вашей активности из намерения

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

Список разных вариантов методов для разных dataType

Вы можете увидеть список доступных методов в Официальной документации о намерениях.

      A class to B class Data Sending 

A class:

Intent in = new Intent(A.this, B.class);
in.putExtra("Name", ""+user.getUserFullName());
startActivity(in);

B class:

String name = getIntent().getStringExtra("Name");

В Kotlin и Jetpack Compose используйте это:

      val context = LocalContext.current
val intent = Intent(context, Activity2::class.java)
intent.putExtra("name", "John")
intent.putExtra("data2","aaaa")
context.startActivity(intent)

и в Деятельности2:

      val intent = intent
val name = intent.getStringExtra("name")
val data2 = intent.getStringExtra("data2")

Вы можете протестировать, написав в logcat:

      `Log.d("A2", "Name $name $data2")`

Я только что опубликовал ответ, который охватывает эту тему более подробно, включая некоторые альтернативы.

Он использует Vapor API, новую платформу Android, вдохновленную jQuery, которую я написал для упрощения разработки Android. Посмотрите на пример в этом ответе о том, как вы можете легко передавать данные между активами.

Также это демонстрирует VaporIntent, который позволяет вам цеплять вызовы методов и использовать перегруженные .put(...) метод:

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

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

Другие вопросы по тегам