Activity使用总结
来源:互联网 发布:自己写js插件 编辑:程序博客网 时间:2024/06/10 19:21
一、Activity?
在一个Android应用中,一个Activity通常就是一个单独的屏幕,它上面显示一些控件也可以监听并处理用户的事件作出相应的响应。Activity之间通过intent通讯。参考:Activity百度百科
Activity的详细介绍请参考:官方Activity文档
二、使用步骤:
1、在项目包新建一个类集成Activity,重写其中的生命周期方法如:onCreate()、onStart()方法等;
2、在AndroidMainfest.xml文件中注册自己新建的Activity。
三、生命周期对应的方法
生命周期和相关方法的调用,假设有个Activity名字为A
1、启动:onCreate-onStart-onResume
2、按下返回键: onPause-onStop-onDestroy
3、在最近打开的程序,找到相应的应用并点击:onCreate-onStart-onResume
4、按下Home键:onPause-onStop
5、长按Home键,在AllList中点击打开:onRestart-onStart-onResume
当有两个Activity:A和B;
当由A跳转到B的时候:A:onPause-B:onCreate-B:onStart-B:onResume-A:onStop
四、启动Activity的方法
startActivity、startActivityForResult。
由于这两个方法中都使用了intent参数,所以这里又可以分为intent的显示启动和隐式启动。
注意:intent传递数据最大携带容量是1MB。
显示启动:
1、跳转到同一应用中的Activity,制定上下文和目标Activity的字解码
Intent intent = new Intent(); intent.setClass(this, BActivity.class); startActivity(intent);
2、跳转到其他应用中的Activity,需要制定目标Activity所在应用的包名和目标Activity的类名Intent intent = new Intent(); //启动系统自带的拨号器应用 intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity"); startActivity(intent);
隐式启动:<intent-filter > <action android:name="a.b.c"/> <data android:scheme="lee" android:mimeType="aa/bb"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter>
action:制定动作(可以自定义,可以使用系统自带的)data:制定数据(操作什么内容)
category:类别(默认类别,机顶盒,车载电脑),这个参数自定义会报错。
1、隐式意图跳转到自定Activity,需要在intent中设置Action
Intent intent = new Intent(); intent.setAction("a.b.c"); //这行匹配的是data标签中的scheme属性 //intent.setData(Uri.parse("lee:tianyue")); //这行匹配的是data标签中的mimeType属性 //intent.setType("text/name"); intent.setDataAndType(Uri.parse("lee:tianyue"), "text/name"); //这行代码可以不写,如果不写则自动添加 //intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent);
隐式启动activity时,系统会遍历手机中所有的清单文件,寻找与隐式意图匹配的intent-filter,如果找不到,会报错,如果找到了,那么就把该intent-filter对应的Activity启动。
一个Activity标签可以定义多个intent-filter标签,匹配任意一个即可。
<activity android:name="com.lee.jump.SecondActivity"> <intent-filter > <action android:name="a.b.c"/> <action android:name="a.b.c3"/> <data android:scheme="lee"/> <data android:scheme="lee3"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> <intent-filter > <action android:name="a.b.c2"/> <data android:scheme="lee2"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Activity跳转时的数据传递,可以通过Intent对象封装数据传递到目标ActivityIntent intent = new Intent(this, BActivity.class); intent.putExtra("maleName", maleName); intent.putExtra("femaleName", femaleName); startActivity(intent);
在目标Activity中取出数据Intent intent = getIntent(); String maleName = intent.getStringExtra("maleName"); String femaleName = intent.getStringExtra("femaleName");
intent能封装的数据类型有:八大基本数据类型及数据
字符串及其数组
序列化接口:主要通过实现Serializable和Parcelable。其中内存中传递对象时比Serializable效率高
Bundle类型(可以把数据封装至Bundle对象中,在把Bundle对象封装至Intent中)实例如下:
//数据封装在bundle中传递 Bundle bundle = new Bundle(); bundle.putString("male", male); bundle.putString("female", female); //最后把bundle封装到intent中 intent.putExtras(bundle);
相应的获取过程:Bundle bundle = getIntent().getExtras(); bundle.getString("male",male); bundle.getString("female",female);
上面讲的是由上个Activity往下一个Activity传递数据,那么当前页面往上一个页面传递数据呢。那么就要在A启动B的时候采用startActivityForResult(intent,requestCode) ,同时在A中重写onActivityResult(requestCode,resultCode,data)()方法;
通过requestCode和resultCode来判断是否是由A启动的页面回调回的数据,数据就封装在data中。
那么B怎么将数据发送给A呢?在B中将数据封装到intent中,通过setResult(resultCode,intent)方法,调用后一定要调用B的finish()方法。
五、Activity的四种启动模式
standard:标准模式(默认模式),可以不用写配置,在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个实例,允许多个相同的Activity叠加。
应用场景:绝大数的Activity.
singleTop:栈顶模式,如果需要开启的activity在任务栈的顶部已经存在了,就不会创建新的实例,而是调用onNewIntent()方法。避免栈顶的activity被复用的创建。
应用场景:在通知栏点击接受的消息。
singleTask:栈内复用模式。activity只会在任务栈里面存在一个实例。如果要激活activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,
调用onNewIntent方法,并且清空这个activity任务栈上面所有activity。应用场景:大多数App的主页。
singleInstance:单一实例模式,整个手机操作系统里面只有一个实例存在,不同的应用去打开这个activity共享共享的同一个activity。同时这个特殊的activity也会运行在自己单独、独立的任务栈中。并且这个任务栈只属于它自己。应用场景:呼叫来电界面,闹钟显示界面。
系统提供了两种方式来设置一个Activity的启动模式,除了在AndroidManifest文件中利用android:launchMode=""来设置以外,还可以通过Intent的Flag来设置一个Activity的启动模式:
FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例。
FLAG_ACTIVITY_SINGLE_TOP
使用singletop模式启动一个Activity,与指定android:launchMode=“singleTop”效果相同。
FLAG_ACTIVITY_CLEAR_TOP
使用SingleTask模式来启动一个Activity,与指定android:launchMode=“singleTask”效果相同。
FLAG_ACTIVITY_NO_HISTORY
六、屏幕的横竖屏切换
Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。
横竖屏切换的生命周期:
默认情况下,手机横竖屏切换时,系统会销毁当前的activity,创建一个新的activity,重新执行一次生命周期方法。
销毁重建Activity是为了加载横屏的布局文件,为了做屏幕适配,支持横竖屏切换的应用通常会准备两套布局文件。
其中横屏布局文件定义在layout-land目录下。
机制横竖屏切换
1、在<actiivty>标签中写死:
android:screenOrientation="landscape" android:screenOrientation="portrait"
2、在java代码中写死:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
在<activity>配置一下属性,让系统的环境不再去明感横竖屏的切换。android:configChanges="orientation|screenSize"
- Activity使用总结
- Activity使用总结
- activity使用总结
- Activity 与Fragments 使用总结
- 【Android学习总结】之Activity:初识Activity及使用
- Android的Activity中的Menu使用总结
- 关于activity的使用规范小总结
- Android Activity 中 Intent 的使用总结
- Activity总结
- Activity总结
- Activity 总结
- Activity总结
- Activity总结
- Activity总结
- Activity总结
- Activity总结
- Activity总结
- Activity总结
- PHP经典设计模式
- Linux网络编程入门
- hackerrank>Dashboard>C++>STL>Print Pretty
- Mybatis源码学习笔记(五)配置简介之TypeHandler
- [STL] 浅谈Rope使用(附[BZOJ]1507 Editor)
- Activity使用总结
- Python基础(三)-变量
- thread09
- jsp原理
- jsp乱码如何解决,给出三种以上的对应解决方案,并给出对应的程序案例;
- BZOJ 1497[NOI 2006] 最大获利
- 20170609Rudy&黄金时代
- Ubuntu 下安装 Slickedit
- 初学者的Selenium自动化测试指南,基于Python(二)——自动化测试脚本小程序