您的位置:首页 > 移动开发 > Android开发

Activity常用技巧总结

2015-10-30 12:57 429 查看
一、跳转到已存在的Activity(不管该Activity置于栈中的什么位置)不重复调用onCreate()的方法:

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”改为其它或者去掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息