Activity跳转发生TransactionTooLarg
发生TransactionTooLargeException是因为Intent的传值太大了,解决方法很简单,activity跳转使用如下方法就可以避免:SafeIntent。getInstance()。startActivity(Contextcontext,JumpIntentintent);SafeIntent。getInstance()。startActivityForResult(Activityactivity,JumpIntentintent,intrequestCode);SafeIntent。getInstance()。startActivityForResult(Activityactivity,JumpIntentintent,intrequestCode,Bundleoptions);
在activity的onNewIntent方法中还需要这样处理:OverridepublicvoidonNewIntent(Intentintent){super。onNewIntent(intent);SafeIntent。getInstance()。onNewIntent(this,intent);}
就是这么简单,SafeIntent完整代码如下:importandroid。app。Activity;importandroid。app。Application;importandroid。content。Context;importandroid。content。Intent;importandroid。os。Bundle;importandroid。util。ArrayMap;importandroidx。annotation。NonNull;importandroidx。annotation。Nullable;importjava。util。UUID;描述:Activity之间传值安全Intent(避免TransactionTooLargeException)联系:1966353889qq。com日期:2022120publicclassSafeIntent{privatestaticvolatileSafeIntentmInstance;privatefinalArrayMapString,JumpIntentmArrayMap;privatebooleanhasLifecycleCallbacks;privatestaticfinalStringmSafeIntentKeySAFEINTENTSIGN;privateSafeIntent(){mArrayMapnewArrayMap();}privatevoidput(Stringkey,JumpIntentvalue){mArrayMap。put(key,value);}privatevoidremove(StringintentSign){mArrayMap。remove(intentSign);}privateIntentgetIntent(StringintentSign){returnmArrayMap。get(intentSign);}publicstaticSafeIntentgetInstance(){if(mInstancenull){synchronized(SafeIntent。class){if(mInstancenull){mInstancenewSafeIntent();}}}returnmInstance;}初始化调用publicvoidinit(Activityactivity){if(hasLifecycleCallbacksactivitynullactivity。isFinishing()activity。isDestroyed()activity。getApplication()null){return;}hasLifecycleCallbackstrue;activity。getApplication()。registerActivityLifecycleCallbacks(newActivityLifecycleCallbacks(){OverridepublicvoidonActivityCreated(NonNullActivityactivity,NullableBundlesavedInstanceState){if(activity。getIntent()。hasExtra(mSafeIntentKey)mArrayMap。containsKey(activity。getIntent()。getStringExtra(mSafeIntentKey))){activity。setIntent(getIntent(activity。getIntent()。getStringExtra(mSafeIntentKey)));}}OverridepublicvoidonActivityDestroyed(NonNullActivityactivity){if(activity。getIntent()。hasExtra(mSafeIntentKey)){remove(activity。getIntent()。getStringExtra(mSafeIntentKey));}}});}publicvoidstartActivity(Contextcontext,JumpIntentintent){put(intent。jumpIntent。getStringExtra(mSafeIntentKey),intent);context。startActivity(intent。jumpIntent);}publicvoidstartActivityForResult(Activityactivity,JumpIntentintent,intrequestCode){put(intent。jumpIntent。getStringExtra(mSafeIntentKey),intent);activity。startActivityForResult(intent。jumpIntent,requestCode);}publicvoidstartActivityForResult(Activityactivity,JumpIntentintent,intrequestCode,Bundleoptions){put(intent。jumpIntent。getStringExtra(mSafeIntentKey),intent);activity。startActivityForResult(intent。jumpIntent,requestCode,options);}在Activity的onNewIntent中调用publicvoidonNewIntent(Activityactivity,Intentintent){if(intent。hasExtra(mSafeIntentKey)mArrayMap。containsKey(intent。getStringExtra(mSafeIntentKey))){if(activity。getIntent()。hasExtra(mSafeIntentKey)){remove(activity。getIntent()。getStringExtra(mSafeIntentKey));}activity。setIntent(mArrayMap。get(intent。getStringExtra(mSafeIntentKey)));}else{activity。setIntent(intent);}}publicstaticclassJumpIntentextendsIntent{privatefinalIntentjumpIntent;publicJumpIntent(ContextpackageContext,Classlt;?cls){super(packageContext,cls);jumpIntentnewIntent(packageContext,cls);StringvalueUUID。randomUUID()。toString();jumpIntent。putExtra(mSafeIntentKey,value);putExtra(mSafeIntentKey,value);}}publicabstractstaticclassActivityLifecycleCallbacksimplementsApplication。ActivityLifecycleCallbacks{OverridepublicabstractvoidonActivityCreated(NonNullActivityactivity,NullableBundlesavedInstanceState);OverridepublicvoidonActivityStarted(NonNullActivityactivity){}OverridepublicvoidonActivityResumed(NonNullActivityactivity){}OverridepublicvoidonActivityPaused(NonNullActivityactivity){}OverridepublicvoidonActivityStopped(NonNullActivityactivity){}OverridepublicvoidonActivitySaveInstanceState(NonNullActivityactivity,NonNullBundleoutState){}OverridepublicabstractvoidonActivityDestroyed(NonNullActivityactivity);}}