Android学习笔记二分析.docx

上传人:b****7 文档编号:10540664 上传时间:2023-02-21 格式:DOCX 页数:109 大小:1.36MB
下载 相关 举报
Android学习笔记二分析.docx_第1页
第1页 / 共109页
Android学习笔记二分析.docx_第2页
第2页 / 共109页
Android学习笔记二分析.docx_第3页
第3页 / 共109页
Android学习笔记二分析.docx_第4页
第4页 / 共109页
Android学习笔记二分析.docx_第5页
第5页 / 共109页
点击查看更多>>
下载资源
资源描述

Android学习笔记二分析.docx

《Android学习笔记二分析.docx》由会员分享,可在线阅读,更多相关《Android学习笔记二分析.docx(109页珍藏版)》请在冰豆网上搜索。

Android学习笔记二分析.docx

Android学习笔记二分析

笔记二

Activity数据传递

1.通过Intent传递数据

1)基本类型传值

=>发送

Intentintent=newIntent();

intent.setAction("android.intent.action.CALL");//指定动作名称

intent.addCategory(Intent.CATEGORY_DEFAULT);

//传递参数

intent.putExtra("name","XXX");

intent.putExtra("age",20);

startActivity(intent);

=>接收

Bundlebundle=getIntent().getExtras();

intage=bundle.getInt("age");

Stringname=bundle.getString("name");

2)对象传值

intent中的方法putExtra(key,类型)没有传递为具体实体类的参数,它需要通过序列化后才可以在putExtra方法中进行传值,其中有两种方式:

Serializable接口=>putExtra(stringname,Serializablevalue)

Parcelable接口=>putExtra(stringname,Parcelablevalue)

这两种方式除了创建实体类的时候不一样之外,在其它地方的调用和穿件完全一致。

Serializable方式:

来自javaAPI

Serializable会将对象序列化到本地,是持久化的操作

实例化对象:

=>发送

UserInfouserInfo=newUserInfo();

userInfo.setName("XXX");

userInfo.setAge(20);

Intentintent=newIntent();

intent.setAction("android.intent.action.CALL");

intent.addCategory(Intent.CATEGORY_DEFAULT);

intent.putExtra("userInfo",userInfo);

startActivity(intent);

=>接收

Bundlebundle=getIntent().getExtras();

UserInfouserInfo=(UserInfo)bundle.get("userInfo");

Parcelable方式:

来自AndroidAPI

Parcelable仅仅将对象序列号到内存中,这样可以提高效率。

Activity之间的数据传递建议用Parcelable,这样可以大大提高效率。

Parcelable不像Serializable那样序列化和反序列化已经写好,它需要自己处理。

实体类:

packagecn.example.iphone;

importandroid.os.Parcel;

importandroid.os.Parcelable;

publicclassUserInfoimplementsParcelable{

privateStringname;

privateintage;

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicintgetAge(){

returnage;

}

publicvoidsetAge(intage){

this.age=age;

}

@Override

publicintdescribeContents(){

return0;

}

/*

*获取值

*注意:

这是一个静态对象,并且CREATOR是固定的,必须大写

*/

publicstaticParcelable.CreatorCREATOR=newCreator(){

@Override

publicUserInfo[]newArray(intsize){

//TODOAuto-generatedmethodstub

returnnull;

}

/*

*将传递的成员变量进行反序列化

*注意:

1、反序列化的成员变量赋值顺序必须与序列号的成员变量顺序一样。

*2、必须返回return

*/

@Override

publicUserInfocreateFromParcel(Parcelsource){

UserInfouserInfo=newUserInfo();

userInfo.getName(source.readString());

userInfo.getAge(source.readInt());

returnuserInfo;

}

};

/*

*将需要传递的成员变量序列化(必须)

*/

@Override

publicvoidwriteToParcel(Parceldest,intflags){

dest.writeString(name);

dest.writeInt(age);

}

}

=>发送

UserInfouserInfo=newUserInfo();

userInfo.setName("XXX");

userInfo.setAge(20);

Intentintent=newIntent();

intent.setAction("android.intent.action.CALL");

intent.addCategory(Intent.CATEGORY_DEFAULT);

intent.putExtra("userInfo",userInfo);

startActivity(intent);

=>接收

Bundlebundle=getIntent().getExtras();

UserInfouserInfo=(UserInfo)bundle.get("userInfo");

2.通过静态变量传递数据

Intent无法传递无法被序列化的对象,此时需要用静态变量传递数据。

案例:

从MainActivity跳转到OtherActivity页面:

MainActivity:

OtherActivity:

如果,全局变量没有被回收,将会一直占用内存。

3.通过剪切板传递数据

这种情况一般在应用程序间传递数据比较常用,如从QQ中复制内容电话号码,粘贴到添加电话簿。

4.通过全局变量传递数据

JavaWeb四个作用域:

Page

其中,Application域在应用程序的任何地方都可以使用和访问

Android中的全局对象非常类似于JavaWeb中的Application域,除非Android应用程序清楚内存,否则全局对象将一直可以访问。

案例:

创建MainActivity、OtherActivity和MyApplication

MyApplication:

packagecom.example.application;

importjava.util.HashMap;

importandroid.app.Application;

//应用程序启动时,最先创建的是Application,并执行onCreate方法

publicclassMyApplicationextendsApplication{

//通过Map集合保存需要传递的数据,这样可以减少成员变量的创建。

privateHashMapmap=newHashMap();

publicHashMapgetMap(){

returnmap;

}

publicvoidsetMap(HashMapmap){

this.map=map;

}

//Activity可以通过getApplication()方法获取Application对象。

//但是,并不是所有的类都有getApplication()方法获取Application对象,所以需要在MyApplication内部单例化instance供其它使用和访问。

privatestaticMyApplicationinstance;

publicstaticMyApplicationgetInstance(){

returninstance;

}

@Override

publicvoidonCreate(){

super.onCreate();

this.instance=this;

}

}

