2016-11-10 42 views
1

爲了縮短問題:我正在開發一個需要用戶登錄的android應用程序,並且可以記錄多個用戶在同一時間,我想在使用NFC觸摸卡的已認證用戶之間循環。除了使用條形碼掃描器ZXing.Mobile,當代碼從掃描任何條形碼返回並試圖推送頁面模型時,除了使用Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState以外,一切正常。請注意,我使用Xamarin.Forms,FreshMVVM,ZXing.Mobile,當然還有C#。的代碼Android應用程序拋出:Java.Lang.IllegalStateException,帶消息:無法在onSaveInstanceState後執行此操作

片段使用:

的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標籤發射。 SplashActivity發佈MainActivity

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

EDIT: 含有推頁面模型方法的代碼:

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卡被觸摸後,應用程序啓動,直到擊中的下一行代碼工作。從掃描儀返回條碼後:
await CoreMethods.PushPageModel<SecondaryPageModel>(response).ConfigureAwait(true);

例外情況正在引發此處。我調試了我的代碼來檢查發生了什麼。當相機打開時,在成功掃描條形碼後,它首先觸發MainActivity OnSaveInstanceState事件,按順序觸發事件。然後調用PushPageModel方法。 請注意,當我在相關字段中手動輸入條形碼時,一切正常,只是引發此異常的掃描器。

我在這裏搜索瞭解決方案。我找到了一些答案,說選擇退出base.OnSaveInstanceState()系列,我嘗試過,沒有運氣,另一個答案說爲了解決這個問題進入垃圾價值,嘗試了,沒有運氣好。我在AndroidManifest文件中嘗試了不同的啓動模式,如singleTopsingleTasksingleInstance,但沒有運氣。

我會很樂意提供任何幫助。提前致謝。

+0

請問您還可以添加包含'await CoreMethods.PushPageModel (條形碼).ConfigureAwait真);'行 –

+0

@Jj添加了代碼,驗證條碼後它只是一個開關盒 –

回答

1

MainActivity運行多個實例,當您使用NFC切換,添加到MainActivity LaunchMode爲SingleTask,那麼當您啓動使用NFC明確任務,並創建一個新的。指定活動標誌的好方法是使用Xamarin屬性,這比在Manifest.xml中添加它們更好一些。

相關問題