2022/03/26 初めてのスマホ2
修正 2022/04 細かい間違いを修正、「前回」はリンクに修正
スマホは色々な帯域の電波を受信していると述べた。
通常帯域が違うと別々のアンテナを用意しなければならない。
それ以外にも重力センサー、加速度センサー、ジャイロセンサー等のセンサーもある。
さらにカメラもある。マイク、スピーカーもある。
パソコンとしての役割のRAM、ROMもある。
これだけのものをあの小さい筐体に集約させているとは驚きだ。
前回も述べたがやっぱりわからないので、開発環境を入れて勉強してみることにした。
どうやら Android の場合は、Windows と違って、開発環境は無料で揃えられそうだ。
ただソフトの公開時には少しお金がいるようだ。
ソフトを公開するかどうかは別にしてとりあえず勉強してみよう。
開発言語は、Java か Kotlin になる。
Java のほうがメジャーという理由だけだが Java にした。
Java の文法を図書館で調べてみると、C# に似ている。
作者作成ソフトはすべて Visual C++ だが、Visual C# は仕事で使っていたので、
そんなに難しくないなと考えていた。
「はじめてのAndroidアプリ開発 Java編」を買って例題をやってみたのだが、よくわからない。
まずは例題で使われている Java 文法についてだが、
匿名クラスやラムダ式が頻繁に出てきてちょっと参ってしまった。
C# や C++ に匿名クラスやラムダ式ってあったっけ?
あったにしてもかなり上級者用の文法で詳しい教科書の最後に少し出てくる程度ではないか。
相当な開発経験があっても使ったことのある人はあまりいないのではないか。
また Java のジェネリックは、私はまだ理解できていない。
C++ ではテンプレートで実現し開発経験もある。スマートポインターも自作した。
C# でもジェネリック(Java と同じ言葉)の開発経験がある。
それでも理解しずらいというのはなかなか厄介だ。
それにかなり膨大なクラスの数が出てくる。
Visual C#、Visual C++ では簡単に考えられることを、
Android Studio ではわざとクラスの設計を複雑にしているのではないかと考えてしまう。
当節のタイトルに関してまとめておく。
Android Studio(Java)の特筆すべきことは次節で述べる。
イベントドリブンを実現させるコードについては、
Android Studio ではリスナーを定義するようになっている。
Visual C++ では WNDPROC を明示的にコーディングしている。
Visual C# では上記 WNDPROC を隠している。
代入演算子'='が3つの言語で異なっている。
・C++:浅いコピー
・C#:深いコピー
・Java:ポインターのコピー
これが結構言語の個性になっている。
C++ では浅いコピーなので、深いコピーにするために
代入演算子をオーバーライドするのは当たり前になっている。ロードから修正 2022/04
深いコピーに変更するのは決まりきったコーディングをすることになるので、
その点を自動にして改良した言語が C# である。
一番メモリを使わないのは Java で、
だからこそメモリーの少ないスマホの言語に採用されたのかもしれない。
C++ には delete 文(メモリー開放)があるが、C#, Java にはない。
参照カウンターを使うと delete のタイミングが決められるので、
最近のコンピューター言語は delete を自動で行うようになっている。
C#, Java では抽象クラスの実装はよく行われる。
Visual C++ でも近い概念がある。
IUnknown から継承された COM オブジェクト、例えば IDropTarget, IDropSource を実装して
CDropTarget, CDropSource にした経験はある。
C++ は多重継承ができるが、インターフェース文はない。
C#, Java は多重継承はできないが、インターフェース文がある。
この辺の違いが分かるまでの開発経験は私にはない。
これは2.節の説明の一部になっている。
Android Studio ではウイジェット(画面上の部品のこと)の配置方法を指定する。
Visual C++ やVisual C# ではコントロール(画面上の部品のこと)は固定座標になる。
様々でかつ小さい解像度で画面を設計するのだから、こういう風になるのも必然なのかと思う。
驚いたことには、Android ではアクティビティ(画面のこと)からアクティビティを呼び出すには
Android の介入が必要ということだ。
Windows では画面から画面を呼び出すのは簡単なことだ。
さらに 親アクティビティから子アクティビティを呼び出したあとの親アクティビティが
保持されているかは保証されない。
Android がメモリーが足りないと強制的に破棄することもあるのだ。
サービスという言葉は Android でも Windows でもある言葉だが、少し異なっている。
Windows のサービスは何もしなくてもパソコンの起動をすると実行される。
Android のサービスはそれに対するアプリを起動しないと起動しない。
Windows では最初から起動させるスタートアップという機能があるが Android にはなさそうである。
「Japan Wi-Fi auto-connect」は常駐させたいと思うのだが
Android を再起動したすぐは実行していないようである。
当アプリは、再起動後、手動で実行させている。
Android Studio ではウイジェットに対してモーションが定義できる(即ちアニメーションが作れる)など
Visual Studio(Visual C#、Visual C++ の総称)に比べて非常によくできている。
これがオープンソースということか!