intent传递有没有大小限制,是多少?

想要研究intent到底能传递多大内存的数据,你必须给他传一个数据(这不是废话么),然后后去到这些数据的大小,进行传递,根据实际程序运行情况,来观察传递的极限。由于一般对象大小不容易获取,这里采用bitmap来传输,可以用bitmap的getByteCount()方法获得大小

Tips: 图片是以像素矩阵的形式存在的

本文出自: http://blog.csdn.net/wingichoy/article/details/50679322

1.新建一个测试环境,MainActivity

在布局中添加一个按钮


<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.wingsofts.progresscircle.MainActivity">

 <Button
     android:onClick="test"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.在onClick()中加载图片,并且进行传递

public void test(View v){

        mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.p512);

        Log.e("wing","图片内存的大小是"+mBitmap.getByteCount()/1024+"kb");

        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra("test", mBitmap);
        startActivity(intent);


    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意这里打了一下log,获得图片在内存中所占的大小。这里为了方便,我已经把图片所需要的大小命为文件名。如下: 
intent传递有没有大小限制,是多少?_第1张图片

在接受的时候 打一下log,判断是否传输成功

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if(getIntent().getParcelableExtra("test")!=null){
            Log.e("wing","接收到了数据" + toString());
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

击破流言

江湖传闻,超过40k的intent会吃成胖子,继而体内爆炸。我们就先从40KB下手,用一个93KB的图片做实验。 运行及Log如下: 
intent传递有没有大小限制,是多少?_第2张图片

观察到93KB的图片传输成功,那么这条流言不攻自破了。

第二条流言呢

我们拿一个498KB的图片做测试: 
intent传递有没有大小限制,是多少?_第3张图片

看到传输成功了。。

接着再来传输1168KB的图片: 
intent传递有没有大小限制,是多少?_第4张图片

可以看到 大于1M的图片导致intent不能正常传输,并且无法启动activity

然而真的是小于1M都能传输吗?

本着研究的精神,我们在测试一下别的大小,650KB的 
intent传递有没有大小限制,是多少?_第5张图片

日了狗了!!程序直接闪退,而且没有异常提示

现在回头想想,刚才传输了一个498的成功传输,650的却出现了问题,难道512也是一个坎?

来试试512KB的 
intent传递有没有大小限制,是多少?_第6张图片

哑巴里,果然也崩了。。

继续试验 507挂了, 
…… 
在继续 506 挂了 
…… 
再继续 505 ,正常!!!!

试验得出505是一个app正常运行的极限值了。

有朋友指出,可能和运存大小有关,我将运存分别设置为256MB,1G,2G测试结果相同,另外还有朋友指出厂商可以自定义,这个我没有真机无法测试。。

其实这个研究只是为了防止面试官问你intent缺陷时候你答大小限制具体是多少,现在我们至少知道了40kb的流言是错误的。研究的意义也不大,反正记住,intent传递值尽量小就可以了

来总结下

1.当大小为505以下的时候,正常传输 
2.当大小为505-1024的时候,程序闪退,没有异常 
3.当大小大于1024的时候,log会显示 !!! FAILED BINDER TRANSACTION !!!

这些是实验结果,具体的原因是啥,笔者水平有限,就不深究了,有兴趣的可以继续研究~~~ 有错误的话 可以提出 欢迎一起讨论

欢迎关注我的博客 谢谢!

你可能感兴趣的:(个人文章)