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就无能为力了。因此,我们很自然地会想到另外一种方法,静态变量。如下面的代码所示:
对于上面的代码来说,其他任何类可以直接使用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
2、在其它Activity中调用
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
数据类型有限,比如遇到不可序列化的数据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;
- }
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;
- }
- }
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.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; @Overridepublic 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 {@Overridepublic 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");
- }
- }
- }
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;@Overridepublic 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 {@Overridepublic 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
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径(转)
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径(1)
- android 应用程序Activity之间数据传递与共享的几种途径(2)
- android 应用程序Activity之间数据传递与共享的几种途径
- android 应用程序Activity之间数据传递与共享的几种途径
- Android 应用程序Activity之间数据传递与共享的几种途径你知道吗
- Activity之间数据传递与共享的几种途径(bitmap篇)&异步加载&service
- Activity之间数据传递与共享的几种途径-- bitmap篇
- Activity之间数据传递与共享的几种途径(bitmap篇)
- Android activity之间传递数据的几种方法
- 【Android 开发】 : Activity之间传递数据的几种方式
- 【Android 开发】 : Activity之间传递数据的几种方式
- 【Android 开发】 : Activity之间传递数据的几种方式
- 黯然相爱,寂寞欢喜
- 浅谈HTTP中Get与Post的区别
- ADB---Command
- Struts2拦截器浅谈
- in ubuntu config tftp and nfs
- android 应用程序Activity之间数据传递与共享的几种途径
- 电影记录管理系统十[权限设置]
- Animation Scripts, Libraries and Plugins
- getContentResolver().query 和 managedQuery 的区别
- // 程序员面试宝典 62页 ,指针,引用,const常量定以后立即初始化。
- ASP.NET Page Life Cycle Overview
- bitnami redmine 备份
- // 在利用子函数实现内存堆分配的实现时出现的问题,同时也需要利用子函数实现内存堆的释放。
- Core Data 自动生成及基本数据操作(2)