【问题标题】:How Android onActivityForResult reacts toggling app between foregrnd AND bckgrnd?Android onActivityForResult 如何在 foregrnd 和 bckgrnd 之间切换应用程序?
【发布时间】:2011-03-23 00:40:56
【问题描述】:

考虑这种情况:

public class Parent extends Activity{

@Override
public void onCreate(Bundle icicle) {
     super.onCreate();
.......
}

  public void onResume(){
       super.onResume();
     ....
    onClick of BUTTON b1.....

        Intent intent = new Intent(Parent.this, Child.class);
    intent.putExtra("param", data);
     startActivityForResult(intent, ACTION_LAUNCH_CHILD_ACTIVITY);
     }

      ....
   }

  public void onActivityResult(){
    do something......
   }
 }
}

============================================

public class Child extends Activity{

@Override
public void onCreate(Bundle icicle) {
    super.onCreate();
.......
}

  public void onPause(){
     super.onPause();
     setResult(OK);
     finsh();
     }

      ....
   }
 }
}

步骤:

  1. 启动父活动。
  2. 单击父级上的按钮 b1 并启动子级
  3. 孩子成功带入并出现在屏幕上
  4. 现在点击 Android 设备(硬件)上的主页按钮
  5. Child 的 onPause、onStop 和 onDestroy 被调用。

但是当应用程序被带到后台时,我没有看到程序控件进入 Parent 的 onActivityResult。

当应用处于后台状态时,此特定程序的程序控制在哪里?

关于将应用程序带回前台,在活动生命周期方面的预期行为是什么?

提前致谢

任何人都可以解释一下吗?

【问题讨论】:

    标签: android android-activity lifecycle activity-lifecycle


    【解决方案1】:

    如果你在 onPause 中移除了对 finish() 的调用,那么点击 home 键只会调用子活动的 onPause 方法。当您重新启动应用程序时,仅调用子活动 onResume 方法。似乎没有调用任何父方法。在用户更改手机方向后,在活动中调用 setResult 然后在 onPause FAILS 中结束的模式。因此,如果用户输入数据,保存数据(在 onSaveButtonClicked 中调用 setResult),更改手机方向,并退出调用完成,并且更改不会保存。

    考虑在 setResult 之后立即调用 finish(),此时您有足够的数据来设置结果,退出子活动。

    // UPDATE BUTTON HANDLER
        final Button buttonUpdate= (Button)findViewById(R.id.ButtonPasswordUpdate);
        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {   
                String password= editTextPasswordFirst.getText().toString();
                String verify= editTextPasswordSecond.getText().toString();  
                String err="";
    
                if (password.equals(verify) && (password.length() >= minimumPasswordLength)) { // 1) SUCCESS
                    ResetTimeoutValues(timeoutType); // new password so calculate new timeout time     
                    isValidKey= true;
                    PasswordState outPasswordState= new PasswordState(lengthKey,
                            timeExpire,
                            isValidKey,
                            timeoutType,
                            password,
                            isHashPassword,
                            minimumPasswordLength);
                    Bundle b= new Bundle();
                    b.putSerializable("jalcomputing.confusetext.PasswordState", outPasswordState);
                    getIntent().putExtras(b);
                    setResult(RESULT_OK,getIntent());   // call home with data on success only
                    finish(); // go back <=== EXITS Here
                    return;
                }...
        });
    

    【讨论】:

    • 您好,Jal,感谢您的解释。根据我的要求,我不需要将任何数据返回或保存回父活动。目的是当用户处于子活动中时.. 应用程序被带到 bckgrnd.. 下一次应用程序被带回 foregrnd 时,我不希望我的子活动出现......我想看到我的父活动。这是请求。除了使用 startActivityForResult ,还有什么更好的方法来完成这个流程吗??
    • @Akh 在不知道您的确切要求的情况下,我只能猜测。为什么不在 onCreate 中启动子活动,仅在硬杀之后说,然后在 ChildActivity.onPause 中调用完成?这将满足当用户点击 Home 键时闪屏消失,但如果用户点击返回键两次则返回的要求。
    • 嗨,Jal,对不起,我没有明白你的意思。如果您不介意,请详细说明。
    • @Akh 如果您不需要将数据从子 Activity 返回到父 Activity,您只需在父 Activity button.onClick 中调用 startActivity 并在 ChildActivity.onPause 中调用 Finish。如果你这样做,什么要求不满足?
    • 像魅力一样工作。谢谢你。 Jal 是一个不同的问题。如果将应用程序带到后台运行该应用程序的 UI 线程会发生什么情况?会睡还是被杀?当应用返回前台时,会通知同一个线程还是会创建一个新线程并将其与应用实例关联?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多