13

(是的,我已经查看了与此问题有关的现有问题。)为什么调用finish()导致onCreate()被调用,开始一个新的Activity?

我从我的Activity的Up按钮侦听器中调用finish()。但虽然onDestroy()确实被调用,但首先调用了onPause(),然后令人惊讶地发现onCreate(),这导致了真正的问题。为什么通过调用ScanningActivity的finish()方法启动新的ScanningActivity

我记录所有的生命周期函数调用和顺序是这样的:

inside onClick() Listener for up button. 
     Inside onPause() 
     Inside onCreate() // this is what's hosing everything 
     Inside onStart() 
     Inside onResume() 
     Inside onWindowFocusChanged() 
     Inside onStop() 
     Inside onDestroy() 

为什么我收到以下内容finish()呼叫事件的顺序?下面是ScanningActivity代码调用finish(),通知,在onclick监听器(这是onCreate()方法中指定):

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    . . . 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      Log.i("ScanningActivity", "inside onClick() -- Listener for up button being executed."); 

      android.widget.LinearLayout layt = (android.widget.LinearLayout) vCustView; 

      View vTemp = layt.findViewById(R.id.scanning_up); 
      if (null != vTemp) 
      { 
       Button btnUp = (Button) vTemp; 
       if (!btnUp.getText().equals("End")) 
       { 
        setResult(RESULT_CANCELED); 

        finish(); 
        return; 
       } 
      } 
     } 
    . . . 
} 

按Karakuri的要求这里的清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.calypso.myandroid"> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    // 
    <uses-permission android:name="android.permission.SET_DEBUG_APP" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

     <uses-feature android:name="android.hardware.camera" /> 
     <uses-feature android:name="android.hardware.camera.autofocus" /> 

     <uses-permission android:name="android.permission.CAMERA" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ail_logo" 
     android:label="@string/app_name" 
     android:theme="@style/AssistTheme"> 
     <activity 
      android:name=".HomeScreenActivity" 
      android:label="@string/title_activity_home_screen" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".GradeActivity" 
      android:label="@string/title_activity_grade_assessment" 
      android:screenOrientation="portrait" 
      android:parentActivityName=".HomeScreenActivity" 
      android:noHistory="true" 
      /> 
     <activity 
      android:name=".ScanningActivity" 
      android:label="@string/title_activity_scanning" 
      android:screenOrientation="portrait" 
      android:parentActivityName=".GradeActivity" 
      /> 
    </application> 


</manifest> 

...这里是呼叫代码,其最初从GradeActivity内部启动ScanningActivity

if (bFinishedSuccessfully) 
{ 
    try 
    { 
     Log.i("GradeActivity", "SOMEHOW THIS IS AGAIN STARTING THE ScanningActivity!!!"); 

     Intent intent = new Intent(this, ScanningActivity.class); 
     intent.putExtra("SessionInfo", m_hmActivate); 
     startActivity(intent); 
    } 
    catch (Exception ex) 
    { 
     Log.i("GradeActivity", "ex: " + ex.getMessage()); 
    } 
} 

更新:我稍微修改了清单和调用代码,试图解决这个问题,但无济于事。行为仍然完全如最初描述的那样。我已经用mods更新了这个问题。

+3

您已经发布并没有提供足够的信息的代码。你能向我们展示你的AndroidManifest吗?此外,它看起来像这个活动开始的结果。也许你应该在调用活动中包含一些代码? – Karakuri

+0

@Karakuri,我添加了您请求的信息。我希望这已经足够了。 – Alyoshak

+0

在您发布的事件序列中,哪个“活动”正在记录每种方法? – Bryan

回答

1

我认为问题出在您的清单上,android:noHistory="true"参数已添加到GradeActivity中。 ScanningActivity上的setResult()将尝试创建父活动GradeActivity。 我认为如果您不需要在导航堆栈上保留GradeActivity,则必须使用startActivityForResult从您的HomeScreenActivity启动ScanningActivity。

+0

真的吗?那么,我无法直接从HomeScreenActivity bc启动ScanningActivity,一个关键的需要的步骤是在GradeActivity中一路完成的,一直到ScanningActivity。但是如果一路上出现故障,用户必须一路返回HomeScreenActivity。有没有理由相信使用noHistory会导致我的问题? – Alyoshak

+0

好吧,女巫活动正在处理从ScanningActivity回来的结果?当ScanningActivity恢复时,GrateActivity被销毁,因此,当您调用setResult时,android活动管理器将尝试回发到调用活动,以便它创建一个新的GrateActivity实例。解决方案是使用GrateActivity的custum结果从HomeScreenActivity开始,或者从GradeActivity中删除noHistory参数并在需要时完成。 –

+0

我不知道它是如何找出如何返回到HomeScreenActivity,但它是,这是我需要发生的事情。也许是因为找不到GradeActivity的一个实例,它看起来更靠后,找到了称为GradeActivity(HomeScreenActivity)并返回到那里的活动。 ??? – Alyoshak

1

使用setResult(RESULT_OK);而不是setResult(RESULT_CANCELED);里面的Click监听器。

像:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    . . . 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      Log.i("ScanningActivity", "inside onClick() -- Listener for up button being executed."); 

      android.widget.LinearLayout layt = (android.widget.LinearLayout) vCustView; 

      View vTemp = layt.findViewById(R.id.scanning_up); 
      if (null != vTemp) 
      { 
       Button btnUp = (Button) vTemp; 
       if (!btnUp.getText().equals("End")) 
       { 
        setResult(RESULT_OK); 

        finish(); 
        return; 
       } 
      } 
     } 
    . . . 
} 
相关问题