博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android实例] Activity之间数据传递与共享的几种途径(bitmap篇)
阅读量:4655 次
发布时间:2019-06-09

本文共 2425 字,大约阅读时间需要 8 分钟。

1.基于消息的通信机制  Intent ---boudle ,extra 
    数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。 
2. 利用static静态数据, public static成员变量; 
3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider 
4.基于IPC的通信机制 
    context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。 
   示例:  
5. 基于Application Context, 例子如下文: 
在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示: 
代码片段,双击复制
01
02
03
04
05
public  
class  
Product  
extends  
Activity
   
{
         
public  
static  
Bitmap mBitmap;
           
   
}
对于上面的代码来说,其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool,但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上,回收器并不可靠,尤其是手机上,是更加的不可靠。 因此,除非我们要使自己的程序变得越来越糟糕,否则尽量远离static。 
注:如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常(以前budget这个单词一直记不住什么意思,自从经常抛出这个异常后,这个单词终于烂熟于心了, ) 
ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
如果不使用static,总得有方法来代替它(尽管我很喜欢public static,我相信很多人也喜欢它,但为了我们的程序,建议还是忍痛割爱吧),那么这个新的解决方案就是本文的主题,这就是Application Context,相当于Web程序的Application,它的生命周期和应用程序一样长(这个我喜欢)。 
那么现在来看看如何使用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得 Application Context。但要注意,我们获得的只是Context对象,而更理想的方法是获得一个类的对象。ok,说干就干,下面来定义一个类。 
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package  
net.blogjava.mobile1;
import  
android.app.Application;
import  
android.graphics.Bitmap;
public  
class  
MyApp  
extends  
Application
{
     
private  
Bitmap mBitmap;
     
public  
Bitmap getBitmap()
   
{
         
return  
mBitmap;
   
}
     
public  
void  
setBitmap(Bitmap bitmap)
   
{
         
this
.mBitmap  =  bitmap;
   
}
     
}
上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了,这就是使用Application Context的第一步,定义一个继承自Application的类。然后呢,就在这个类中定义任何我们想使其全局存在的变量了,如本例中的 Bitmap。下面还需要一个重要的步骤,就是在<application>标签中使用android:name属性来指定这个类,代码如 下: 
代码片段,双击复制
01
02
03
< application  android:name =
".MyApp"  
android:icon =
"@drawable/icon"  
android:label =
"@string/app_name"
>
 
</ application>
接下来的最后一步就是向MyApp对象中存入Bitmap对象,或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下: 
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
MyApp myApp  =  (MyApp)getApplication();
         
   
Bitmap bitmap  =  BitmapFactory.decodeResource(
this
.getResources(), R.drawable.icon);
         
   
myApp.setBitmap(bitmap);
   
获得Bitmap对象的代码:
   
ImageView imageview  =  (ImageView)findViewById(R.id.ivImageView);
         
   
MyApp myApp  =  (MyApp)getApplication();
         
   
imageview.setImageBitmap(myApp.getBitmap());
上面两段代码可以在任何的Service、Activity中使用。全局的。 

转载于:https://www.cnblogs.com/hudabing/archive/2013/06/08/3126970.html

你可能感兴趣的文章
InputStream 转换 InputStreamReader再转换BufferedReader
查看>>
在线程池中的使用spring aop事务增强
查看>>
javascript相关知识
查看>>
数组对象去重
查看>>
你未必知道的12个JavaScript技巧
查看>>
mysql的基本操作命令
查看>>
微信小程序---数据缓存
查看>>
Python网页正文转换语音文件的操作方法
查看>>
常用SQL查询语句
查看>>
Redis Windows版安装详解
查看>>
linux后台运行python程序 nohup
查看>>
吴裕雄--天生自然 高等数学学习:对面积的曲面积分
查看>>
css
查看>>
Web应用程序整体测试基础——单元测试
查看>>
通过修改manifest文件来解决Vista/Win7/Win8/win10下应用程序兼容性问题
查看>>
Spark使用总结与分享
查看>>
Line 7.10 : Syntax error
查看>>
[转] 树状数组学习
查看>>
将url的查询参数解析成字典对象
查看>>
Redis与RabbitMQ作为消息队列的比较
查看>>