2012年1月12日木曜日

イチからつくるADK「AdkLedの作成その3」オーバライドメソッドの記述

イチからつくるADK「AdkLedの作成その2」の続きです。前回はMainActivityクラスのフィールドとonCreateメソッドを記述しました。次は、MainActivityクラスの親クラスにあたるActivityのライフサイクルにあるメソッドをオーバライドしていきます。



3. オーバライドメソッドの記述

まず記述済みのonCreateメソッドも含めて、オーバライドするメソッドとその役割を示します。
  • onCreateメソッド
    • UsbManager の取得 
    • 独自Intent action でパーミッション依頼用のPendingIntent 作成 
    • 独自Intent action とアクセサリが外されたときのBroadcastReceiver 登録 
    • 画面のセットアップ 
  • onResumeメソッド
    • USBAccessory の一覧を取得して、権限チェック。
    • 権限があればアクセサリとの接続を開く
      • UsbAccessory からファイルデスクリプタを取得しファイルデスクリプタから入出力用の Stream を取得。
      • 入力を受け取るためのスレッドを開始
    • 権限がなければパーミッションを依頼
  • onPauseメソッド
    • アクセサリとの接続を閉じる 
  • onDestroyメソッド
    • onCreateメソッドで登録した BroadcastReceiver の解除 
上記4つのメソッドはコールバックメソッドといって状態遷移に応じてシステムから自動的に呼び出されるメソッドです。どういう状態のときに動作するかは以下のサイトを参考にしてみて下さい。
Techbooster Activityとライフサイクル

3. Activityライフサイクルのメソッドをオーバーライドする
3.1. メニュー「ソース」ー「メソッドのオーバーライド/実装...」を選択します。

この方法を使うと、継承した親クラスであるActivityクラスのメソッドを知らなくても、間違わずに利用する事ができます。


3.2. 「オーバライドまたは実装するメソッドを選択:」からonDestroy(), onPause(), onResume()のチェックボックスをクリックして選択します。
「挿入ポイント:」が「'onCreate(Bundle)'の後」であることを確認してください。
「OK」ボタンを押します。
3つのメソッドを選択(図ではonDestroy()のみ表示されていません。)

3.3. onDestroyメソッド、 onPauseメソッド、onResumeメソッドのJavaソースの記述を行います。
各々のメソッド内にソースを貼付けてください。
3.4. onDestroyメソッド
    @Override
    protected void onDestroy() {
        unregisterReceiver(mUsbReceiver);
        super.onDestroy();
    }
3.5. onPauseメソッド
    @Override
    protected void onPause() {
        super.onPause();
        closeAccessory();
    }
3.6. onResumeメソッド
    @Override
    protected void onResume() {
        super.onResume();

        if (mInputStream != null && mOutputStream != null) {
            return;
        }

        // USB Accessory の一覧を取得
        UsbAccessory[] accessories = mUsbManager.getAccessoryList();
        UsbAccessory accessory = (accessories == null ? null : accessories[0]);
        if (accessory != null) {
            // Accessory にアクセスする権限があるかチェック
            if (mUsbManager.hasPermission(accessory)) {
                // 接続を開く
                openAccessory(accessory);
            } else {
                synchronized (mUsbReceiver) {
                    if (!mPermissionRequestPending) {
                        // パーミッションを依頼
                        mUsbManager.requestPermission(accessory, mPermissionIntent);
                        mPermissionRequestPending = true;
                    }
                }
            }
        } else {
            Log.d(TAG, "mAccessory is null");
        }

    }
3.7. 上記3つのメソッドを記述したらファイルを保管してください。
「問題」タブで赤×のエラー一覧を見ると、以下のようなエラーが出ているはずです。

3.8. 「Logを解決できません」エラーをダブルクリックし、該当の行に移動し、赤×をクリックして下さい。パッケージのインポートで修正されます。



0 件のコメント:

コメントを投稿