1、Android学习笔记二分析笔记二Activity数据传递1.通过Intent传递数据1)基本类型传值=发送Intent intent = new Intent();intent.setAction(android.intent.action.CALL);/ 指定动作名称intent.addCategory(Intent.CATEGORY_DEFAULT); /传递参数intent.putExtra(name, XXX);intent.putExtra(age, 20);startActivity(intent);=接收Bundle bundle=getIntent().getExtras()
2、;int age=bundle.getInt(age);String name=bundle.getString(name);2)对象传值intent中的方法putExtra(key,类型)没有传递为具体实体类的参数,它需要通过序列化后才可以在putExtra方法中进行传值,其中有两种方式:Serializable接口 =putExtra(string name,Serializable value) Parcelable接口 =putExtra(string name,Parcelable value) 这两种方式除了创建实体类的时候不一样之外,在其它地方的调用和穿件完全一致。Seriali
3、zable方式:来自java APISerializable会将对象序列化到本地,是持久化的操作实例化对象:=发送UserInfo userInfo=new UserInfo();userInfo.setName(XXX);userInfo.setAge(20); Intent intent = new Intent();intent.setAction(android.intent.action.CALL); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra(userInfo,userInfo);startActivit
4、y(intent);=接收Bundle bundle=getIntent().getExtras();UserInfo userInfo=(UserInfo)bundle.get(userInfo); Parcelable方式:来自Android APIParcelable仅仅将对象序列号到内存中,这样可以提高效率。Activity之间的数据传递建议用Parcelable,这样可以大大提高效率。Parcelable不像Serializable那样序列化和反序列化已经写好,它需要自己处理。实体类:package cn.example.iphone;import android.os.Parcel
5、;import android.os.Parcelable;public class UserInfo implements Parcelable private String name ; private int age; public String getName() return name; public void setName(String name) this.name = name; public int getAge() return age; public void setAge(int age) this.age = age; Override public int des
6、cribeContents() return 0; /* 获取值* 注意:这是一个静态对象,并且 CREATOR是固定的,必须大写*/public static Parcelable.Creator CREATOR=new Creator() Override public UserInfo newArray(int size) / TODO Auto-generated method stub return null; /* * 将传递的成员变量进行反序列化 * 注意:1、反序列化的成员变量赋值顺序必须与序列号的成员变量顺序一样。 * 2、必须返回return */ Override pub
7、lic UserInfo createFromParcel(Parcel source) UserInfo userInfo=new UserInfo(); userInfo.getName(source.readString(); userInfo.getAge(source.readInt(); return userInfo; ; /* * 将需要传递的成员变量序列化(必须) */ Override public void writeToParcel(Parcel dest, int flags) dest.writeString(name); dest.writeInt(age); =
8、发送UserInfo userInfo=new UserInfo();userInfo.setName(XXX);userInfo.setAge(20); Intent intent = new Intent();intent.setAction(android.intent.action.CALL); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra(userInfo,userInfo);startActivity(intent);=接收Bundle bundle=getIntent().getExtras();User
9、Info userInfo=(UserInfo)bundle.get(userInfo); 2.通过静态变量传递数据Intent无法传递无法被序列化的对象,此时需要用静态变量传递数据。案例:从MainActivity跳转到OtherActivity页面:MainActivity:OtherActivity:如果,全局变量没有被回收,将会一直占用内存。3.通过剪切板传递数据这种情况一般在应用程序间传递数据比较常用,如从QQ中复制内容电话号码,粘贴到添加电话簿。4.通过全局变量传递数据Java Web四个作用域:Page Request Session Application其中,Applicat
10、ion域在应用程序的任何地方都可以使用和访问Android中的全局对象非常类似于Java Web中的Application域,除非Android应用程序清楚内存,否则全局对象将一直可以访问。案例:创建MainActivity、OtherActivity和MyApplicationMyApplication:package com.example.application; import java.util.HashMap;import android.app.Application;/应用程序启动时,最先创建的是Application,并执行onCreate方法public class MyAp
11、plication extends Application /通过Map集合保存需要传递的数据,这样可以减少成员变量的创建。 private HashMap map = new HashMap(); public HashMap getMap() return map; public void setMap(HashMap map) this.map = map; /Activity可以通过getApplication()方法获取Application对象。 /但是,并不是所有的类都有getApplication()方法获取Application对象,所以需要在MyApplication 内部
12、单例化instance供其它使用和访问。 private static MyApplication instance; public static MyApplication getInstance() return instance; Override public void onCreate() super.onCreate(); this.instance = this; MainActivity:public class MainActivity extends Activity private Button btn_tiaozhuan; Override protected void
13、 onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_tiaozhuan=(Button) findViewById(R.id.btn_tiaozhuan); btn_tiaozhuan.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent=new Intent(MainActivity.
14、this,OtherActivity.class);/方式一:Activity可以通过getApplication()直接获取Application/MyApplication app=(MyApplication)getApplication(); /方式二:通过在MyApplication里面封装的方法获取MyApplication MyApplication app=MyApplication.getInstance(); app.getMap().put(data1,王二); app.getMap().put(data2,张三); startActivity(intent); ); O
15、therActivity:public class OtherActivity extends Activity/方式一:Activity可以通过getApplication()直接获取Application/MyApplication app=(MyApplication)getApplication(); /方式二:获取MyApplication MyApplication app=MyApplication.getInstance(); Override protected void onCreate(Bundle savedInstanceState) super.onCreate(s
16、avedInstanceState); Log.d(OtherActivity,(String) app.getMap().get(data1); Log.d(OtherActivity,(String) app.getMap().get(data2); Override protected void onDestroy() super.onDestroy(); /清楚集合数据,否则占用内存 app.getMap().remove(data1); app.getMap().remove(data2); 配置: Activity返回数据创建三个Activity,分别是:MainActivity:
17、主体页面,接收弹出页面返回的数据页面描述:设置三个按钮通过点击弹出Activity,并接收处理返回的数据结果 按钮1和按钮2:弹出同一个ResultActivity页面,但是他们传递的请求码不同,用来标识按钮一和按钮二的数据处理。 按钮1/2和按钮3:分别弹出ResultActivity和NewActivity页面,这两个请求码,可以不区分,但是从两个页面传回了不同的结果码,这样就可以知道返回的数据来至哪个页面,并作出相应的处理。 ResultActivity:弹出页面,返回结果数据描述:用于测试同一个按钮弹出同一个页面返回数据处理(测试请求码)NewActivity:弹出页面,返回结果数据描
18、述:和ResultActivity搭配测试弹出不同页面返回数据处理(测试结果码)MainActivity页面:private EditText et_phoneNumber; private Button btn_selectLianxiRen; private EditText et_phoneNumber2; private Button btn_selectLianxiRen2; private EditText et_showContent; private Button btn_getContent; Override protected void onCreate(Bundle s
19、avedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /三个文本框用于赋值 et_phoneNumber = (EditText) findViewById(R.id.et_phoneNumber); et_phoneNumber2 = (EditText) findViewById(R.id.et_phoneNumber2); et_showContent = (EditText) findViewById(R.id.et_showContent); /按钮
20、一点击事件 btn_selectLianxiRen = (Button) findViewById(R.id.btn_selectLianxiRen); btn_selectLianxiRen.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent =new Intent(MainActivity.this, ResultActivity.class); / 第二个参数(resultCode-请求码) startActivityForResult(intent, 1)
21、; ); /按钮二点击事件 btn_selectLianxiRen2 = (Button) findViewById(R.id.btn_selectLianxiRen2); btn_selectLianxiRen2.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent = new Intent(MainActivity.this, ResultActivity.class); /第二个参数( resultCode-请求码) startActivityForResul
22、t(intent, 2); ); /按钮三点击事件 btn_getContent = (Button) findViewById(R.id.btn_getContent); btn_getContent.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent = new Intent(MainActivity.this, NewActivity.class); /第二个参数( resultCode-请求码) startActivityForResult(intent,
23、0); );/*所有Activity返回的数据结果都是onActivityResult方法接收并处理* requestCode:请求码用于标识请求源(请求码一般用于区分本页面不同按钮处理结果)* resultCode:结果码用于标识结果源(结果码一般用于区分Activity返回的处理结果)* 请求码和结果码就是一个标识作用,程序员自己设置,只要能区分就可以。* data:返回数据(Intent类型)*/Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) /必须对返回数据作出判
24、断,否则当Activity中直接点击返回按钮的时候,data值为null此时不做处理会报异常。 if (data = null) return;/获取返回数据 Bundle bundle = data.getExtras(); String phoneNumber = bundle.getString(phone);/判断请求码,可以知道是哪个按钮点击,并作出相应的处理 switch (requestCode) case 1: et_phoneNumber.setText(phoneNumber); break; case 2: et_phoneNumber2.setText(phoneNum
25、ber); break; /判断结果码,可以知道数据源来至哪里 if(resultCode=500) et_showContent.setText(bundle.getString(content); ResultActivity页面:public class ResultActivity extends Activity private TextView tv_phone1; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentVie
26、w(R.layout.activity_result); /按钮点击返回数据结果 tv_phone1=(TextView) findViewById(R.id.tv_phoneNumber1); tv_phone1.setOnClickListener(new OnClickListener() Override public void onClick(View v) Intent intent=new Intent(); intent.putExtra(phone,tv_phone1.getText().toString(); /第一个参数(resultCode-结果码) setResult
27、(0,intent); finish();/关闭(销毁)Activity ); NewActivity页面:public class NewActivity extends Activity private TextView tv_content; Override protected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_new); /按钮点击返回数据结果 tv_content=(TextView) findViewById(R.id.tv_content); tv_content.setOnClickListener(new OnClickListener() Override public void onClick(View v)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1