ジャンル不定の日記です。

thisってなんだ?

Androidで"Hello World"アプリを作ってみた。

package com.example.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = new TextView(this);
        tv.setText("Hello, World");
        setContentView(tv);
    }
}

赤文字以外の部分は前回の方法でプロジェクトを作成すると自動的に書かれるので、赤文字部分だけ追加。
文字を表示するだけの部品はTextViewウィジェットで、描画系部品はwidgetクラス以下にまとまっているようですね。

公式のAPIリファレンスを読めばわかる感じだが、APIの規模がでかい上に英語だから入門にはちょいきつい。
今回はまず"Hello World"ググッていろんなサイト参考にしたんだが、どのサイトも「new TextView(this);」のthisについて記載してないんだよね。
説明省略しちゃイカンところでしょ・・・

このthisは何?
ってことでわからないから調べたが、公式リファレンスには"TextView(Context context)"と記載されている。

今度はContextって何?
って感じだが、widget作成時はアクティビティの状態を渡す必要があり、渡すものがContext。
Contextを渡すのに省略してthisと書ける。
って感じかね。
Javaはよくわからないが、この場合のthisはMainActivityのことなのか?onCreateのことなのか?

習慣的にthisで開発してると問題に遭遇することもありそうな気がするが、
渡すべきものはContextって覚えとけば平気かな・・・


残りの2行は、
TextViewに文字列を設定。
アクティビティにTextViewを設置。
って感じで、リファレンス読むまでもなく雰囲気でわかるね。


コードはonCreateのブロック内に書いているが、名前がonから始まるからイベント的なものだろうという雰囲気があるが、
onCreateはアクティビティ初期化時に実行される。
他にonStart、onResume、onPause、onStop、onDestroyがあり、
開始時は、onCreate → onStart → onResume の順で処理される。
Androidのアプリは非表示にしてもスリープになるだけだが、
スリープ状態になる時は、onPause → onStop の順。
スリープした際にonStopが実行されるが、Stopする前にPauseでキャンセルされる場合があり、その場合はPauseに戻る。
Stopから復帰した場合はStartに戻る。
Destroyは正常終了だが、メモリ不足に陥るとPause又はStop状態でkillされる可能性がある。

スリープからの復帰時に何も変更しないなら、開始時の処理はonCreateだけで良さそう。
終了時に保存等の処理をする場合は、killされることも考えて、Pauseでやればいいのかな?