http://blog.csdn.net/kieven2008/article/details/60069051.基于消息的通信機(jī)制 Intent ---boudle ,extra 數(shù)據(jù)類型有限,比如遇到不可序列化的數(shù)據(jù)Bitmap,InputStream, 或者LinkList鏈表等等數(shù)據(jù)類型就不太好用。
2. 利用static靜態(tài)數(shù)據(jù), public static成員變量;
3.基于外部存儲(chǔ)的傳輸, File/Preference/ Sqlite ,如果要針對(duì)第三方應(yīng)用需要Content Provider
4.基于IPC的通信機(jī)制
context 與Service之間的傳輸,如Activity與Service之間的通信,定義AIDL接口文件。
示例: http://www.eoeandroid.com/thread-36249-1-1.html
5. 基于Application Context, 例子如下文:
在當(dāng)前Activity將兩個(gè)值傳到了Test中。但如果遇到不可序列化的數(shù)據(jù),如Bitmap、InputStream等,intent就無(wú)能為力了。因此,我們很自然地會(huì)想到另外一種方法,靜態(tài)變量。如下面的代碼所示:
public class Product extends Activity
{
public static Bitmap mBitmap;
}
對(duì)于上面的代碼來(lái)說(shuō),其他任何類可以直接使用Product中的mBitmap變量。這么做很easy、也很cool,但卻very very wrong。我們千萬(wàn)不要以為Davlik虛擬機(jī)的垃圾回收器會(huì)幫助我們回收不需要的內(nèi)存垃圾。事實(shí)上,回收器并不可靠,尤其是手機(jī)上,是更加的不可靠。 因此,除非我們要使自己的程序變得越來(lái)越糟糕,否則盡量遠(yuǎn)離static。
注:如果經(jīng)常使用static的Bitmap、Drawable等變量。可能就會(huì)拋出一個(gè)在Android系統(tǒng)中非常著名的異常(以前budget這個(gè)單詞一直記不住什么意思,自從經(jīng)常拋出這個(gè)異常后,這個(gè)單詞終于爛熟于心了, )
ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
如果不使用static,總得有方法來(lái)代替它(盡管我很喜歡public static,我相信很多人也喜歡它,但為了我們的程序,建議還是忍痛割愛(ài)吧),那么這個(gè)新的解決方案就是本文的主題,這就是Application Context,相當(dāng)于Web程序的Application,它的生命周期和應(yīng)用程序一樣長(zhǎng)(這個(gè)我喜歡)。
那么現(xiàn)在來(lái)看看如何使用這個(gè)Application Context。我們可以通過(guò)Context.getApplicationContext或Context.getApplication方法獲得 Application Context。但要注意,我們獲得的只是Context對(duì)象,而更理想的方法是獲得一個(gè)類的對(duì)象。ok,說(shuō)干就干,下面來(lái)定義一個(gè)類。
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;
}
}
上面這個(gè)類和普通的類沒(méi)什么本質(zhì)的不同。但該類是Application的子類。對(duì)了,這就是使用Application Context的第一步,定義一個(gè)繼承自Application的類。然后呢,就在這個(gè)類中定義任何我們想使其全局存在的變量了,如本例中的 Bitmap。下面還需要一個(gè)重要的步驟,就是在<application>標(biāo)簽中使用android:name屬性來(lái)指定這個(gè)類,代碼如 下:
< application android:name =".MyApp" android:icon ="@drawable/icon" android:label ="@string/app_name" >
</ application?
接下來(lái)的最后一步就是向MyApp對(duì)象中存入Bitmap對(duì)象,或從MyApp對(duì)象中取出Bitmap對(duì)象了,存入Bitmap對(duì)象的代碼如下:
MyApp myApp = (MyApp)getApplication();
Bitmap bitmap = BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
myApp.setBitmap(bitmap);
獲得Bitmap對(duì)象的代碼:
ImageView imageview = (ImageView)findViewById(R.id.ivImageView);
MyApp myApp = (MyApp)getApplication();
imageview.setImageBitmap(myApp.getBitmap());
上面兩段代碼可以在任何的Service、Activity中使用。全局的。
參考:
1.http://flyvenus.net/?p=229
2.http://blog.csdn.net/nokiaguy/archive/2010/11/10/5998986.aspx