setno result set后之前的acitvity执行ondestory 怎么破

父activity在子activity返回时自动调用onDestroy() - ITeye问答
现在有个奇怪的问题,我有两个Activity,A和B,首先从A跳转到B,B用来录入一些属性,完成后,B返回A,并且调用onActivityResult方法,但是问题是,当B调用finish()方法结束后,A自动的调用了onDestroy方法并且重新onCreate,这是怎么回事?
这个现象只出现在使用平板电脑时,而使用不同手机测试都不会出现.同时三星平板电脑的内存足够大,而且应用也只占了20M内存,同时设置android:screenOrientation="portrait",所以也不是由于平板横竖颠倒产生的问题.
A and B Activity 都是使用相同的baseActivity设置不同的viewGroup. 所以也不能设置android:launchMode="singleTop",这样就不会新开了.
在B之后也试过新开C Activity,然后finish C,这时B是正常onResume,没有执行onDestroy,为什么只有在B返回A时会导致A的onDestroy呢?
生命周期如下
A onCreate
A onStart
A onResume
------------------
A onPause
B onCreate
B onStart
B onResume
A onStop
-------------------
B onPause
A onDestroy
A onCreate
A onStart
A onResume
B onStop
B onDestroy
A onDestroy不应该出现啊
应该还是内存的问题,应该是内存不够用,所以被系统回收了,系统的回收是一个不确定的行为。
已解决问题
未解决问题2116人阅读
Android UI(39)
项目日记(32)
我前面有篇文章提到 这个问题的现象记录
1.首先,分析activity back键,响应出现 ANR的问题。
这个问题是由于在manifest的activity中 使用&Theme.NoDisplay,不显示该Activity 导致的。
android:theme=&@android:style/Theme.NoDisplay&
测试代码很简单,将一个application的Activity添加上面属性,桌面运行,看不到任何界面,og的日志可以,看到该onResume已执行,你可以照常进行其他的交互,滑动分页、打开其他的应用,但是不能碰“BACK”键,否则就会出现“ANR”。深层次的原因,暂时还不清楚,有大侠知道,欢迎回复解答下。
2.解决“ANR&bug : 在改Activity的 onCreate中添加
moveTaskToBack(true);
这样,就可以正常响应back键了,但是,会导致另外的问题:onPause onDestroy 延迟执行。
当然,这个moveTaskToBack最好是写在onResume中,不然,再次显示该Activity的时候,还是会出现 ANR的问题。
3.onPause onDestroy 延迟执行分析验证。
app A代码清单如下:
public class AMainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(getClass().getSimpleName(), &onCreate--taskId=& + getTaskId());
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Log.i(getClass().getSimpleName(), &onClick&);
ComponentName componentName =
new ComponentName(&com.example.testlanchmode2&, &com.example.testlanchmode2.BMainActivity&);
//启动 app2 的BActivity
startActivity(new Intent().setComponent(componentName));
manifest 配置:singleInstance
android:name=&com.example.testlunchmode.AMainActivity&
android:launchMode=&singleInstance&
android:label=&@string/app_name& &
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
app B 代码清单:
public class BMainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(getClass().getSimpleName(), &onCreate--taskId=& + getTaskId());
// initClick();
protected void onResume() {
// TODO Auto-generated method stub
Log.i(getClass().getSimpleName(), &onResume--taskId=& + getTaskId());
// 移至后台
moveTaskToBack(true);
super.onResume();
Theme.NoDisplay,singleInstance
&application
android:allowBackup=&true&
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@android:style/Theme.NoDisplay&
android:name=&com.example.testlanchmode2.BMainActivity&
android:launchMode=&singleInstance&
android:label=&@string/app_name& &
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
&/application&
运行的log:
01-23 15:46:02.908: I/AMainActivity(2704): onCreate--taskId=3
01-23 15:46:02.908: I/AMainActivity(2704): onStart--taskId=3
01-23 15:46:02.908: I/AMainActivity(2704): onResume--taskId=3
01-23 15:46:06.718: I/(2704): onClick
----启动BActivity---
01-23 15:46:06.718: I/ActivityManager(1075): START {cmp=com.example.testlanchmode2/.BMainActivity u=0} from pid 2704
01-23 15:46:06.878: I/AMainActivity(2704): onPause--taskId=3
01-23 15:46:06.908: I/ActivityManager(1075): Start proc com.example.testlanchmode2 for activity com.example.testlanchmode2/.BMainActivity: pid=2746 uid=10046 gids={1028}
01-23 15:46:07.048: I/BMainActivity(2746): onCreate--taskId=4
01-23 15:46:07.048: I/BMainActivity(2746): onStart--taskId=4
01-23 15:46:07.048: I/BMainActivity(2746): onResume--taskId=4
01-23 15:46:07.048: I/ActivityManager(1075): moveTaskToBack: 4
01-23 15:46:07.058: I/BMainActivity(2746): onPause--taskId=4
01-23 15:46:07.068: I/AMainActivity(2704): onResume--taskId=3
01-23 15:46:07.088: I/BMainActivity(2746): onStop--taskId=4
----按Back键---
01-23 15:46:12.108: I/AMainActivity(2704): onBackPressed--taskId=3
01-23 15:46:12.108: I/AMainActivity(2704): finish--taskId=3
01-23 15:46:12.278: I/AMainActivity(2704): finish--taskId=3
01-23 15:46:12.278: I/AMainActivity(2704): onPause--taskId=3
----再次启动AActivity
01-23 15:46:21.458: I/ActivityManager(1075): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x cmp=com.example.testlunchmode/.AMainActivity u=0} from pid 1294
01-23 15:46:21.628: D/----&&&&(1294): NAME is com.example.testlunchmode.AMainActivity
01-23 15:46:21.678: I/AMainActivity(2704): onCreate--taskId=5
01-23 15:46:21.688: I/AMainActivity(2704): onStart--taskId=5
01-23 15:46:21.688: I/AMainActivity(2704): onResume--taskId=5
01-23 15:46:21.808: I/ActivityManager(1075): Displayed com.example.testlunchmode/.AMainActivity: +175ms (total +14s925ms)
01-23 15:46:22.108: I/AMainActivity(2704): onStop--taskId=3
01-23 15:46:22.108: I/AMainActivity(2704): onDestroy--taskId=3
----问题出现了,前一个task中的AActivity 到现在才销毁?我的AActivity不也是 singleInstance的么,为何此时还创建了第二个task?尽管前面的task已经挂掉。
----正常back---
01-23 15:46:47.458: I/AMainActivity(2704): onBackPressed--taskId=5
01-23 15:46:47.458: I/AMainActivity(2704): finish--taskId=5
01-23 15:46:47.638: I/AMainActivity(2704): onPause--taskId=5
01-23 15:46:48.278: I/AMainActivity(2704): onStop--taskId=5
01-23 15:46:48.278: I/AMainActivity(2704): onDestroy--taskId=5
----再次启动A---
01-23 15:46:55.098: I/ActivityManager(1075): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x cmp=com.example.testlunchmode/.AMainActivity u=0} from pid 1294
01-23 15:46:55.338: I/AMainActivity(2704): onCreate--taskId=6
01-23 15:46:55.338: I/AMainActivity(2704): onStart--taskId=6
01-23 15:46:55.338: I/AMainActivity(2704): onResume--taskId=6
----启动B---
01-23 15:46:56.978: I/(2704): onClick
01-23 15:46:56.978: I/ActivityManager(1075): START {cmp=com.example.testlanchmode2/.BMainActivity u=0} from pid 2704
01-23 15:46:57.148: I/AMainActivity(2704): onPause--taskId=6
01-23 15:46:57.158: I/BMainActivity(2746): onStart--taskId=4
01-23 15:46:57.158: I/BMainActivity(2746): onResume--taskId=4
01-23 15:46:57.158: I/ActivityManager(1075): moveTaskToBack: 4
01-23 15:46:57.168: I/BMainActivity(2746): onPause--taskId=4
01-23 15:46:57.188: I/BMainActivity(2746): onStop--taskId=4
01-23 15:46:57.198: I/AMainActivity(2704): onResume--taskId=6
----A back---
01-23 15:47:02.128: I/AMainActivity(2704): onBackPressed--taskId=6
01-23 15:47:02.128: I/AMainActivity(2704): finish--taskId=6
01-23 15:47:02.308: I/AMainActivity(2704): onPause--taskId=6
---启动A----
01-23 15:47:21.728: I/ActivityManager(1075): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x cmp=com.example.testlunchmode/.AMainActivity u=0} from pid 1294
01-23 15:47:21.938: I/AMainActivity(2704): onCreate--taskId=7
01-23 15:47:21.938: I/AMainActivity(2704): onStart--taskId=7
01-23 15:47:21.938: I/AMainActivity(2704): onResume--taskId=7
01-23 15:47:22.358: I/AMainActivity(2704): onStop--taskId=6
01-23 15:47:22.368: I/AMainActivity(2704): onDestroy--taskId=6
运行后的效果就是那样,A 启动B,然后back,A的onStop,onDestroy 就会“延时”。
B activity manifest 去掉&singleInstance 设置
效果与情况一一样,貌似是&moveTaskToBack的影响。
A activity manifest 去掉&singleInstance 设置,B activity manifest 保留singleInstance&
效果与情况一,还是一样。
情况四:单独去掉B activity的&Theme.NoDisplay,还是一样
情况五:单独去掉B activity的&Theme.NoDisplay,然后 按键去触发moveTaskToBack 。流程就是正常的。why?
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:105846次
积分:1788
积分:1788
排名:千里之外
原创:73篇
评论:18条
(1)(1)(2)(3)(4)(3)(4)(6)(1)(1)(3)(3)(5)(7)(7)(3)(1)(2)(6)(3)(1)(8)(2)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。setresult 后之前的acitvity执行ondestory 怎么破?
20分,无满意结帖,结帖人orosem625]
setresult 后之前的acitvity执行ondestory 怎么破?
20分,无满意结帖,结帖人orosem625]
编辑:www.fx114.net
本篇文章主要介绍了"setresult 后之前的acitvity执行ondestory 怎么破?
20分,无满意结帖,结帖人orosem625]",主要涉及到setresult 后之前的acitvity执行ondestory 怎么破?
20分,无满意结帖,结帖人orosem625]方面的内容,对于setresult 后之前的acitvity执行ondestory 怎么破?
20分,无满意结帖,结帖人orosem625]感兴趣的同学可以参考一下。
最简单的比方,我现在有3个activity,分别是A,B,C,A通过startactivityforresult启动B,B通过startactivityforresult启动C,现在在C里面执行setresult后执行finish,然后B里面的onActivityResult函数在收到C里面设置的result值后也执行setresult然后finish,这样的逻辑下去应该到A里的onActivityResult函数了。
现在我遇到的问题很奇怪,我在C到B的过程是正常的,但是在B到A的过程中突然出现A执行ondestory方法,然后执行oncreate方法然后到onActivityResult这个方法,我很奇怪为什么要先ondestory再oncreate?如果是内存不够回收了的话怎么回收了A再创建A呢?正常的程序节奏应该是onrestart然后onstart,然后onresume(因为在B和C时A没有结束,只是stop了),而且这个奇怪的生命周期还不是每次都这样,在低端机器上基本是这个流程,在内存768的机器上不会出现这种奇怪的现象,现在我想请问知道的大侠,在低端机上,我怎么不让他执行ondestory再create?还有就是低端机上出现这种奇怪的流程的原因是什么?你的各个Activity的启动方式是什么?引用&1&楼&&的回复:你的各个Activity的启动方式是什么?
Intent&intent&=&new&Intent(a.this,b.class);
startActivityForResult(intent,&TOSETTING);
Intent&intent&=&new&Intent(b,&c.class);
startActivityForResult(intent,&1);启动模式我问的是你的launchmode,在activity中定义的引用&4&楼&&的回复:我问的是你的launchmode,在activity中定义的
a是程序的主入口函数,是单例模式&signaltask引用&3&楼&&的回复:启动模式
a是程序的主入口函数,是单例模式&signaltasksingtask,a可以设成这个模式.b,c就设置成standard引用&7&楼&&的回复:singtask,a可以设成这个模式.b,c就设置成standard
为什么药这样改?能解释下吗?谢谢,出现我这个情况的原因是什么?
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:2012年8月 移动平台大版内专家分月排行榜第二
2012年9月 移动平台大版内专家分月排行榜第三
2012年8月 移动平台大版内专家分月排行榜第二
2012年9月 移动平台大版内专家分月排行榜第三
2012年8月 移动平台大版内专家分月排行榜第二
2012年9月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 result set 的文章

 

随机推荐