Activity跳转发生TransactionTooLargeException怎么办?
发生TransactionTooLargeException是因为Intent的传值太大了,解决方法很简单,activity跳转使用如下方法就可以避免:SafeIntent.getInstance().startActivity(Context context, JumpIntent intent); SafeIntent.getInstance().startActivityForResult(Activity activity, JumpIntent intent, int requestCode); SafeIntent.getInstance().startActivityForResult(Activity activity, JumpIntent intent, int requestCode, Bundle options);
在activity的onNewIntent方法中还需要这样处理:@Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); SafeIntent.getInstance().onNewIntent(this, intent); }
就是这么简单,SafeIntent完整代码如下:import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.ArrayMap; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.UUID; /** * 描述: Activity之间传值安全Intent(避免TransactionTooLargeException) * 联系: 1966353889@qq.com * 日期: 2022/1/20 */ public class SafeIntent { private static volatile SafeIntent mInstance; private final ArrayMap mArrayMap; private boolean hasLifecycleCallbacks; private static final String mSafeIntentKey = "SAFE_INTENT_SIGN"; private SafeIntent() { mArrayMap = new ArrayMap<>(); } private void put(String key, JumpIntent value) { mArrayMap.put(key, value); } private void remove(String intentSign) { mArrayMap.remove(intentSign); } private Intent getIntent(String intentSign) { return mArrayMap.get(intentSign); } public static SafeIntent getInstance() { if (mInstance == null) { synchronized (SafeIntent.class) { if (mInstance == null) { mInstance = new SafeIntent(); } } } return mInstance; } /** * 初始化调用 */ public void init(Activity activity) { if (hasLifecycleCallbacks || activity == null || activity.isFinishing() || activity.isDestroyed() || activity.getApplication() == null) { return; } hasLifecycleCallbacks = true; activity.getApplication().registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { if (activity.getIntent().hasExtra(mSafeIntentKey) && mArrayMap.containsKey(activity.getIntent().getStringExtra(mSafeIntentKey))) { activity.setIntent(getIntent(activity.getIntent().getStringExtra(mSafeIntentKey))); } } @Override public void onActivityDestroyed(@NonNull Activity activity) { if (activity.getIntent().hasExtra(mSafeIntentKey)) { remove(activity.getIntent().getStringExtra(mSafeIntentKey)); } } }); } public void startActivity(Context context, JumpIntent intent) { put(intent.jumpIntent.getStringExtra(mSafeIntentKey), intent); context.startActivity(intent.jumpIntent); } public void startActivityForResult(Activity activity, JumpIntent intent, int requestCode) { put(intent.jumpIntent.getStringExtra(mSafeIntentKey), intent); activity.startActivityForResult(intent.jumpIntent, requestCode); } public void startActivityForResult(Activity activity, JumpIntent intent, int requestCode, Bundle options) { put(intent.jumpIntent.getStringExtra(mSafeIntentKey), intent); activity.startActivityForResult(intent.jumpIntent, requestCode, options); } /** * 在Activity的onNewIntent中调用 */ public void onNewIntent(Activity activity, Intent intent) { 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); } } public static class JumpIntent extends Intent { private final Intent jumpIntent; public JumpIntent(Context packageContext, Class<?> cls) { super(packageContext, cls); jumpIntent = new Intent(packageContext, cls); String value = UUID.randomUUID().toString(); jumpIntent.putExtra(mSafeIntentKey, value); putExtra(mSafeIntentKey, value); } } public abstract static class ActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { @Override public abstract void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState); @Override public void onActivityStarted(@NonNull Activity activity) { } @Override public void onActivityResumed(@NonNull Activity activity) { } @Override public void onActivityPaused(@NonNull Activity activity) { } @Override public void onActivityStopped(@NonNull Activity activity) { } @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { } @Override public abstract void onActivityDestroyed(@NonNull Activity activity); } }
并发ListSetConcurrentHashMap底层原理剖析ArrayListList特点元素有放入顺序,元素可重复。存储结构底层采用数组来实现的。源码publicclassArrayListEextendsAbstractListEimp
小米5080mAh新机爆发,181TB定价7999,雷军野心变大了小米这个手机品牌现在专门走高端路线了,大家可以看到,这两年以来,在小米手机品牌中基本不再有千元机面世。其实小米的性价比任务已经完全移交给红米,雷军是想把小米打造成和三星华为苹果一样
ipadminior联想拯救者y700?想拯救者平板Y700,m,这可能是首款小尺寸安卓电竞平板。8。8英寸大小,单手可握,搭载骁龙870处理器,2K120Hz的屏幕,双X轴线性马达和JBL双扬声器,更有极为罕见的3。5
JavaScript两个变量交换值(不使用临时变量)概要本文主要描述,如何不使用中间值,将两个变量的值进行交换。前三种只适用于number类型的数值交换,第四和第五种适合其他类型。一普通做法vara1,b2,tmptmpaabbtm
ansible之playbookansibleplaybookplaybookyml说明playbook由一个或多个play组成。playbook中每个play必须包含hosts和tasks。playbook以y
web前端diff算法深入一下?一前言有同学问能否详细说一下diff算法。简单说diff算法是一种优化手段,将前后两个模块进行差异化比较,修补(更新)差异的过程叫做patch,也叫打补丁。详细的说,请阅读这篇文章
影响手机拍照成像水平的有哪些方面?每次看小米新品发布会时都能听到。我们小米的产品采用1亿像素摄像头。让我以为是小米手机的拍照成像是在业内一个最高的水准。但是经过我的多方面认证,去实体店对比。发现像素并不能决定一切。
小米新手机外壳曝光5月发布会将发新机?昨晚行业中曝光了小米新手机的外壳,目前已经确定的是该机并不是5月即将发布的MIX系列,而是civi2手机,将会大几率将在5月的小米发布会中亮相。从手机背部的开孔来看,摄像头模组将有
怎么开机用u盘重装系统怎么开机用u盘重装系统,首先第一步将我们的这个u盘插入那个电脑的usb接口这款是微钢30的是双启动这款是闪迪的插入以后那么电脑你要重启计算机然后重启计算机出它会出现一个品牌的画面大
华为多款新品曝光,三月发布5G新机,鸿蒙OS3。0和Mate50再确定对于华为粉丝来说,现在最关注的两个产品,一个是鸿蒙OS3。0到底什么时候公测,一个是华为Mate50系列到底何时发布。恰好,这两款产品最近都传出了新的消息,下面咱们就来一起说道说道
华为mate40pro拍照使用过程的一些感想我用的手机是华为mate40pro,在拍照上配置有三颗镜头,分别是焦距18mm的超广角,焦距23mm的广角,焦距135mm的5倍长焦镜头,使用一段后,在拍照方面有几点看法一拍风景的