Android アクティビティのライフサイクル

備忘録的に…

package com.example.lifecycle

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.util.Log;

public class MainActivity extends Activity {

    private static final String LOG_TAG      = "LIFE";
    private static final int REQUEST_CODE = 1;

    //アクティビティの初期化
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(MainActivity.LOG_TAG, "onCreate");
    }

    //画面を表示
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(MainActivity.LOG_TAG, "onStart");
    }

    //フォアグラウンドのアクティビティにうつる
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(MainActivity.LOG_TAG, "onResume");
    }

    //バックグラウンドのアクティビティにうつる
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(MainActivity.LOG_TAG, "onPause");
    }

    //画面を非表示
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(MainActivity.LOG_TAG, "onStop");
    }

    //アクティビティの破棄
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(MainActivity.LOG_TAG, "onDestroy");
    }

    //バックグラウンドアクティビティからの復帰
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(MainActivity.LOG_TAG, "onRestart");
    }
}

[type=”email”] の値

備忘録的に…

HTML5のフォームコントロール要素強化の1つに, input要素のtype=”email”がある.

メールアドレスの形式として不正であれば, submitのときにツールチップが出て警告をしてくれる.

しかしながら, メールアドレスの形式として不正な場合, 何らかの文字列が入力されていてもvalueは空文字列として認識されてしまう.

ごく稀にこれではまずいケースもあるかとは思いますので, その場合は今までと同じく, type=”text”として入力して, プログラム側でメールアドレスとして妥当かどうかを判定するほうがいいかなと思いました.

Java コレクションと配列の相互変換

備忘録的に…

Case Method Description
配列からコレクション Arrays.asList 単にリストとして参照するだけ. 要素の変更は, 配列側からもリスト側からも見える. 配列は固定長であり, かつ, asListメソッドでは, 配列をリストのように見せているだけなので, リスト側で要素の追加や削除を実行しようとすると, UnsupportedOperationException例外が発生する
Collections.addAll 既存のコレクションに配列を追加する. この場合は, コレクション側で要素の追加や削除が可能.
コレクションから配列 Collection.toArray コレクションの要素のコピー配列を生成する. コピーなので, 配列側での操作はコレクションには影響しない.
また, 安全性のために引数ありのほうのメソッドを利用すべき.

Java スレッド生成

Javaでスレッドを生成するには, Threadクラスのインスタンスを生成して, startメソッドを実行する.

Thread thread = new Thread();

startメソッドで実行を開始して, joinメソッドでスレッドが終了するのを待機する.

thread.start();

//別のスレッドで何かする

thread.join();

で, 問題は何かする部分の実装の方法です.

これには2つの方法があります.

  • Threadクラスを継承したサブクラスでrunメソッドをオーバーライドする
  • Runnableインターフェースを実装したクラスでrunメソッドをオーバーライドする.

Threadクラスを継承する場合,

class MyThread extends Thread {
    public MyThread() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
        }

       System.out.println("End thread");
    }
}

Threadクラスのサブクラスを生成した場合は, コンストラクタ呼び出しでも, サブクラスを利用する.

Thread thread = new MyThread();

Runnableインターフェースを実装する場合,

class MyThread implements Runnable {
    public MyThread() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
        }

       System.out.println("End thread");
    }
}

Runnableインターフェースを実装した場合は, Threadコンストラクタの引数に, Runnableインターフェースを実装したクラスのインスタンスを指定する.

Thread thread = new Thread(new MyThread());

Java 配列コピーの方法

Javaでは, 配列よりもコレクション (リストやマップなど) を利用することのほうが多いと思いますが, 備忘録的に…

  • System.arraycopy
  • Arrays.copyOf (Java 6以上)
  • Object.clone (パフォーマンス的に, System.arraycopyかArrays.copyOfを使うほうが賢明)
  • 自前で実装 (Deep Copyをしたい場合など)

 

HTML Media Capture

HTML Media Captureとは, <input type=”file”>を拡張機能のようなもので, ファイルシステムからファイルを取得するのではなく, カメラやマイクといったデバイスからファイルを取得できる.

使い方はとても簡単です.

<!-- カメラから取得 -->
<input accept="image/*" type="file" capture="camera" />
<!-- マイクから取得 -->
<input accept="audio/*" type="file" capture="microphone" />

ポイントは, accept属性にMIMEタイプを指定することと, capture属性を4つの値 (camera, microphone, camcorder, filesystem)のどれかに指定することです.

また, 取得したファイルは, 通常のファイルと同じオブジェクトとして扱えます (すなわち, Blobを継承したFileオブジェクト).

FileReaderオブジェクトと併用していろいろ面白いことができるでしょう.

ブラウザとデバイスを簡単に連携させる素晴らしいAPIですが, 残念ながら, デスクトップのブラウザでは実装されていないようです.

Androidで動作確認はできました.

ちなみに, 対応していない場合は, 通常のファイル選択のダイアログになるだけなので安心してください.