如何从 Android 上的意图中获取额外数据?

Posted

技术标签:

【中文标题】如何从 Android 上的意图中获取额外数据?【英文标题】:How do I get extra data from intent on Android? 【发布时间】:2021-04-10 22:12:26 【问题描述】:

如何将数据从一个活动(意图)发送到另一个活动?

我用这段代码发送数据:

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

【问题讨论】:

Java 旁注:像这样“字符串化”整数从来都不是一个好主意(尤其是出于示例目的),不幸的是,它经常被认为是在 java 中将 int 转换为字符串的好方法:user.getUserAccountId()+"",因为这会创建不必要的对象来收集。考虑改用String.valueOf(user.getUserAccountId)Integer.toString(user.getUserAccountId) @Andrew S 这不是网络吗?这是“从意图中获取数据”的第一结果 @AndrewS 我同意麦奎尔的观点。另外,这个问题是不久前发布的,所以当时可能不太容易找到答案。如果还没有向 SO 发布类似问题,那么它就是有效的帖子。 【参考方案1】:

首先,使用getIntent() 方法获取启动活动的意图:

Intent intent = getIntent();

如果您的额外数据表示为字符串,那么您可以使用intent.getStringExtra(String name) 方法。在你的情况下:

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

【讨论】:

从哪里可以得到所有这些方法?? @adham:如果您在活动中,从 onCreate 中调用 getIntent().getStringExtra("id"); 以获取 id 字符串 您可以通过调用getIntent() 方法获取启动活动的意图。我已经更新了答案。 @Eatlon 如果您对特定库有疑问,您应该为此创建一个单独的问题。 @MelColm getExtra().getString 和 getStringExtra() 有什么区别?【参考方案2】:

在接收活动中

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

if (extras != null) 
    userName = extras.getString("name");
    // and get whatever type user account id is

【讨论】:

为什么这比getStringExtra?更可取 我的猜测是:如果 extras 可以是null,则可以跳过整个 extras 获取。通过使用getStringExtra,您基本上将其更改为一系列if(extras != null) return extras.getString(name) 。您拨打的每个getStringExtra 一个。此选项将检查null 一次,如果是,则根本不会阅读Bundle。除此之外,getStringExtra 可能还会每次在内部不断询问getExtras。因此,您只需对函数进行更多调用。【参考方案3】:
//  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

【讨论】:

【参考方案4】:

如果您想在片段中获取额外数据,那么您可以尝试使用:

使用以下方式放置数据:

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


【讨论】:

【参考方案5】:

如果在 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");

【讨论】:

你也可以使用 getStringExtra("name") 代替 getExtras().getString("name")【参考方案6】:

不要初始化另一个新的 Intent 来接收数据,只需这样做:

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

【讨论】:

【参考方案7】:

只是一个建议:

我建议不要在 i.putExtra("id".....) 中使用“id”或“name”,而是在有意义的时候使用可与 putExtra( ),即 Intent.EXTRA_something。

完整列表可在 Intentandroid 开发者)上找到。

【讨论】:

【参考方案8】:

加起来

设置数据

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

【讨论】:

【参考方案9】:

你也可以这样做 // 将值放入意图中

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

【讨论】:

【参考方案10】:

我们可以通过简单的方式做到这一点:

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

【讨论】:

【参考方案11】:

从 Intent 中获取不同类型的 Extra

要从 Intent 访问数据,您应该知道两件事。

键 数据的数据类型。

Intent 类中有不同的方法来提取不同类型的数据类型。 看起来是这样的

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

因此,如果您知道在 otherActivity 中设置的变量的数据类型,则可以使用相应的方法。

从 Intent 中检索 Activity 中的字符串的示例

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

不同数据类型的不同方法变体列表

您可以在Intent的官方文档中查看可用方法的列表。

【讨论】:

【参考方案12】:

这是针对适配器的,对于活动,您只需要更改 mContext 到您的 Activty 名称和片段,您需要将 mContext 更改为 获取活动()

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

【讨论】:

【参考方案13】:

您可以从意图中获取任何类型的额外数据,无论是对象、字符串还是任何类型的数据。

Bundle extra = getIntent().getExtras();

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

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

最短的解决方案是:

Boolean isGranted = getIntent().getBooleanExtra("tag", false);

【讨论】:

【参考方案14】:

在第一个活动上传递带有值的意图:

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

接收第二个 Activity 的意图;-

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

我们通常使用两种方法来发送值和获取值。 为了发送值,我们将使用intent.putExtra("key", Value);,在接收另一个活动的意图期间,我们将使用intent.getStringExtra("key"); 来获取意图数据为String 或使用其他可用方法来获取其他类型的数据(Integer,@ 987654327@等)。 关键可以是任何关键字来识别价值意味着你正在分享什么价值。 希望它对你有用。

【讨论】:

【参考方案15】:

科特林

第一个活动

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"

【讨论】:

【参考方案16】:

按意图放置数据:

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

如果我们对 Intent 使用整数值,我们必须将 getIntent().getIntExtra("instituteId", 0) 中的第二个参数设置为 0。否则,我们不使用 0,Android 会给我一个错误。

【讨论】:

以上是关于如何从 Android 上的意图中获取额外数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android编程中获取放置在小部件上的textview文本

Android:如何获取服务接收到的意图?

如何获得在android中停止服务的意图

如何从服务中获取更新信息?

Android在使用requestLocationUpdates()时如何从意图中获取信息

Android:无法从意图获取数据