`
Tony_Lee-S
  • 浏览: 83373 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
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就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:


   
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对象,而更理想的方法是获得一个类的对象。
1、新建一个类,继承自Application
package activity.com;

import android.app.Application;

public  class  MyApplication  extends  Application{

 private String myString="start";

public String getMyString() {

return myString;

}

public void setMyString(String myString) {

this.myString = myString;

}

}

2、在其它Activity中调用
package activity.com;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class FirstActivity extends Activity {
private TextView myTextView = null;
private Button myButton = null;
     MyApplication myApplication;   
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
myTextView = (TextView) findViewById(R.id.myTextView);
myTextView.setText("This is first TextView");
myButton = (Button) findViewById(R.id.myButton);
myButton.setText("First Button");
myButton.setOnClickListener(new myOnClickListener());
myApplication=(MyApplication) getApplication();
}
class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
String state = myApplication.getMyString();
Log.d("TEMP", "First获取数据:"+state);
myApplication.setMyString("First");
Log.d("TEMP", "First更改数据为数据:"+"First");
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
FirstActivity.this.startActivity(intent);
}
}
}


package activity.com;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SecondActivity extends Activity{
private Button myButton2 = null;
private TextView myTextView2 = null;
MyApplication myApplication;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
System.out.println("2->1");
myTextView2 =(TextView)findViewById(R.id.myTextView2);
myTextView2.setText("This is second TextView");
System.out.println("2->2");
myButton2 = (Button)findViewById(R.id.myButton2) ;
myButton2.setText("Second Button");
myButton2.setOnClickListener(new myOnClickListener());
System.out.println("2->3");
myApplication=(MyApplication) getApplication();
}
class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
String state = myApplication.getMyString();
Log.d("TEMP", "Second获取数据:"+state);
myApplication.setMyString("Second");
Log.d("TEMP", "Second更改数据为数据:"+"Second");

}
}
}

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

转自:
http://www.cnblogs.com/playing/archive/2011/03/10/1980047.html
http://blog.csdn.net/liuwise/article/details/7637040
分享到:
评论

相关推荐

    Android组件与数据存储安全分析及实战

    4. Content Provider安全性:Content Provider用于在应用程序之间共享数据。在设计Content Provider时,需确保只共享必要的数据,并对访问数据的请求进行严格的权限检查。同时,防止SQL注入等常见的数据访问漏洞。 ...

    Android学习之数据存储.7z

    下面我们将详细探讨Android中的几种主要数据存储方式。 1. **SharedPreferences** SharedPreferences是Android中最简单的数据存储方式,常用于保存应用的配置设置。它是一个轻量级的存储系统,支持键值对形式的...

    Android—PPT

    9. **内容提供者(ContentProvider)**:ContentProvider用于在应用间共享数据,是访问Android系统资源(如联系人、日历)的标准途径。 10. **权限管理**:Android应用需要声明并获取相应的权限才能访问特定资源,...

    Android开发指南中文版

    - **ContentProvider**:用于存储和检索数据,使不同应用程序之间可以共享数据。 2. **应用程序组件** - 应用程序由多个组件构成,包括Activity、Service、BroadcastReceiver以及ContentProvider等。每个组件都...

    安卓Android源码——高仿基于2.2(Froyo)的Contacts.zip

    ContentProvider是Android系统提供的一种数据共享机制,使得不同应用之间可以安全地读写数据。ContactsContract类是与Contacts相关的ContentProvider的接口,定义了各种数据表和常量,如RawContacts、Data、Groups等...

    activity切换动画

    Android系统本身就提供了几种预定义的切换动画,如`slide`(滑动)和`explode`(爆炸)。要使用这些动画,我们可以在`AndroidManifest.xml`中针对每个`&lt;activity&gt;`标签设置`android:enterAnimation`和`android:...

    android APIDemo 源码

    3. **ContentProvider**:ContentProvider是Android中数据共享的桥梁,可以实现应用间的数据库、文件等数据交互。Demo中会展示如何创建和使用ContentProvider,以及如何通过Uri进行数据操作。 4. **...

Global site tag (gtag.js) - Google Analytics