RemoteInput无法获取额外数据,如何正确获取Intent附加信息?
解决RemoteInput启动后onActivityResult无法获取附加数据的问题
我来帮你搞定这个问题——你遇到的核心问题是:你直接放在启动Intent里的chatID、asd这类额外数据,并不会自动被带回onActivityResult中。因为处理RemoteInputIntent.ACTION_REMOTE_INPUT的目标Activity在返回结果时,只会封装用户通过RemoteInput输入的内容,不会主动把你传入的附加参数原样返回。
下面给你两种可行的解决方案,你可以根据自己的场景选择:
方案一:让目标Activity主动返回附加数据(适用于你能修改目标Activity代码的情况)
这种方式是最直接的,需要你在处理RemoteInput的目标Activity里,把接收到的附加参数重新放入返回的Intent中:
1. 保持启动代码的逻辑(可优化存入RemoteInput的Extras)
你的启动代码可以保留现有写法,也可以把附加数据同时存入RemoteInput的Extras(方便目标Activity统一读取):
Bundle d = new Bundle(); d.putString("chatID", id); RemoteInput remoteInput = new RemoteInput.Builder("remote_input") .setLabel("Send to "+name) .addExtras(d) // 把chatID存入RemoteInput的附加信息 .build(); RemoteInput[] remoteInputs = new RemoteInput[]{remoteInput}; Intent intent = new Intent(RemoteInputIntent.ACTION_REMOTE_INPUT); intent.putExtra(RemoteInputIntent.EXTRA_REMOTE_INPUTS, remoteInputs); intent.putExtra("chatID", id); // 同时在Intent里存一份,确保目标Activity能拿到 intent.putExtra("asd", "das"); startActivityForResult(intent, 0);
2. 修改目标Activity的返回逻辑
在处理RemoteInputIntent.ACTION_REMOTE_INPUT的Activity中,完成用户输入处理后,把附加参数放回返回Intent:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先获取传入的附加数据 String chatID = getIntent().getStringExtra("chatID"); String asd = getIntent().getStringExtra("asd"); // 这里处理用户输入逻辑,假设已经拿到用户输入的内容userInputText // ... // 准备返回结果Intent Intent resultIntent = new Intent(); // 把RemoteInput的输入结果放入Intent RemoteInput[] remoteInputs = getIntent().getParcelableArrayExtra(RemoteInputIntent.EXTRA_REMOTE_INPUTS); Bundle inputResults = new Bundle(); inputResults.putCharSequence("remote_input", userInputText); RemoteInput.addResultsToIntent(remoteInputs, resultIntent, inputResults); // 关键:把之前的附加参数也放入返回Intent resultIntent.putExtra("chatID", chatID); resultIntent.putExtra("asd", asd); setResult(RESULT_OK, resultIntent); finish(); }
3. 在onActivityResult中正常获取数据
现在你就能在原Activity的onActivityResult里顺利拿到附加数据了:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == 0) { // 获取用户通过RemoteInput输入的内容 Bundle results = RemoteInput.getResultsFromIntent(data); String inputText = results.getCharSequence("remote_input").toString(); // 获取附加数据 String chatID = data.getStringExtra("chatID"); String asd = data.getStringExtra("asd"); // 后续业务处理... } }
方案二:本地暂存附加数据(适用于无法修改目标Activity代码的情况)
如果RemoteInputIntent.ACTION_REMOTE_INPUT是系统组件或者第三方库的Activity,你没法修改它的返回逻辑,那可以把附加数据暂存在本地,在onActivityResult中读取:
1. 用ViewModel暂存数据(推荐,生命周期安全)
先创建一个ViewModel类:
public class ChatViewModel extends ViewModel { private String currentChatID; private String currentAsd; public void setTempData(String chatID, String asd) { this.currentChatID = chatID; this.currentAsd = asd; } public String getCurrentChatID() { return currentChatID; } public String getCurrentAsd() { return currentAsd; } }
2. 启动前存入数据
// 获取ViewModel实例 ChatViewModel viewModel = new ViewModelProvider(this).get(ChatViewModel.class); // 存入附加数据 viewModel.setTempData(id, "das"); // 原启动代码不变 Bundle d = new Bundle(); d.putString("chatID", id); RemoteInput remoteInput = new RemoteInput.Builder("remote_input") .setLabel("Send to "+name) .addExtras(d) .build(); RemoteInput[] remoteInputs = new RemoteInput[]{remoteInput}; Intent intent = new Intent(RemoteInputIntent.ACTION_REMOTE_INPUT); intent.putExtra(RemoteInputIntent.EXTRA_REMOTE_INPUTS, remoteInputs); startActivityForResult(intent, 0);
3. 在onActivityResult中读取暂存的数据
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == 0) { // 获取输入内容 Bundle results = RemoteInput.getResultsFromIntent(data); String inputText = results.getCharSequence("remote_input").toString(); // 读取暂存的附加数据 ChatViewModel viewModel = new ViewModelProvider(this).get(ChatViewModel.class); String chatID = viewModel.getCurrentChatID(); String asd = viewModel.getCurrentAsd(); // 后续处理... } }
内容的提问来源于stack exchange,提问作者user2875404
相关产品推荐
相关产品推荐

