Activity常用技巧总结
2015-10-30 12:57
429 查看
一、跳转到已存在的Activity(不管该Activity置于栈中的什么位置)不重复调用onCreate()的方法:
用该种标志去启动一个Activity时,如果目标activity未存在,则调用onCreate()创建;如果存在,则直接调用onNewIntent,不再创建新的activity。例如:有A,B,C三个Activity,C在栈顶,A在栈底,当C用该标志跳转到A时,则新栈的顺序为:B,C,A。A被放到了栈顶位置。这种方式可用于选择照片,类似QQ的照片选择方式,尽量减少调用onCreate()的重复操作,从而提升app的性能。
名字与之相似的标志
二、跳转到已存在的Activity(当该Activity置于栈顶时)不重复调用onCreate()的方法:
如果该Activity在Mainifest.xml配置文件中的加载模式是默认时,如下的跳转还是会执行onCreate()的。即:创建了新的Activity,而不是原来那个(已被finish):
如果不想重复执行,则需配置如下:
就加一行代码
三、onNewIntent()方法什么时候会被调用:
1.Activity第一次启动的时候执行onCreate()—->onStart()—->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()—->onStart()—->onResume()等。
2.该方法被调用,说明不会创建新实例,而是重用已经存在的实例。例如,FLAG_ACTIVITY_CLEAR_TASK,FLAG_ACTIVITY_REORDER_TO_FRONT跳转到一个已存在的Activity时,该方法会被调用。当目标Activity的加载模式为singleTop,并且该Activity置于栈顶,则onNewIntent()也会被调用。。。
3.如果当前Activity的加载模式是默认时,点击Home键,回到桌面,再次点击app图标进来,该Activity的启动顺序是:onResart()——>onStart()—–>onResume()。如果当前Activity的加载模式是singleTop或singleTask。当点击Home键回到桌面,再点击app图标回来时,该Activity的启动顺序是:onNewIntent()—->onResart()——>onStart()—–>onResume()。不管什么加载模式,当点击Home键回到桌面,再长按Home键回来,该Activity的启动顺序都是:onResart()——>onStart()—–>onResume()
四、onActivityResult在android 4.x 及以下版本无法获取返回值:
如果Activity的加载模式为singleTask,则startActivityForResult一调用就会执行到onActivityResult。之后再也不会回调onActivityResult。解决方法为:android:launchMode=”singleTask”改为其它或者去掉。
FLAG_ACTIVITY_REORDER_TO_FRONT
用该种标志去启动一个Activity时,如果目标activity未存在,则调用onCreate()创建;如果存在,则直接调用onNewIntent,不再创建新的activity。例如:有A,B,C三个Activity,C在栈顶,A在栈底,当C用该标志跳转到A时,则新栈的顺序为:B,C,A。A被放到了栈顶位置。这种方式可用于选择照片,类似QQ的照片选择方式,尽量减少调用onCreate()的重复操作,从而提升app的性能。
Intent intent = new Intent(this, TestFlagActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent);
名字与之相似的标志
FLAG_ACTIVITY_BROUGHT_TO_FRONT表面意思也很容易让人误解成:把目标Activity置顶而不创建新实例。以为和
FLAG_ACTIVITY_REORDER_TO_FRONT标志的功能类似。实际上两者大不一样:
FLAG_ACTIVITY_BROUGHT_TO_FRONT会创建新的实例。例如:有A,B,C三个Activity,C在栈顶,A在栈底,当C想调用该标志跳转到A时,则新栈的顺序为:A,B,C,A。栈顶的A是新创建的实例,本已存在栈底的A还是在栈底,并没有被置顶。
二、跳转到已存在的Activity(当该Activity置于栈顶时)不重复调用onCreate()的方法:
FLAG_ACTIVITY_CLEAR_TOP
如果该Activity在Mainifest.xml配置文件中的加载模式是默认时,如下的跳转还是会执行onCreate()的。即:创建了新的Activity,而不是原来那个(已被finish):
Intent intent = new Intent(this, TestFlagActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
如果不想重复执行,则需配置如下:
<activity android:name=".activity.TestFlagActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
就加一行代码
android:launchMode="singleTop"。这种跳转会把目标Activity之上的Activity都finish掉。例如:有A,B,C,D四个Activity,D在栈顶,A在栈底,当D用该标志跳转到B时,则新栈的顺序为:A,B。B之上的C和D都被顶出栈了,即被finish掉了。栈中只剩下A,B。
三、onNewIntent()方法什么时候会被调用:
1.Activity第一次启动的时候执行onCreate()—->onStart()—->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()—->onStart()—->onResume()等。
2.该方法被调用,说明不会创建新实例,而是重用已经存在的实例。例如,FLAG_ACTIVITY_CLEAR_TASK,FLAG_ACTIVITY_REORDER_TO_FRONT跳转到一个已存在的Activity时,该方法会被调用。当目标Activity的加载模式为singleTop,并且该Activity置于栈顶,则onNewIntent()也会被调用。。。
3.如果当前Activity的加载模式是默认时,点击Home键,回到桌面,再次点击app图标进来,该Activity的启动顺序是:onResart()——>onStart()—–>onResume()。如果当前Activity的加载模式是singleTop或singleTask。当点击Home键回到桌面,再点击app图标回来时,该Activity的启动顺序是:onNewIntent()—->onResart()——>onStart()—–>onResume()。不管什么加载模式,当点击Home键回到桌面,再长按Home键回来,该Activity的启动顺序都是:onResart()——>onStart()—–>onResume()
四、onActivityResult在android 4.x 及以下版本无法获取返回值:
如果Activity的加载模式为singleTask,则startActivityForResult一调用就会执行到onActivityResult。之后再也不会回调onActivityResult。解决方法为:android:launchMode=”singleTask”改为其它或者去掉。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories