为简化问题,我正在开发一个Android应用程序,该应用程序要求用户登录,并且由于可以同时登录多个用户,因此我想在使用NFC触摸卡的经过身份验证的用户之间循环。除了使用ZXing.Mobile条形码扫描仪之后,一切正常,除非使用扫描任何条形码返回代码并尝试推送页面模型时,都会抛出此特殊异常。请注意,我正在使用Xamarin.Forms,FreshMVVM,ZXing.Mobile,当然还有C#。

使用的代码片段:

AndroidManifest.xml:

<activity android:name="com.name.SplashActivity">
    <intent-filter>
        <category android:name="android.intent.category.LAUNCHER" />
        <action android:name="android.intent.action.MAIN" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="application/com.name.nfc" />
    </intent-filter>
</activity>
<activity android:name="com.name.MainActivity">
</activity>


上面的代码用于使应用程序能够使用NFC标签启动。 Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState启动SplashActivity

SplashActivity.cs:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    StartActivity(typeof(MainActivity));
}

protected override void OnResume()
{
    base.OnResume();

    if (NfcAdapter.ActionNdefDiscovered == Intent.Action)
    {
        ProcessIntent(Intent);
    }
}

protected override void OnNewIntent(Intent intent)
{
    Intent = intent;
}

public void ProcessIntent(Intent intent)
{
    //Code omitted to simplify the question.
}


上面的代码仅用于了解我如何使用NFC触摸事件。

从主页模型打开条形码扫描仪的代码:

public ICommand OpenCameraCommand => new Command(async () =>
{
    IsAvailable = false;
    ((Command) OpenCameraCommand).ChangeCanExecute();
    string checkBarcode = await _scanService.CameraScanAsync().ConfigureAwait(true);
    if (!string.IsNullOrWhiteSpace(checkBarcode))
    {
        Barcode = checkBarcode;
    }
    IsAvailable = true;
}, () => IsAvailable);


从扫描服务:

public async Task<string> CameraScanAsync()
{
    //AutoFocus code omitted to simplify the question

    Result result = await _mobileBarcodeScanner.Scan(new MobileBarcodeScanningOptions { PossibleFormats = _listOfBarcodeFormats }).ConfigureAwait(false);

    return result == null ? string.Empty : result.Text;
}


编辑:
包含推入页面模型方法的代码:

switch (response.Status)
{
    case Case.Second:
        await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Third:
        await CoreMethods.PushPageModel<ThirdPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Fourth:
        await CoreMethods.PushPageModel<FourthPageModel>(response).ConfigureAwait(true);
        Barcode = string.Empty;
        return;
    case Case.Invalid:
        break;
    default:
        throw new InvalidOperationException();
}


从扫描条形码返回后,将直接触发此代码。
结束编辑

在触摸NFC卡并启动应用程序之后,所有这些工作都会生效,直到出现下一行代码为止。从扫描仪返回条形码后:
MainActivity

在这里抛出异常。我调试了代码以检查发生了什么。打开相机后,它将首先触发await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);事件,在成功扫描条形码后,将按该顺序触发MainActivity OnSaveInstanceState> MainActivity OnResume事件。然后调用MainActivity OnPostResume方法。请注意,当我在相对字段中手动输入条形码时,一切工作正常,只是扫描仪引发了此异常。

我在这里搜索解决方案。我找到了一些答案,说要退出PushPageModel行,我尝试了一点运气,而另一个回答是输入垃圾值来解决该问题,也没有运气。我在AndroidManifest文件中尝试了不同的启动模式,例如base.OnSaveInstanceState()singleTopsingleTask,但也没有运气。

我会很高兴能提供任何帮助。提前致谢。

最佳答案

当您使用NFC进行切换时,MainActivity正在运行多个实例,将其作为SingleTask添加到MainActivity LaunchMode,然后在使用NFC启动时,清除任务并创建一个新实例。指定Activity标志的一种好方法是使用Xamarin属性,这比在Manifest.xml中添加它们更好的方法

关于c# - Android应用程序抛出:Java.Lang.IllegalStateException,并出现消息:onSaveInstanceState之后无法执行此操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40525327/

10-12 03:11