LoginSignup
3
7

More than 5 years have passed since last update.

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

Posted at

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

Activityとは

activity_lifecycle.png
出展:http://mixi-inc.github.io/AndroidTraining/fundamentals/2.02.activity-and-fragment.html

Fragmentとは

fragment_lifecycle.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が読み込まれる
<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の読み込みが終わったら、次は、以下の部分の処理
        //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

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

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7