Activity常用技巧总结

一、跳转到已存在的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”改为其它或者去掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值