2015-07-10 80 views
3

在調試其中涉及取向的變化和一些零收益的情況我被困。當Android方向改變時,什麼Activity的生命週期回調被執行?

我的問題分爲:

1)取向時改變什麼是執行活動的整個生命週期的回調。

2)取向時改變什麼是執行片段生命週期的回調。 3)如果我們合併了第2點和第3點(這通常是片段覆蓋Activity的情況),根據具有片段(執行流程?)的Activity,回調執行流程是什麼?

EDIT

脫落的問題的一些光,如果沒有configChanges在機器人清單文件即定義:

如果沒有選擇由該屬性被報告發生的任何配置改變,而不是報告它,系統將停止並重新啓動活動(使其通過新配置啓動)。

什麼生命週期回調的活動和片段將被執行?

+0

的http:// 7xi7e6。 com1.z0.glb.clouddn.com/activity-fragment_lifecycle_4.png檢查此 – vilpe89

回答

2

首先,在AndroidManifest將它添加到你的活動:android:configChanges="orientation"

1)。 onConfigurationChanged
2)。沒什麼,但你可以實現你的方法和活動稱之爲onConfigurationChanged
3)。流程進行Activity.onConfigurationChanged -> Fragment.yourMethod

希望這有助於。

修訂

這是你的流量,當你開始活動第一次:

Activity.onCreate
Activity.onStart
Fragment.onAttach
Fragment.onCreate
Fragment.onCreateView
Fragment.onViewStateRestored
Fragment.onStart
Activity.onResume
片段。的onResume

這裏是流後取向改變:

Activity.onPause
Fragment.onPause
Activity.onSaveInstanceState
Fragment.onSaveInstanceState
Activity.onStop
Fragment.onStop
活動。的onDestroy
Fragment.onDestroy
Fragment.onDetach
Fragment.onAttach
Fragment.onCreate
Activity.onCreate
Activity.onStart
Fragment.onCreateView
Fragment.onViewStateRestored
Fragment.onStart
Activity.onRestoreInstanceState
Activity.onResume
Fragment.onResume

這裏的代碼來檢查:

public class FooActivity extends FragmentActivity { 

    private static final String LOG_TAG = FooActivity.class.getSimpleName() + "_TAG"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.i(LOG_TAG, "Activity.onCreate"); 
     setContentView(R.layout.activity_foo); 
     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new BarFragment()) 
        .commit(); 
     } 
    } 


    @Override 
    protected void onPause() { 
     Log.i(LOG_TAG, "Activity.onPause"); 
     super.onPause(); 
    } 

    @Override 
    protected void onStop() { 
     Log.i(LOG_TAG, "Activity.onStop"); 
     super.onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     Log.i(LOG_TAG, "Activity.onDestroy"); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onResume() { 
     Log.i(LOG_TAG, "Activity.onResume"); 
     super.onResume(); 
    } 

    @Override 
    protected void onStart() { 
     Log.i(LOG_TAG, "Activity.onStart"); 
     super.onStart(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     Log.i(LOG_TAG, "Activity.onConfigurationChanged"); 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     Log.i(LOG_TAG, "Activity.onSaveInstanceState"); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     Log.i(LOG_TAG, "Activity.onRestoreInstanceState"); 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class BarFragment extends Fragment { 

     public BarFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      Log.i(LOG_TAG, "Fragment.onCreateView"); 
      View rootView = inflater.inflate(R.layout.fragment_bar, container, false); 
      return rootView; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      Log.i(LOG_TAG, "Fragment.onCreate"); 
      super.onCreate(savedInstanceState); 
     } 

     @Override 
     public void onAttach(Activity activity) { 
      Log.i(LOG_TAG, "Fragment.onAttach"); 
      super.onAttach(activity); 
     } 

     @Override 
     public void onViewStateRestored(Bundle savedInstanceState) { 
      Log.i(LOG_TAG, "Fragment.onViewStateRestored"); 
      super.onViewStateRestored(savedInstanceState); 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      Log.i(LOG_TAG, "Fragment.onSaveInstanceState"); 
      super.onSaveInstanceState(outState); 
     } 

     @Override 
     public void onResume() { 
      Log.i(LOG_TAG, "Fragment.onResume"); 
      super.onResume(); 
     } 

     @Override 
     public void onStart() { 
      Log.i(LOG_TAG, "Fragment.onStart"); 
      super.onStart(); 
     } 

     @Override 
     public void onConfigurationChanged(Configuration newConfig) { 
      Log.i(LOG_TAG, "Fragment.onConfigurationChanged"); 
      super.onConfigurationChanged(newConfig); 
     } 

     @Override 
     public void onPause() { 
      Log.i(LOG_TAG, "Fragment.onPause"); 
      super.onPause(); 
     } 

     @Override 
     public void onStop() { 
      Log.i(LOG_TAG, "Fragment.onStop"); 
      super.onStop(); 
     } 

     @Override 
     public void onDetach() { 
      Log.i(LOG_TAG, "Fragment.onDetach"); 
      super.onDetach(); 
     } 

     @Override 
     public void onDestroy() { 
      Log.i(LOG_TAG, "Fragment.onDestroy"); 
      super.onDestroy(); 
     } 
    } 
} 
+0

感謝亞歷山大。從鏈接:「而不是報告它,系統將停止並重新啓動活動(使用新配置啓動它)。」這是我感興趣的流程,你知道哪些回調會被執行嗎? – Kay

+0

@Kay,在destroing活動之前歡迎你.'Activity.onSaveInstanceState'和創建新活動之後的'Activity.onRestoreInstaceState'。應該調用這個回調函數 – Alexander

+0

或者你在整個生命週期中都有衝突?我不明白你的問題 – Alexander

0

onConfigurationChanged()方法

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 
// Checks the orientation of the screen 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
} } 

在AndroidManifest.xml中

<activity android:name=".MyActivity" 
     android:configChanges="orientation|keyboardHidden" 
     android:label="@string/app_name"> 

添加此代碼還可以檢查這些ActivityFragment

+0

謝謝謝克爾!請參閱更新後的問題 – Kay

+0

對於任何類型的配置更改,如果您說在那裏處理,您將接收到對當前活動的「onConfigurationChanged(Configuration)」方法的調用,而不是重新啓動。但是,如果配置更改涉及任何您不處理的操作,該操作仍將重新啓動,並且不會調用「onConfigurationChanged(Configuration)」。 – Shekhar

+0

重新啓動可能意味着onStart被調用或onRestart被調用..哪一個是它?重新啓動之前,當前實例調用onpause或直到停止()? – Kay

相關問題