FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

第一章 Android の概要的なこと

・Androidとは
・アーキテクチャ
・ライフサイクル
・開発環境作成


第二章 考え中


寄り道 メモや小ネタ

・エミュレータに関して


過去記事は編集します。
変更履歴つくらなきゃ
スポンサーサイト

いろんな記事を書きかけではありますが、気になることが次々と出てくるAndroid。

そんな誘惑に負けつつ、まぁメモだから・・というわけのわからない自己暗示で次へ次へと進んでいきます。


今回はIntentについて書きます。

Intentですが、別の画面とデータのやりとりをするためには必須なクラスです。

別画面を開く場合はIntent。
別画面にパラメータを渡す場合もIntent。
別画面からリザルトを受け取る場合もIntent。

とりあえず、別画面に遷移したり、別アプリに遷移したり、パラメータを交換する場合はIntent使ってねという感じです。

ちょっとだけ技術者っぽいことを書くと、Intentには暗黙的と明示的が存在します。


■暗黙的なIntent

Intent(String action)
Intent(String action, Uri uri)

上記のコンストラクタを使う場合は暗黙的なIntentになります。

action には Intent.ACTION_? といった定数を指定します。
この定数ですが、数がものすごくあります。

調べると良く出てくるものとして、
Intent.ACTION_VIEW
Intent.ACTION_CALL
Intent.ACTION_DIAL

なんかがあります。


uri にはパラメータとなる値を指定します。

Webブラウザを呼び出す場合はURL
地図アプリを呼び出す場合は緯度・経度
電話アプリを呼び出す場合は電話番号

といった具合ですね。

uri の書き方ですが、それぞれのケースで内容が変わります。
・・・これどこかに全部乗ってるのかなぁ。

bg_logo_s.png
※やはり、詳しいことはここですね。

Intent のインスタンスを作成したら、Activity.startActivity(intent)を呼びます。
これでIntentで指定したアクティビティが実行されます。

続けて、明示的なIntentです。


■明示的なIntent

Intent(Context context, Class class)

上記のコンストラクタを使う場合は明示的なIntentとなります。

context にはコンテキスト、class には呼び出し先のクラスを指定します。

例えば、今作成しているアプリでチャットアプリがあります。
チャットの発言色を、別アプリのパレットクラスで選んだ色を反映するという仕様にしています。

それをサンプルに紹介します。

まずはソース。
WS000023.jpg
いきなり、↑で書いたコンストラクタとは違います。

まぁ、こういうやり方もあるということで・・

まず、Intentのインスタンスを作成します。

次に、 setClassName で呼び出し先のクラスを設定します。引数はパッケージと、パッケージ+クラス名です。
※ちなみに、紹介したコンストラクタで書くと、Intent(this, tsukul.palette.palette.class);

そして、渡したいパラメータがある場合は、 putExtra でキー情報に値を紐付けます。
紐付ける値は、 String や Int などです。 Object はどうなんだろう。

最後に、 Activity.startActivityForResult を呼びます。
暗黙の時と違いますが、おそらくどちらでも良いとおもいます。
こちらの場合は、リクエストコードというものを第二引数で渡しています。
これは、呼び出し先のアクティビティから戻ってきたときに返されるコードになります。
つまり、リクエストコードを判定材料に、 Intent の戻り値を処理するかどうか処理分けすることができます。

では、呼び出し先のアクティビティがパラメータを返してきた場合どのように受け取るのか。

それは onActivityResult というメソッドを Override します。
Intent で開いたアクティビティが終了した際に動作するイベントで、この中でパラメータを受け取ります。

onActivityResult(int requestCode, int resultCode, Intent intent)

requestCode は、呼び出す際に指定したリクエストコードです。これが同じなら、処理をするように書きます。

resultCode は処理が成功したかどうかを判定するためのコードです。Activity.RESULT_OK と等しければ処理しましょう。
※余談ですが、定数の中身は -1 です。

intent は、戻り値が入ってます。getIntExtra メソッドを使用して、中身を取り出しましょう。

今回はSurfaceViewに焦点を当てたいと思います。

このクラスの正確なところがまだ良くわかっていないのですが、
書いてくうちに何か閃くかなぁと甘い考えの下やっていきます。

間違い、誤字脱字、あいまいな表現その他もろもろ、ジャロには言わないでくださいね。


では、さっそく。

まず、普通のViewクラスとの違いを列挙したいとおもいます。

・描画が早い。


・・・あれ。大きくまとめると一つになっちゃいました。

SurfaceViewはUIスレッドから独立して描画を行うから早いとのこと。
なるほどねー・・・なんかモヤモヤします。

たとえば、クリックメソッドの中に描画の処理を書いた場合だと、
描画処理が早く終わっても、その後続で別の処理を書いてた場合
その処理が終わるまでクリック処理は抜けられない=描画処理の結果も反映されない。
って事になりますもんね。

そこから独立して描画処理、つまり並行に処理されればクリック処理が終わってなくても描画が終われば表示はされる。

いまいち自信ないです。


というわけで調査調査。









なんでも喋ってくださいー

昨日、社内でAndroidエミュレータのSDカードについて話題が出たので、そういえばスルーしてたネタだたったので自分もやってみました。

SDカードをWebで調べてみると、toolsフォルダにあるmksdcard.exeを使ってSDカードのイメージを作成し、エミュレータにマウントさせるらしい。

で、コマンドから作成してマウントしてみました。


android-sdk-windows-1.5_r3\tools>mksdcard 64M sdcard.img


うん、何事もなく同フォルダにsdcard.imgというファイルが作成されました。


ではマウントを・・

\android-sdk-windows-1.5_r3\tools>emulator -sdcard sdcard.img

emulator: ERROR: You did not provide the name of an Android Virtual Device
with the '-avd ' option. Read -help-avd for more information.

If you *really* want to *NOT* run an AVD, consider using '-data '
to specify a data partition image file (I hope you know what you're doing).



ん?
何かエラーが出ています。

英語力ないのでグーグルさんに聞いてみます。

<翻訳>

エミュレータ:エラー:あなたは、 Androidの仮想デバイスの名前を提供することはありませんでした
との' - avd 'オプションを選択します。詳細については、リードの仕方- avd 。

*本当に* * *一AVDを実行するには、 'の使用を検討し、データ<ファイル> '
データパーティションのイメージファイルを指定するために(私は自分が何をしている知っている)だ。

わかるようなわからないような。

仕方がないので bg_logo_s.png 読んでみると、意味が理解できました。
SDK1.5以降のエミュレータの起動は、-avdでエミュレータを指定してあげる必要があるらしいです。


ということでもう一度。

まずは、

1.コマンドかエクリプスでavdの作成を行います。

コマンドはこちら。
\android-sdk-windows-1.5_r3\tools>android create avd -n TestAVD -t 2

※-nはAVDの名前 -tはターゲット(1がAndroid 1.0、2がAndroid 1.5、 3がGoogle APIs 1.5)

エクリプスだとこちら。
WS000015.jpg

上記は結果が同じになります。


2.エミュレータを起動

\android-sdk-windows-1.5_r3\tools>emulator.exe -avd TestAVD -sdcard sdcard.img


これでOKのはずです。


おまけ。

WS000016.jpg

SDカードのとこに値を指定するだけで良かったらしい。。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。