android 应用程序Activity之间数据传递与共享的几种途径

来源:互联网 发布:面试淘宝客服无经验的 编辑:程序博客网 时间:2024/05/19 20:48
1.基于消息的通信机制  Intent ---boudle ,extra

    数据类型有限,比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。

2. 利用static静态数据, public static成员变量;

3.基于外部存储的传输,  File/Preference/ Sqlite ,如果要针对第三方应用需要Content Provider


4.基于IPC的通信机制

    context 与Service之间的传输,如Activity与Service之间的通信,定义AIDL接口文件。

   示例: http://www.eoeandroid.com/thread-36249-1-1.html

5. 基于Application Context, 例子如下文:


    在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据,如Bitmap、InputStream等,intent就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:


   
Java代码 复制代码 收藏代码
  1. public  class  Product  extends  Activity   
  2.    {   
  3.          public  static  Bitmap mBitmap;   
  4.              
  5.    }  

    对于上面的代码来说,其他任何类可以直接使用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对象,而更理想的方法是获得一个类的对象。
1、新建一个类,继承自Application
Java代码 复制代码 收藏代码
  1. package activity.com;   
  2.   
  3. import android.app.Application;   
  4.   
  5. public  class  MyApplication  extends  Application{   
  6.   
  7.  private String myString="start";   
  8.   
  9. public String getMyString() {   
  10.   
  11. return myString;   
  12.   
  13. }   
  14.   
  15. public void setMyString(String myString) {   
  16.   
  17. this.myString = myString;   
  18.   
  19. }   
  20.   
  21. }  

2、在其它Activity中调用
Java代码 复制代码 收藏代码
  1. package activity.com;   
  2. import android.app.Activity;   
  3. import android.content.Intent;   
  4. import android.os.Bundle;   
  5. import android.util.Log;   
  6. import android.view.View;   
  7. import android.widget.Button;   
  8. import android.widget.TextView;   
  9. public class FirstActivity extends Activity {   
  10. private TextView myTextView = null;   
  11. private Button myButton = null;   
  12.      MyApplication myApplication;      
  13. @Override  
  14. public void onCreate(Bundle savedInstanceState) {   
  15. super.onCreate(savedInstanceState);   
  16. setContentView(R.layout.first);   
  17. myTextView = (TextView) findViewById(R.id.myTextView);   
  18. myTextView.setText("This is first TextView");   
  19. myButton = (Button) findViewById(R.id.myButton);   
  20. myButton.setText("First Button");   
  21. myButton.setOnClickListener(new myOnClickListener());   
  22. myApplication=(MyApplication) getApplication();   
  23. }   
  24. class myOnClickListener implements View.OnClickListener {   
  25. @Override  
  26. public void onClick(View v) {   
  27. String state = myApplication.getMyString();   
  28. Log.d("TEMP""First获取数据:"+state);   
  29. myApplication.setMyString("First");   
  30. Log.d("TEMP""First更改数据为数据:"+"First");   
  31. Intent intent = new Intent();   
  32. intent.setClass(FirstActivity.this, SecondActivity.class);   
  33. FirstActivity.this.startActivity(intent);   
  34. }   
  35. }   
  36. }  


Java代码 复制代码 收藏代码
  1. package activity.com;   
  2. import android.app.Activity;   
  3. import android.os.Bundle;   
  4. import android.util.Log;   
  5. import android.view.View;   
  6. import android.widget.Button;   
  7. import android.widget.TextView;   
  8. public class SecondActivity extends Activity{   
  9. private Button myButton2 = null;   
  10. private TextView myTextView2 = null;   
  11. MyApplication myApplication;   
  12. @Override  
  13. public void onCreate(Bundle savedInstanceState){   
  14. super.onCreate(savedInstanceState);   
  15. setContentView(R.layout.second);   
  16. System.out.println("2->1");   
  17. myTextView2 =(TextView)findViewById(R.id.myTextView2);   
  18. myTextView2.setText("This is second TextView");   
  19. System.out.println("2->2");   
  20. myButton2 = (Button)findViewById(R.id.myButton2) ;   
  21. myButton2.setText("Second Button");   
  22. myButton2.setOnClickListener(new myOnClickListener());   
  23. System.out.println("2->3");   
  24. myApplication=(MyApplication) getApplication();   
  25. }   
  26. class myOnClickListener implements View.OnClickListener {   
  27. @Override  
  28. public void onClick(View v) {   
  29. String state = myApplication.getMyString();   
  30. Log.d("TEMP""Second获取数据:"+state);   
  31. myApplication.setMyString("Second");   
  32. Log.d("TEMP""Second更改数据为数据:"+"Second");   
  33.   
  34. }   
  35. }   
  36. }  

3、AndroidManifest.xml中的设置:
在 application的name标签中添加MyApplication,如下:
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="MyApplication">
4、变量在一个Activity中改变后,在其它Activity中可以获取改变后的值
04-25 04:32:23.361: DEBUG/TEMP(1130): First获取数据:start
04-25 04:32:23.361: DEBUG/TEMP(1130): First更改数据为数据:First
04-25 04:32:30.891: DEBUG/TEMP(1130): Second获取数据:First
04-25 04:32:30.891: DEBUG/TEMP(1130): Second更改数据为数据:Second
04-25 04:32:36.743: DEBUG/TEMP(1130): First获取数据:Second
04-25 04:32:36.743: DEBUG/TEMP(1130): First更改数据为数据:First
04-25 04:32:39.883: DEBUG/TEMP(1130): Second获取数据:First
04-25 04:32:39.883: DEBUG/TEMP(1130): Second更改数据为数据:Second

原创粉丝点击