フローに沿ったAndroidの処理流れ(初心者向け)

http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html
このページを中心に勉強した時のメモです
注意：**筆者はど初心者です**

####Activityとは

>![activity_lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/158393/e9dd171a-ed9c-f3b4-b98a-c0a92d2ff269.png)
>出展：http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html

####Fragmentとは

>![fragment_lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/158393/43bac6c9-c1f6-270b-2f59-167938edc478.png)
>出展：http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html

#### ユーザーがアプリを起動した際のフロー

- `AndroidManifest.xml`(各種設定を記述するファイル)に、記載されているActivityから**intent-filter**タグ内に以下の属性を持つActivityを起動させる


```
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
```


- 該当するactivity（jp.mixi.assignment.controller.beg.MainActivity）の、onCreate()が起動

```MainActivity.java
public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Toast.makeText(this,"onCreateStart",Toast.LENGTH_LONG).show();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //dynamicFragmentの動的追加
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        dynamicFragment fragment = new dynamicFragment();
        transaction.replace(R.id.f2, fragment);
        transaction.commit();
        Toast.makeText(this,"onCreateEnd",Toast.LENGTH_LONG).show();
    }
```

- 全ての関数には、スーパークラスの関数を呼び出すこと（この場合、**super.onCreate()**）
- `setContentView()`はによって、xmlが読み込まれる


```xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <!--静的追加するfragment-->
    <fragment
        android:id="@+id/f1"
        android:name="jp.mixi.assignment.controller.beg.staticFragment"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_below="@+id/main"/>

    <!--動的追加するfragmentの入れ物-->
    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/f2"
        android:layout_toRightOf="@+id/f1"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>
</RelativeLayout>
```
- 読み込んだ時点では、フラグメントであるf1が、さらに作成される
- 作成するクラスは、`android:name=jp.mixi.assignment.controller.beg.staticFragment`で判断


```staticFragment.java
package jp.mixi.assignment.controller.beg;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

/**
 * Created by **** on 2017/05/14.
 */

public class staticFragment extends Fragment{
    public staticFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Toast.makeText(getContext(),"onCreateView(staticFragment)",Toast.LENGTH_LONG).show();
        return inflater.inflate(R.layout.static_fragment, container,  false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Toast.makeText(getActivity().getBaseContext(), "onCreate(staticFragment)", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart() {
        super.onStart();
        Toast.makeText(getActivity().getBaseContext(), "onStart(staticFragment)", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceBundle) {
        super.onActivityCreated(savedInstanceBundle);
        Toast.makeText(getActivity().getBaseContext(), "onActivityCreated(staticFragment)", Toast.LENGTH_SHORT).show();
    }
}
```

- `onCreate()`→`onCreateView()`が起動
- Fragmentでも同じく、super.~~は必要
- Toastの第一引数のContextは、以下のうちのどれでも良い（なぜ？？）

`getActivity().getBaseContext()`
または、
`getActivity().getApplicationContext()`
または
`getActivity()`
>http://stackoverflow.com/questions/15364315/toast-inside-onclick-method-in-fragment

- onCreateView()で見える状態になるまで変化し、引き続き、xmlに戻る
- この時点では、静的Fragmentのみ、起動
- xmlの読み込みが終わったら、次は、以下の部分の処理

```java
        //dynamicFragmentの動的追加
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        dynamicFragment fragment = new dynamicFragment();
        transaction.replace(R.id.f2, fragment);
        transaction.commit();
```

- `FragmentManager`から、トランザクションを取得
- Fragment2(動的に入れるFragment)を作成し、トランザクションに仕込む
- ここで、挿入する要素を**id(R.id.f2)**で指定
- `onCreate()`が終わると、staticFragmentの`onActivityCreated()`が起動
- onActivityCreated は属するActivity の onCreate の状態の処理が終わったことを示す状態です。
- 現在の状態

MainActivity    : onCreate()
staticFragment  : onActivityCreated()
dynamicFragment : 未起動
- 次の`onStart()`に進みたいが、dynamicFragmentが未着手
- ここでやっと**dynamicFragmentのonCreate()が起動**

1. onCreate(dynamic)
2. onCreateView(dynamic)
3. onActivityCreated(dynamic)

```dynamicFragment.java
package jp.mixi.assignment.controller.beg;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

/**
 * Created by **** on 2017/05/14.
 */

public class dynamicFragment extends Fragment {
    public dynamicFragment() {
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Toast.makeText(getContext(), "onCreateView(dynamicFragment)", Toast.LENGTH_LONG).show();
        return inflater.inflate(R.layout.dynamic_fragment, container, false);
    }

    //onclick時には必ず、super.onCreate(savedInstanceState);を置くこと
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Toast.makeText(getActivity().getBaseContext(), "onCreate(dynamicFragment)", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart() {
        super.onStart();
        Toast.makeText(getActivity().getBaseContext(), "onStart(dynamicFragment)", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceBundle) {
        super.onActivityCreated(savedInstanceBundle);
        Toast.makeText(getActivity().getBaseContext(), "onActivityCreated(dynamicFragment)", Toast.LENGTH_SHORT).show();
    }
}

```

- やっと、MainActivityの全ての要素がonCreateViewの状態まで遷移した！！！！
- 各要素のonStart()が起動

1. onStart(static)
2. onStart(dynamic)
3. onStart()

-　**基本的には、下位の要素と足並みが同じになる**
-　**下位の要素が揃ったら、上位の要素のプロセスが起動**

途中に散りばめたToast.makeTextをまとめると、
以下のようになります
onCreateStart
onCreate(static)
oncreateView(static)
onCreateEnd
onActivityCreated(static)
onCreate(dynamic)
onCreateView(dynamic)
onActivityCreated(dynamic)
onStart(static)
onStart(dynamic)
onStart()

補足ですが、表示される画面は、以下です
![Screenshot_1494764529.png](https://qiita-image-store.s3.amazonaws.com/0/158393/1e408752-476d-a4f3-9c8b-ec797b15ac71.png)



僕なりの解釈ですので、間違いだらけかなと感じます。。。。適宜修正します