在某些设备上不会触发 ActivityResultCallback 函数 onActivityResult (Android Studio / Java)
ActivityResultCallback function onActivityResult won't be triggered on some devices (Android Studio / Java)
我有一个可以打开新 activity 的片段。从这个 activity,一旦按下保存或后退按钮,activity 中的数据将被检索并发送回片段。这至少是我期望发生的事情。在无法按预期工作的设备上,新的 activity 会启动,但是当返回片段时,不会调用从 ActivityResultCallback
接收数据的函数 onActivityResult
。此外,返回时显示的片段不是正确的片段。这让我认为片段所在的 activity 没有正确保存并且正在显示 default/first 片段。这不是应用程序中的错误,因此没有任何错误消息。
起初我使用片段 class 中已弃用的 onActivityResult
,并尝试将其更改为使用 ActivityResultCallback
中的 onActivityResult 方法的较新方法。但是问题仍然存在,所以我怀疑这是由于 API 版本引起的问题。这些是我测试过的设备,哪些设备的表现符合我的预期
Phone
How it ran
Pixel - API 28 - Emulator
As expected
Pixel 2 - API 29 - Emulator
As expected
Moto x4 - API 28 - Real
As expected
Moto g7 Power - API 29 - Real
Not As expected
我已经检查了 google 的 ActivityResultLauncher
文档,但我无法理解我做错了什么。
这里是我的代码片段,适用于这个问题。
我有一个名为 Intent
的 class,我在这个项目中使用它类似于 android.content.Intent
名称。在这些片段中,我在引用 android.content.Intent
和 Intent
时使用 android.content.Intent
来表示我的 Intent
class.
PlanFragment.java
public class PlanFragment extends Fragment {
...
ActivityResultLauncher<android.content.Intent> mStartForResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Log.d("Cursor", "OnActivityResult");
if (result.getResultCode() == Activity.RESULT_OK) {
Log.d("Cursor", "OnActivityResultOk");
}
}
});
...
public View onCreateView(...) {
...
FloatingActionButton addIntent = view.findViewById(R.id.add_intent);
addIntent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
android.content.Intent intent = new android.content.Intent(view.getContext(), AddEditIntentActivity.class);
mStartForResult.launch(intent);
}
});
...
}
...
}
AddEditIntentActivity.java
public class AddEditIntentActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
...
private void saveIntent() {
Intent data = new Intent();
data.putExtra(EXTRA_NAME, name);
data.putExtra(EXTRA_DESC, desc);
data.putExtra(EXTRA_IMAGE, image.trim());
data.putExtra(EXTRA_TIME, time);
int id = getIntent().getIntExtra(EXTRA_ID, -1);
if (id != -1) {
data.putExtra(EXTRA_ID, id);
}
Log.d("Cursor", "SaveIntent");
setResult(Activity.RESULT_OK, data);
Log.d("Cursor", "SetResult");
onBackPressed();
Log.d("Cursor", "backPressed");
}
...
}
我尝试用 finish()
替换 onBackPressed()
,但这也无济于事。
唯一出现的日志消息是 SaveIntent
、SetResult
和 backPressed
。 OnActivityResult
和 OnActivityResultOk
只出现在它工作的设备上。
谁能帮我确定为什么会出现这个问题,我该如何解决?
使用日志消息我意识到 activity/fragments 每次都在重新创建。然后我想检查我的开发者选项,看看是否开启了“不保留活动”。事实证明是的。切换后,它又开始工作了!
我有一个可以打开新 activity 的片段。从这个 activity,一旦按下保存或后退按钮,activity 中的数据将被检索并发送回片段。这至少是我期望发生的事情。在无法按预期工作的设备上,新的 activity 会启动,但是当返回片段时,不会调用从 ActivityResultCallback
接收数据的函数 onActivityResult
。此外,返回时显示的片段不是正确的片段。这让我认为片段所在的 activity 没有正确保存并且正在显示 default/first 片段。这不是应用程序中的错误,因此没有任何错误消息。
起初我使用片段 class 中已弃用的 onActivityResult
,并尝试将其更改为使用 ActivityResultCallback
中的 onActivityResult 方法的较新方法。但是问题仍然存在,所以我怀疑这是由于 API 版本引起的问题。这些是我测试过的设备,哪些设备的表现符合我的预期
Phone | How it ran |
---|---|
Pixel - API 28 - Emulator | As expected |
Pixel 2 - API 29 - Emulator | As expected |
Moto x4 - API 28 - Real | As expected |
Moto g7 Power - API 29 - Real | Not As expected |
我已经检查了 google 的 ActivityResultLauncher
文档,但我无法理解我做错了什么。
这里是我的代码片段,适用于这个问题。
我有一个名为 Intent
的 class,我在这个项目中使用它类似于 android.content.Intent
名称。在这些片段中,我在引用 android.content.Intent
和 Intent
时使用 android.content.Intent
来表示我的 Intent
class.
PlanFragment.java
public class PlanFragment extends Fragment {
...
ActivityResultLauncher<android.content.Intent> mStartForResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Log.d("Cursor", "OnActivityResult");
if (result.getResultCode() == Activity.RESULT_OK) {
Log.d("Cursor", "OnActivityResultOk");
}
}
});
...
public View onCreateView(...) {
...
FloatingActionButton addIntent = view.findViewById(R.id.add_intent);
addIntent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
android.content.Intent intent = new android.content.Intent(view.getContext(), AddEditIntentActivity.class);
mStartForResult.launch(intent);
}
});
...
}
...
}
AddEditIntentActivity.java
public class AddEditIntentActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
...
private void saveIntent() {
Intent data = new Intent();
data.putExtra(EXTRA_NAME, name);
data.putExtra(EXTRA_DESC, desc);
data.putExtra(EXTRA_IMAGE, image.trim());
data.putExtra(EXTRA_TIME, time);
int id = getIntent().getIntExtra(EXTRA_ID, -1);
if (id != -1) {
data.putExtra(EXTRA_ID, id);
}
Log.d("Cursor", "SaveIntent");
setResult(Activity.RESULT_OK, data);
Log.d("Cursor", "SetResult");
onBackPressed();
Log.d("Cursor", "backPressed");
}
...
}
我尝试用 finish()
替换 onBackPressed()
,但这也无济于事。
唯一出现的日志消息是 SaveIntent
、SetResult
和 backPressed
。 OnActivityResult
和 OnActivityResultOk
只出现在它工作的设备上。
谁能帮我确定为什么会出现这个问题,我该如何解决?
使用日志消息我意识到 activity/fragments 每次都在重新创建。然后我想检查我的开发者选项,看看是否开启了“不保留活动”。事实证明是的。切换后,它又开始工作了!