展会信息港展会大全

[android,14]14.为应用程序多个activity的应用和数据的传输
来源:互联网   发布日期:2016-01-14 10:28:45   浏览:921次  

导读:一、创建一个自定义界面:1、自定义一个Activity类 要继承系统的Activity类。public classDemo2Activity extends Activity {pu...

一、创建一个自定义界面:

1、自定义一个Activity类 要继承系统的Activity类。

public classDemo2Activity extends Activity {

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main2); //指定布局

}

}

2、在清单文件AndroidManifest.xml中声明一个activity元素

android:icon="@drawable/ic_launcher"

android:label="@string/app_name" >

android:name=".DemoActivity"

android:label="@string/app_name" >

android:name=".Demo2Activity"//配置类名

android:label="我是第二个activity" > //指定标题

//意图过滤器

android:host="cn.itcast" android:path="/gaga"

android:mimeType="audio/mpeg"/>

3、指定布局文件:创建res/layout/main2.xml布局文件:

二、在第一个页面上点击一个按钮跳到第二个页面:

激活组件使用系统提供的Intent类。

三、显示意图:

显示意图 需要知道要激活组件的类名。

显示意图一般用在同一个应用程序中组件的相互激活。

//第一个页面的activity类:

public class DemoActivity extendsActivity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

//点击按钮 跳到第二个页面的方法:

public void click(View view){

// Intent 的作用就是激活组件.

// 显示意图 一般用在同一个应用程序中 组件的相互激活

显示意图的多种写法:

①//Intentintent = new Intent(this,Demo2Activity.class);

Intent intent = new Intent();

②//intent.setClass(this,Demo2Activity.class);

③//intent.setClassName("cn.itcast.mutileactivity",

"cn.itcast.mutileactivity.Demo2Activity");

④//intent.setClassName(this,

"cn.itcast.mutileactivity.Demo2Activity");

⑤//intent.setComponent(newComponentName(this,

"cn.itcast.mutileactivity.Demo2Activity"));

//激活意图:

startActivity(intent);

}

四、隐式意图:

隐式意图主要用在不同程序中的组件间的激活。如拨打电话的意图.

隐式意图:操作系统要根据action data mimetype category 进行一个查询, 所以隐式意图的效率要比现实意图的效率低一点 。

每个activity系统都会默认指定category 为android.intent.category.DEFAULT

1、 在AndroidManifest.xml清单文件中:指定一个意图过滤器:

android:name=".Demo2Activity" //配置类名

android:label="我是第二个activity" > //指定标题

//意图过滤器

//当前意图对应的动作,name的可随意给

//为意图配置数据,当意图的action相同时,根据data数据区分具体的业务。

android:host="cn.itcast" //主机名

android:path="/gaga" //路径

android:mimeType="audio/mpeg"/> //数据类型

//category元素,配置系统给定的意图。

注意:①、一个activity可以配置多个意图过滤器:

②、在定义的意图过滤器中,要根据业务需求指定category元素的属性对应意图和当前意图对应的动作,

2、 隐式意图:页面跳转的点击事件:

//隐式的意图

public void click2(View view){

//用于不同应用程序之间组件的激活

// 操作系统要根据action data mimetype category 进行一个查询

// 隐式意图的效率要比现实意图的效率低一点

Intentintent = new Intent();

//设置动作:将在清单文件指定好的动作设置进来

intent.setAction("cn.itcast.mutileactivity.haha");

//

使用设置数据和类型的方法,itcast://cn.itcast/gaga 为:命名空间://主机名/路径 .都是在清单文件中配置的。

intent.setDataAndType(Uri.parse("itcast://cn.itcast/gaga"),"audio/mpeg");

//添加组件的category

intent.addCategory("android.intent.category.DEFAULT");

startActivity(intent);

注意://设置数据类型

intent.setType("audio/mpeg");

//设置数据

intent.setData(Uri.parse("itcast://cn.itcast/gaga"));*/

上面两个方法是互斥的,在设置数据和类型时,要使用setDataAndType()方法设置才可以。

例: 激活打电话意图的方法:

public void click3(View view){

Intent intent = new Intent();

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

intent.setData(Uri.parse("tel:12345"));

startActivity(intent);

}

例:激活发短信意图的方法:

public void click4(View view){

Intent intent = new Intent();

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

intent.addCategory("android.intent.category.BROWSABLE");

intent.setData(Uri.parse("sms:5556"));

intent.putExtra("sms_body","nihao haha");

startActivity(intent);

}

五、在多个activity之间传递数据:

业务需求:将第一个页面中的输入的数据,在第二个页面中显示:

1、第一个页面的activity类

public class DemoActivity extendsActivity {

privateEditText editText1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//获取文本框组件

editText1 = (EditText) this.findViewById(R.id.editText1);

}

//点击按钮的事件方法,激活第二个组件。

publicvoid click(View view){

//获取文本组件的值:

String name =editText1.getText().toString().trim();

//激活第二个意图

Intent intent = newIntent(this,HelloActivty.class);

//在意图中设置传递的值,就是传递的数据。

intent.putExtra("name",name);

//批量数据传递 ,使用Bundle 对象,相当于map集合。

Bundle extras = new Bundle();

extras.putString("name",name);

intent.putExtras(extras);

startActivity(intent);

}

}

2、第二个页面的activity类:

public class HelloActivty extendsActivity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 获取激活我的意图:获取激活本组件的意图:

Intent intent = getIntent();

//根据key获取在意图中的数据

String name = intent.getStringExtra("name");

//获取批量的数据

Bundle extras = intent.getExtras(); //获取bundle对象。

String name = extras.getString("name");

//创建组件:

TextView tv = new TextView(this);

tv.setText("你好:"+name);

setContentView(tv);

}

}