MainActivity:

publicclassMainActivityextendsActivity{

privateButtonbtn_tiaozhuan;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn_tiaozhuan=(Button)findViewById(R.id.btn_tiaozhuan);

btn_tiaozhuan.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,OtherActivity.class);

//方式一:

Activity可以通过getApplication()直接获取Application

//MyApplicationapp=(MyApplication)getApplication();

//方式二:

通过在MyApplication里面封装的方法获取MyApplicationMyApplicationapp=MyApplication.getInstance();

app.getMap().put("data1","王二");

app.getMap().put("data2","张三");

startActivity(intent);

}

});

}

}

OtherActivity:

publicclassOtherActivityextendsActivity{

//方式一:

Activity可以通过getApplication()直接获取Application

//MyApplicationapp=(MyApplication)getApplication();

//方式二:

获取MyApplication

MyApplicationapp=MyApplication.getInstance();

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

Log.d("OtherActivity",(String)app.getMap().get("data1"));

Log.d("OtherActivity",(String)app.getMap().get("data2"));

}

@Override

protectedvoidonDestroy(){

super.onDestroy();

//清楚集合数据,否则占用内存

app.getMap().remove("data1");

app.getMap().remove("data2");

}

}

配置:

android:

allowBackup="true"

//指定创建的MyApplication,默认情况下穿件Application

android:

name="com.example.application.MyApplication"

android:

icon="@drawable/ic_launcher"

android:

label="@string/app_name"

android:

theme="@style/AppTheme">

android:

name="com.example.application.MainActivity"

android:

label="@string/app_name">

name="android.intent.action.MAIN"/>

name="android.intent.category.LAUNCHER"/>

name="com.example.application.OtherActivity"/>

Activity返回数据

创建三个Activity,分别是:

MainActivity:

主体页面,接收弹出页面返回的数据页面

描述:

设置三个按钮通过点击弹出Activity,并接收处理返回的数据结果

按钮1和按钮2:

弹出同一个ResultActivity页面,但是他们传递的请求码不同,用来标识按钮一和按钮二的数据处理。

按钮1/2和按钮3:

分别弹出ResultActivity和NewActivity页面,这两个请求码,可以不区分,但是从两个页面传回了不同的结果码,这样就可以知道返回的数据来至哪个页面,并作出相应的处理。

ResultActivity:

弹出页面,返回结果数据

描述:

用于测试同一个按钮弹出同一个页面返回数据处理(测试请求码)

NewActivity:

弹出页面,返回结果数据

描述:

和ResultActivity搭配测试弹出不同页面返回数据处理(测试结果码)

MainActivity页面:

privateEditTextet_phoneNumber;

privateButtonbtn_selectLianxiRen;

privateEditTextet_phoneNumber2;

privateButtonbtn_selectLianxiRen2;

privateEditTextet_showContent;

privateButtonbtn_getContent;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

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);

//按钮一点击事件

btn_selectLianxiRen=(Button)findViewById(R.id.btn_selectLianxiRen);

btn_selectLianxiRen.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,ResultActivity.class);

//第二个参数(resultCode---请求码)

startActivityForResult(intent,1);

}

});

//按钮二点击事件

btn_selectLianxiRen2=(Button)findViewById(R.id.btn_selectLianxiRen2);

btn_selectLianxiRen2.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,

ResultActivity.class);

//第二个参数(resultCode---请求码)

startActivityForResult(intent,2);

}

});

//按钮三点击事件

btn_getContent=(Button)findViewById(R.id.btn_getContent);

btn_getContent.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent(MainActivity.this,

NewActivity.class);

//第二个参数(resultCode---请求码)

startActivityForResult(intent,0);

}

});

}

/*所有Activity返回的数据结果都是onActivityResult方法接收并处理

*requestCode:

请求码用于标识请求源(请求码一般用于区分本页面不同按钮处理结果)

*resultCode:

结果码用于标识结果源(结果码一般用于区分Activity返回的处理结果)

*请求码和结果码就是一个标识作用,程序员自己设置,只要能区分就可以。

*data:

返回数据(Intent类型)

*/

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

//必须对返回数据作出判断,否则当Activity中直接点击返回按钮的时候,data值为null此时不做处理会报异常。

if(data==null)return;

//获取返回数据

Bundlebundle=data.getExtras();

StringphoneNumber=bundle.getString("phone");

//判断请求码,可以知道是哪个按钮点击,并作出相应的处理

switch(requestCode){

case1:

et_phoneNumber.setText(phoneNumber);break;

case2:

et_phoneNumber2.setText(phoneNumber);break;

}

//判断结果码,可以知道数据源来至哪里

if(resultCode==500){

et_showContent.setText(bundle.getString("content"));

}

}

ResultActivity页面:

publicclassResultActivityextendsActivity{

privateTextViewtv_phone1;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_result);

//按钮点击返回数据结果

tv_phone1=(TextView)findViewById(R.id.tv_phoneNumber1);

tv_phone1.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

Intentintent=newIntent();

intent.putExtra("phone",tv_phone1.getText().toString());

//第一个参数(resultCode----结果码)

setResult(0,intent);

finish();//关闭(销毁)Activity

}

});

}

}

NewActivity页面:

publicclassNewActivityextendsActivity{

privateTextViewtv_content;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

//TODOAuto-generatedmethodstub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_new);

//按钮点击返回数据结果

tv_content=(TextView)findViewById(R.id.tv_content);

tv_content.setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1