【android,14】14.为应用程序多个activity的应用和数据的传输
来源:互联网 发布:python scatter 气泡 编辑:程序博客网 时间:2024/04/24 20:20
一、创建一个自定义界面:
1、自定义一个Activity类 要继承系统的Activity类。
public classDemo2Activity extends Activity {
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2); //指定布局
}
}
2、在清单文件AndroidManifest.xml中声明一个activity元素
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".DemoActivity"
android:label="@string/app_name" >
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Demo2Activity"//配置类名
android:label="我是第二个activity" > //指定标题
<intent-filter>//意图过滤器
<actionandroid:name="cn.itcast.mutileactivity.haha" />
<dataandroid:scheme="itcast"
android:host="cn.itcast" android:path="/gaga"
android:mimeType="audio/mpeg"/>
<categoryandroid:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<actionandroid:name="android.intent.action.VIEW" />
<actionandroid:name="android.intent.action.SENDTO" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<categoryandroid:name="android.intent.category.BROWSABLE" />
<dataandroid:scheme="sms" />
<dataandroid:scheme="smsto" />
</intent-filter>
</activity>
</application>
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清单文件中:指定一个意图过滤器:
<activity
android:name=".Demo2Activity" //配置类名
android:label="我是第二个activity" > //指定标题
<intent-filter>//意图过滤器
//当前意图对应的动作,name的可随意给
<actionandroid:name="cn.itcast.mutileactivity.haha" />
//为意图配置数据,当意图的action相同时,根据data数据区分具体的业务。
<dataandroid:scheme="itcast" //itcast为数据的命名空间。
android:host="cn.itcast" //主机名
android:path="/gaga" //路径
android:mimeType="audio/mpeg"/> //数据类型
//category元素,配置系统给定的意图。
<categoryandroid:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
注意:①、一个activity可以配置多个意图过滤器:
②、在定义的意图过滤器中,要根据业务需求指定category元素的属性对应意图和当前意图对应的动作,
2、 隐式意图:页面跳转的点击事件:
//隐式的意图
public void click2(View view){
//用于不同应用程序之间组件的激活
// 操作系统要根据action data mimetype category 进行一个查询
// 隐式意图的效率要比现实意图的效率低一点
Intentintent = new Intent();
//设置动作:将在清单文件指定好的动作设置进来
intent.setAction("cn.itcast.mutileactivity.haha");
//<categoryandroid:name="android.intent.category.DEFAULT"/>
使用设置数据和类型的方法,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<String> names = newArrayList<String>();
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<String>(this, R.layout.item, R.id.tv, names));
//设置listView的点击事件:
lv.setOnItemClickListener(newOnItemClickListener() {
@Override
publicvoid onItemClick(AdapterView<?> parent, 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"
<activity
android:name=".LifecycleActivity"
android:configChanges="keyboardHidden|orientation"
android:label="@string/app_name" >
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
当横竖屏切换时会执行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的样式:
<activityandroid:name=".Activity02"
android:theme="@android:style/Theme.Dialog" //对话框样式。
></activity>
十、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,14】14.为应用程序多个activity的应用和数据的传输
- Android activity和fragment异步传输数据的问题
- android activity之间数据的传输
- Android退出启动了多个Activity的应用程序
- Android退出启动了多个Activity的应用程序
- Android应用程序中的多个Activity的显示创建和调用
- Android退出多个activity和单个activity的方法
- Android 应用程序退出和Activity的管理
- Android-Activity的LaunchMode和退出应用程序
- Android--Activity之间传输数据
- C#特性Attribute的实际应用之:为应用程序提供多个版本
- Android activity 的退出应用程序
- 多个activity之间的数据共享
- 如何退出android多个Activity和整个应用
- Android图片的压缩和Bitmap转化为String传输
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序的Activity启动过程简要介绍和学习计划
- android源码编译快捷命令
- Prim算法求最小生成树
- c语言跨平台的实用技巧
- 设置hadoop Job允许map task失败的比例
- 理工大学ACM平台题答案关于C语言 1159 C语言实验——两个数比较
- 【android,14】14.为应用程序多个activity的应用和数据的传输
- android idle和suspend的区别代码
- 获取Android设备唯一标识码
- 栈溢出、內存溢出、Java內存泄露
- 1/3 - 3/5 + 5/7 - 7/9 ...+ 19/21
- Http 请求到底有多慢
- 新手入门--输入格式五
- 【android,15】aidl
- Mac系统下Android生成keystore