Android Studioが作成したLoginActivity分析


今日からAndroidの知識の勉強を記録しましょう.
ASで生成されたLoginActivityのレイアウトが簡潔で、少し修正すれば良いという感じなので、このActivityのコードを勉強してみましょう.
まずレイアウトファイル
<LinearLayout
    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:gravity="center_horizontal"
    android:orientation="vertical"
    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="com.dc.activity.LoginActivity">

    <!-- Login progress -->
    <ProgressBar
        android:id="@+id/login_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:visibility="gone"/>

    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/email_login_form"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <AutoCompleteTextView
                    android:id="@+id/account"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/prompt_account"
                    android:inputType="textEmailAddress"
                    android:maxLines="1"
                    android:singleLine="true"/>

            </android.support.design.widget.TextInputLayout>

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <EditText
                    android:id="@+id/password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/prompt_password"
                    android:imeActionId="@+id/login"
                    android:imeActionLabel="@string/action_sign_in_short"
                    android:imeOptions="actionUnspecified"
                    android:inputType="textPassword"
                    android:maxLines="1"
                    android:singleLine="true"/>

            </android.support.design.widget.TextInputLayout>

            <Button
                android:id="@+id/email_sign_in_button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:text="@string/action_sign_in"
                android:textStyle="bold"/>

        </LinearLayout>
    </ScrollView>
</LinearLayout>
LinearLayoutの下にはgoneのProgressBarと1つのScrollView、ScrollViewの下に2つのTextInputLayoutと1つのButtonがネストされています.シンプルなインターフェースで、必要に応じてToolbarを加えることができます.
メンバー変数
/**
     * Id to identity READ_CONTACTS permission request.
     */
    private static final int REQUEST_READ_CONTACTS = 0;

    /**
     * A dummy authentication store containing known user names and passwords.
     * TODO: remove after connecting to a real authentication system.
     */
    private static final String[] DUMMY_CREDENTIALS = new String[]{
            "[email protected]:hello", "[email protected]:world"
    };
    /**
     * Keep track of the login task to ensure we can cancel it if requested.
     */
    private UserLoginTask mAuthTask = null;

    // UI references.
    private AutoCompleteTextView accountView;
    private EditText mPasswordView;
    private View mProgressView;
    private View mLoginFormView;

DUMMY_CREDENTTALSは既存のアカウントをシミュレートするために使用され、コロンは前がアカウント、コロン後がパスワードmAuthTaskはUserLoginTaskの例であり、UserLoginTaskはAsyncTaskから継承され、後でこの用途について説明する
そしてonCreateメソッド
protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // Set up the login form.
        accountView = (AutoCompleteTextView) findViewById(R.id.account);
        populateAutoComplete();

        mPasswordView = (EditText) findViewById(R.id.password);
        mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener()
        {
            @Override
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent)
            {
                if (id == R.id.login || id == EditorInfo.IME_NULL) {
                    attemptLogin();
                    return true;
                }
                return false;
            }
        });

        Button mEmailSignInButton = (Button) findViewById(R.id.sign_in_button);
        mEmailSignInButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                attemptLogin();
            }
        });

        mLoginFormView = findViewById(R.id.login_form);
        mProgressView = findViewById(R.id.login_progress);
    }
onCreateメソッドでは主にViewの初期化といくつかのリスニングイベントの設定が行われており、EditViewが設定したonEditorActionはリターンを押すと実行されます.
メソッド最後の2つのmLoginFormViewとmProgressViewは、表示されているViewを取得するために使用され、ログイン時にログインウィンドウgone,ProgressBar visibleの操作を行うことができます.
もう1つはAutoCompleteEditTextの後にあるpopulateAutoComplete()メソッドで、メソッド名で見ると自動補完リストを構築し、フォローアップします
private void populateAutoComplete()
    {
        if (!mayRequestContacts()) {
            return;
        }

        getLoaderManager().initLoader(0, null, this);
    }

まずmayRequestContactsで実行を継続するか否かを判断し,判断するとLoadersを初期化し,Loadersバックグラウンドでユーザのアカウント情報を非同期で読み出す.
mayRequestContacts()を見てみると、コードは次の通りです.
private boolean mayRequestContacts()
    {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }
        if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
            return true;
        }
        if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
            Snackbar.make(accountView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                    .setAction(android.R.string.ok, new View.OnClickListener()
                    {
                        @Override
                        @TargetApi(Build.VERSION_CODES.M)
                        public void onClick(View v)
                        {
                            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                        }
                    });
        } else {
            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
        }
        return false;
    }
から、この方法は、主に6.0の新しい権限メカニズムを適合させるためにユーザにアカウントの読み取り権限を取得するように要求するために使用されることがわかる.
次にbuttonのクリックイベントとEditTextのリターンイベントでattemptLogin()メソッドが見つかり、このメソッドは主に入力したアカウントパスワードの合法性(空か、長さが小さすぎるか)を初歩的に判断し、エラーメッセージを与える.初歩的な検査を経て、ログインボックスとボタンを隠し、進捗バーを表示し、AsyncTaskでバックグラウンドログインを行います.このAsyncTaskは上の変数のmAuthTaskで、使用するときにdoInBackgroundメソッドを書き換えて自分のビジネスロジックを実現します.
これらがLoginActivityの主なコード理解です.