尝试启动未注册的 ActivityResultLauncher

问题描述 投票:0回答:3

有时我会收到此 IllegalStateException,它表示您必须确保在调用 launch() 之前注册 ActivityResultLauncher。但没有方法检查 ActivityResultLauncher 是否已注册。我该如何解决这个问题以及为什么会发生这种情况?另外,不清楚何时调用 unregister() 方法,有例子吗?

android android-activity onactivityresult
3个回答
5
投票

注意在

onCreate
方法中注册你的activityResultLauncher,以防止副作用

public class MyActiviy extends AppCompatActivity {
    .
    .
    .

    private ActivityResultLauncher<Intent> myLauncher;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //some stuff

        // Register your launcher here
        myLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                Intent data = result.getData();
            }
        });
      
        findViewById(R.id.myButton).setOnClickListener(v -> {
            // call `launch` after user click on button or something like that
            Intent intent = new Intent(this, TargetActivity.class);
            myLauncher.launch(intent);
        });
    }

}

参考谷歌文档:

使用 ActivityResultRegistry API 时,强烈建议 使用采用 LifecycleOwner 的 API,作为 LifecycleOwner 当生命周期结束时,自动删除您注册的启动器 被毁了。但是,如果 LifecycleOwner 不可用, 每个 ActivityResultLauncher 类都允许您手动调用 unregister() 作为替代方案。

看一下这里


5
投票

我在 Playstore 上的所有应用程序上都遇到了同样的错误。经过一些实验,我设法找出解决方案。问题是“当应用程序离开活动时启动器被调用”。为了解决这个错误,我只做了两件事。

第 1 步:在 Activity Destroy 上将启动器指定为 null。

@Override protected void onDestroy() { super.onDestroy(); someActivityResultLauncher = null; }

第 2 步:在启动之前添加 Null 检查。

if(someActivityResultLauncher !=null) someActivityResultLauncher.launch(consentIntent);

让我解释一下,我的应用程序有 2 个活动。电话号码和验证活动。我有一个接收 OTP 消息并启动的广播 ()。如果广播已收到消息并且用户未进行验证活动。该应用程序会在广播时崩溃。非法状态异常

Exception java.lang.RuntimeException: at android.app.LoadedApk$ReceiverDispatcher$Args.run (LoadedApk.java:972) at android.os.Handler.handleCallback (Handler.java:743) at android.os.Handler.dispatchMessage (Handler.java:95) at android.os.Looper.loop (Looper.java:150) at android.app.ActivityThread.main (ActivityThread.java:5621) at java.lang.reflect.Method.invoke at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:684) Caused by java.lang.IllegalStateException: at androidx.activity.result.ActivityResultRegistry$2.launch (ActivityResultRegistry.java:168) at androidx.activity.result.ActivityResultLauncher.launch (ActivityResultLauncher.java:47) at com.jazz.pakistani.drama.videos.deikho.Activities.Credentials.VerifyPassword$2.onReceive (VerifyPassword.java:289) at android.app.LoadedApk$ReceiverDispatcher$Args.run (LoadedApk.java:962)



3
投票
ActivityResultLauncher

之前,您必须重新初始化

onCreate
onStart
内的
launch
    

© www.soinside.com 2019 - 2024. All rights reserved.