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

862

我该如何从一个activity(意图)发送数据到另一个activity?

我使用以下代码来发送数据:

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

91
Java侧注:像这样“将整数转换为字符串”从来不是个好主意(尤其是为了示例目的),不幸的是,在Java中经常被认为是一种好的、快速的将int转换为字符串的方法:user.getUserAccountId()+"",因为这会创建不必要的对象需要进行收集。考虑使用String.valueOf(user.getUserAccountId())Integer.toString(user.getUserAccountId())来代替。 - pkk
6
这不就是网络吗?这是“从意图获取数据”搜索结果的排名第一。 - McGuile
@AndrewS 我同意McGuile的观点。此外,这个问题是一段时间前发布的,所以当时可能不容易找到答案。如果在SO上还没有类似的问题被发布,那么这是一个有效的帖子。 - 0xCursor
18个回答

1371

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

Intent intent = getIntent();

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

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

10
我可以翻译这段话为:"我从哪里可以获取这些方法?" - Adham
54
如果您在一个活动中,在onCreate内调用getIntent().getStringExtra("id");来获取id字符串。 - ccheneson
1
您可以通过调用 getIntent() 方法来获取启动您的活动的意图。我已经更新了答案。 - Malcolm
2
@Eatlon 如果你遇到了特定库的问题,你应该创建一个关于那个问题的单独的提问。 - Malcolm
3
getExtra().getString和getStringExtra()有什么区别? - Amit Tripathi
显示剩余10条评论

209

在接收活动中

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

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

7
为什么这比“getStringExtra”更可取? - IgorGanapolsky
7
我的猜测是:如果额外参数可以为“null”,那么整个获取额外参数的步骤就可以被跳过。通过使用“getStringExtra”,你基本上把它改成了一系列的“if(extras!= null){return extras.getString(name)}”。每个你调用的“getStringExtra”都会有一个这样的判断。这种方式只需检查一次是否为“null”,如果是,则根本不会读取“Bundle”。此外,“getStringExtra”可能会在内部不断地调用“getExtras”。所以你只是增加了更多的函数调用。 - Daniël Sonck

45
//  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

37

相加

设置数据

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

18

不需要初始化新的Intent来接收数据,只需这样操作:

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

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);
如果我们在意图中使用整数值,那么第二个参数必须为0在getIntent().getIntExtra("instituteId", 0)中。否则,如果不使用0,Android会报错。

11

如果在 FragmentActivity 中使用,请尝试以下方法:

第一个页面扩展 FragmentActivity

Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);
在该片段中,您只需要先调用getActivity()。 第二页扩展了Fragment
String receive = getActivity().getIntent().getExtras().getString("name");

1
你也可以使用 getStringExtra("name") 代替 getExtras().getString("name")。 - Plot

8
如果您想在片段中获取额外的数据,则可以尝试使用以下内容: 使用以下方式放置数据:
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);

}

7

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

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

7

Kotlin

First Activity

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"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,