六、关闭一个activity并获取这个activity的返回值:

1、业务需求:该activity中是联系人名称的列表,当选中一个联系人时,关闭当前的activity,返回选中联系人的姓名。在另外一个activity中获取关闭的activity的返回值。

2、//要被关闭的activity:

public class ContactListActivity extendsActivity {

private ListView lv;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.contact_list);

lv = (ListView) this.findViewById(R.id.lv);

Uri uri =Uri.parse("content://com.android.contacts/raw_contacts");

Cursor cursor = this.getContentResolver().query(

uri,null, null, null, null);

final List names = newArrayList();

while (cursor.moveToNext()) {

String id = cursor.getString(cursor.getColumnIndex("_id"));

String name =

cursor.getString(cursor.getColumnIndex("display_name"));

//System.out.println(id);

System.out.println("姓名"+ name);

//System.out.println("--");

names.add(name);

}

cursor.close();

//为listView设置适配器:

lv.setAdapter(newArrayAdapter(this, R.layout.item, R.id.tv, names));

//设置listView的点击事件:

lv.setOnItemClickListener(newOnItemClickListener() {

@Override

publicvoid onItemClick(AdapterViewparent, View view,

intposition, long id) {

//获取点击列表的联系人名称

String name = names.get(position);

//设置当前activity被关闭的时候的结果数据

Intent data = new Intent();

data.putExtra("name", name);

//设置当前activity结果集的方法

方法参数:(结果码,返回的数据)

setResult(position, data);

//关闭当前的activity

ContactListActivity.this.finish();

}

});

}

}

3、//接收关闭的activity返回值的activity:

public class DemoActivity extendsActivity {

privateEditText editText1,editText2;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

editText1 = (EditText) this.findViewById(R.id.editText1);

editText2 = (EditText) this.findViewById(R.id.editText2);

}

//点击按钮开启联系人列表视图

public void click(View view){

Intent intent = new Intent(this,ContactListActivity.class);

//启动activity并可以获取返回值的方法。

方法参数(视图,请求码)

startActivityForResult(intent,1);

}

public void click2(View view){

Intent intent = newIntent(this,ContactListActivity.class);

//startActivity(intent);

startActivityForResult(intent, 2);

}

//当新激活的界面销毁,重新回到这个界面,会执行此方法,

该方法参数:

第一个参数:请求码,对应上面startActivityForResult方法中设置的请求码,用于区分是哪

个事件的操作。

第二个参数:结果码,获取销毁页面中setResult()方法中设置的结果码。

第三参数:销毁界面的返回值.

protected void onActivityResult(int requestCode, int resultCode, Intentdata) {

if(data!=null){

Toast.makeText(this, "点击了第"+resultCode+"个条目", 0).show();

String name = data.getStringExtra("name");

if(requestCode==1)

editText1.setText(name);

if(requestCode==2)

editText2.setText(name);

}

super.onActivityResult(requestCode,resultCode, data);

}

}

七、activity的生命周期:

1、activity生命周期中依次执行的方法:

onCreate :activity被创建时调用的方法

onStart :界面可见的时候调用

onResume :当界面获取焦点时调用

onPause :当界面失去焦点时调用

onStop :当用户看不到界面时调用。

onDestory:activity被销毁时调用的方法.

当内存不足或结束结束进程时,会调用onDestory方法销毁activity。

当一个界面创建出来后执行了onStop方法了,当再次被显示出来时,先调用onRestart方法,然后是onStart、onResume 方法。

2、生命周期的应用场景:

当在播放视频时来电,在onStop方法中暂停视频 ,在电话打完,在onStart方法中将暂停的视频重新播放。

八、activity横竖屏切换的生命周期:

在默认的情况下,横竖屏切换会先销毁activity再创建activity;

为了在切换横竖屏时,不销毁activity要在清单文件配置:

android:configChanges="keyboardHidden|orientation"

android:name=".LifecycleActivity"

android:configChanges="keyboardHidden|orientation"

android:label="@string/app_name" >

当横竖屏切换时会执行activity类中的onConfigurationChanged()方法:

//横竖屏切换的activity类:

public class LifecycleActivity extendsActivity {

@Override

public voidonConfigurationChanged(Configuration newConfig) {

//TODO Auto-generated method stub

super.onConfigurationChanged(newConfig);

System.out.println("configchange");

}

}

九、指定新创建的activity是一个对话框的形式:

在清单文件中指定:activity的样式:

android:theme="@android:style/Theme.Dialog" //对话框样式。

>

十、activity的启动模式 和 task任务栈、:

1、task任务栈:

Task (任务栈):一组任务的集合。 使用任务栈管理activity(任务),

Task任务栈主要用来存放已经打开的activity的引用,最近打开的activity处于任务栈的栈顶,栈顶的activity是用户可见的activity。

通过任务栈系统可以管理应用程序的行为(管理应用程序如何打开,如何退出).

在activity类中 通过getTaskId()获取任务栈的id。

2、Activity的启动模式:

①、Standard:默认模式。

②、singleTop:如果task栈栈顶是activityB,再去开启activityB,就不会创建新的activityB的实例。

当复用栈顶的组件时会调用activityB类中中的onNewIntent()方法.

例:浏览器添加书签的应用。

③、singleTask:当开启新的activity的时候,首先判断任务栈里面是否存在要激活的activity,如果存在的话,就直接把这个已经存在的activity在任务栈中上面的其他activity都给清除掉,然后复用这个已经存在的activity。

应用场景:创建浏览器的BrowserActivity实例使用该模式。

④、singleInstance模式:首先开启一个activityA在任务栈A中,再开启一个新的activityB,此时就会创建一个新的任务栈B,用于存放activityB,在任务栈A的栈顶保留了对activityB的引用。

任务栈模型:

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港