时间:2016年5月24日19:22:35
作者:JustDo23
说明:Android四大组件之一Activity使用最普遍,使用过程中仍有很多知识点值得总结归纳。
01. Activity注意点
- Android中的四大组件在使用的时候都是需要进行
注册
的。这一点必须明确。Activity需要在AndroidManifest.xml
文件中进行注册。 - 在进行代码混淆的时候,Activity不能进行混淆,它在功能清单中注册,系统读取功能清单。所以功能清单中注册的都不能进行代码混淆,混淆之后就找不到了。
- Activity的启动模式设置的不同,对应的启动动画也会有区别的。
02. Activity四种启动模式
- standard
- singleTop
- singleTask
- singleInstance
四种模式各自的含义以及相互之间的区别是比较重的。这里在进行赘述,但是需要经常回顾温习,真正理解,并在项目中使用。
03. 设置Activity启动模式的两种方法
-
第一种: 在功能清单中注册时候指定它的属性
android:launchMode="singleTask"
-
第二种: 在startActivity的时候使用
Intent
的Flag
进行设置intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
两者基本是相同的功能,在使用Flag
的时候,出来四种启动模式之外还可以指定更多的Flag。
04. onNewIntent(Intent intent)
这个方法的调用是和Activity的启动模式密切的相关的。当启动模式是singleTop
或者是singleTask
的时候,再次启动Activity会执行这个方法。同时这个方法可以接收Intent携带的参数。简单代码如下:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
这个方法的使用一定要注意Activity的启动模式。本人至今遇到过三次需要使用这种方法的情况。如果能够熟练使用,真的会减少不少问题。
05. startActivityForResult(Intent intent, int requestCode)
当我们在进行两个相邻界面之间的数据传递的时候,经常会使用到startActivityForResult()
方法进行数据的传递和回传。在使用这个方法的地方需要重写onActivityResult()
方法来接收被启动界面传递的数据。简单代码如下:
startActivityForResult(intent, SELECT_ADDRESS);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data != null) {
switch (requestCode) {
case SELECT_ADDRESS:// 接收数据
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
正常情况下,我们先调用startActivityForResult()
方法跳转被启动的界面
,然后在被启动界面
进行数据后,在被启动界面finish之前
将调用setResult(int resultCode, Intent intent);
,将数据返回当前启动界面。偶尔我们会遇到onActivityResult
没有按照我们想象中的时机进行回调,而是在startActivityForResult()
方法之后就提前被回调了。
出现这种异常回调的主要原因在于启动界面指定了自己的启动模式为SingleTask
。
这种问题并不多见,而且在网上一搜就找到原因。此处进行个人的记录总结。
对于解决方法的话,可以尝试使用上边提到的onNewIntent(Intent intent)
方法进行解决。当然也可以尝试使用广播等方式进行解决。