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对象封装数据传递到目标Activity
Intent 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"














原创粉丝点击