</pre>Intent意图的意思,在andorid 当中常用于组件的跳转,当然,这是最主要的,其他的呢?比如,我们如何获取系统的音乐,图片,文字,或者其他的文件呢?<p></p><p>这篇文章主要和大家说下Intent如何获取系统的音乐,照片或者其他的文件:</p><p>大家知道Intent的有个setaction方法吧?这个方法可以传入参数是吧?这个方法是什么意思呢?其实就是你的Inten一什么形式去开展,还有一个方法是setType,这个方法是设置类型,下面附上如何去获取系统文件的方法:</p><p> </p><pre name="code" class="html"> Intent file_choose_intent=new Intent();
file_choose_intent.setAction(Intent.ACTION_GET_CONTENT);
file_choose_intent.setType("image/*");
startActivityForResult(file_choose_intent,1);
这方法用了image/*去过滤,如果你想获取音频呢?audio/*,如果你要选很多文件呢,直接*/*;全选文件
intent返回的是系统中的一个张图片的Uri,(Uri的概念我就不细说了),你可以将这个Uri作为个一个资源定位符号,获取得到这个文件的在手机上文件路径,然后可以生成一个文件的流啦(所以想要获得某种文件的路径,就用这个方法啦),下面给出获取一张照片的示例:
this.image_camera.setImageURI(data.getData());
String[] proj = { MediaStore.Images.Media.DATA };
Cursor actualimagecursor =this.cr.query(data.getData(),proj,null,null,null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
String img_path = actualimagecursor.getString(actual_image_column_index);
Toast.makeText(getApplicationContext(), img_path, 1000).show();
File file = new File(img_path);
这个方法还是简单吧。
Intent的其他系统用法:
1.打开摄像头:
Intent i = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i,2);
2.拨打电话:
Uri callUri=Uri.parse("tel:1008611");
new Intent(Intent.ACTION_CALL,uri)
如果还有其他需要的话:
这两个链接应该可以满足你:http://blog.csdn.net/chaod5659/article/details/16844907
http://zheyiw.iteye.com/blog/1782665
接下来我们说下Intent的在activity中的跳转问题:
1.Intent可以作为跳转的目的性,只要用了
Intent.selcass();就好了
2.关于Intent传递数据的问题:
传递简单数据:比如Int,double,float这种,都很简单,要么直接用Intent去封装,要直接用bundle去封装也可以。
传递对象数据:1.如果我们需要传递一个对象呢?andorid的Bundle提供了一个putSerializable();方法,传入的对象必须是实现了java的序列化的对象,
什么是java对象序列化呢?j简单的说:就是把一个heap空间中的对象,变成文本形式的二进制流一样,然后用流的方法去传递这个对象,所以,我们在这里能理解到,Intent传递对象的时候,不是传递对象的引用(address),而是传递了整个对象过去.所以,在开发的时候,你一定要注意,你传递对象的大小问题,这个程序性能很挂钩的哈!
最后说下我最近在项目中碰见个一个问题:如何让一张图片在actvitiy中跳转呢?
1.我看到网上有些方法的是说,把bitmap对象传递,我想说,这种方式我试过了,要出错的,原因的话,我想,就是序列化的问题吧,bitmap这种吃内存的小胖子,android是不允许在activity中传递的。
2于是,我想到了把bitmap变成一个Byte数组,然后在对象上传递,好吧,这样是可以了,但是,可能是手机低端吧,直接卡到不能动了,想想也是,把bitmap变成byte数组,然后在序列化,在传递,这样的方法是极大的耗费性能的。也不行。
之后我想到了两种解决办法:
1.设置一快静态变量,然后共享这个静态变量。
这种方式其实不好,因为我们知道,静态变量一旦定义,将一直存在于整个系统运行的整个过程,java垃圾回收机制,永远不会回收它占用的内存,定义过多必然造成大量占用java虚拟机的内存,影响系统的数据处理过程,甚者造成内存溢出。尤其是bitmap这种静态变量,最好不要这样用。其次,如果你的程序写的不好,静态变量被多处修改使用,是很危险的。多的时候你的BUG都会难调无比。
2.这种方式我比较推荐的,虽然速度不如上一种方法:
对图片做缓存,写到手机的磁盘(SD卡)上,作为缓存,然后直接传递一个图片的路径的string给actvitiy,再去写入这个图片的bitmap,这种方法虽然没有上一种那么高效,但是,确实我认为比较好的方法了:
首先,这个图片的bitmap的是开放在heap中的,你可以实行回收机制,第二是,避免了static变量的使用。
其实,这种方式也不慢,写一个文件而已,真心快。(其实就是以时间换空间);