Android 入門を読んでいる

Android 入門を読んでいる

使ってた筋トレ記録アプリが突如としてサービスを終了し、他にしっくり作るアプリが見つからなかったのでとにかく単純なログアプリを作ろうとしている。 ので、とりあえずAndroid入門を読んでいる。

てきとう

  • Activity:単位がよくわからない。今の所1画面1アクティビティだけど説明見た感じそういう事でもなさそう
    • ユーザがなんかする1単位?  * 画面でいいらしい
  • AndroidManifest.xml
    • Chrome extensionのマニフェストみたいな
    • アイコンとかどういう画面あってどういう関係か、とかを定義
    • 呼べるAPIの制限とか
      • カメラ使えるかどうかとか
  • ViewGroupはViewを束ねたやつ
    • レイアウト、という感覚で良さそう
    • Viewはレイアウト内の要素
  • UIはXMLで定義する
  • テキストはstrings.xmlに定義してUIのXMLで設定する
  • リソースはR.xxx(package).xxx(id)で参照できる
    • なんでだ

ボタン押してどうこう

Activity内にメソッド定義(引数がViewで、戻り値なし)して、これをView側のonClick属性に設定すると押したタイミングでメソッドがコールされる。

IntentはコンポーネントをバインドしてXXXする、みたいなのを表現する何かっぽいが感覚がわからん。Activity内のメソッドから別のActivityをセットしたIntentを用意してstartAcitivity()するとActivityから別のActivityを起動できる感じ。 Intent経由でActivity間のメッセージ送信もできる。起動した後のActivityでもIntentを参照できるっぽい。同じインスタンスなのかよくわからん。

Android StudioでActivity作るときはNew > Activity > Empty Activityで作るとレイアウトファイル作ってマニフェストにActivityをセットして、までをまとめてやってくれる。

コンポーネント

https://developer.android.com/guide/components/fundamentals?hl=ja

  • Activity
    • 画面
  • Service
    • バックグラウンドで動くやつ
    • 再生中の曲とか
  • ContentProvider
    • なんか永続化するやつとか
    • あんまわからん
    • ActivityからSQLite呼ぶ的なあれとは違うのか
    • ガイドにSQLiteがどうこうって書いてあるけどSQLiteデファクトスタンダート的なあれなのだろうか
  • BroadcastReceiver
    • なんかイベントハンドラ的なやつ?
    • 電池きれそうになったらXXXX!とかなんかダウンロード終わったら通知みたいな
    • 状況に関わらずなんか起きたらなんかする、みたいな感じ?

別のアプリのアクティビティも起動できるらしい。自分で開発したアプリからデフォルトのカメラアプリを起動するとか。プロセスは別になる。 なので、Androidアプリのエントリポイントは複数あって、main()ではない。いわゆるアプリ起動時のエントリポイントはマニフェストで定義する。

なんとなく雰囲気的には

アクティビティからインテントを定義して別のコンポーネントをコール→コンポーネントが起動する。インテントでゴニョゴニョする→元のアクティビティに戻したければ戻す。インテントを介してデータを戻したりもできる

みたいな感じが基本的な流れなんだろうか

コンテンツプロバイダ

https://developer.android.com/guide/topics/providers/content-provider-basics?hl=JA

そもそもなんなのかがわからん 永続化のための抽象的なレイヤーなのかなと思ってるが

なのでチュートリアルを見ている https://developer.android.com/guide/topics/providers/content-provider-creating

と思ったけど単純にローカルのSQLite使いたいだけならRoomな感じがするな

Room

https://developer.android.com/training/data-storage/room

we highly recommend using Room instead of SQLite はい

DatabaseクラスからDaoを取ってきてDao経由でEntityを取得したり永続化したりする感じだ

適当なボタンのonClickからデータを登録したりなんだりしたらこうなった

Caused by: java.lang.RuntimeException: cannot find implementation for com.example.myfirstapp.model.AppDatabase. AppDatabase_Impl does not exist

https://stackoverflow.com/questions/46665621/android-room-persistent-appdatabase-impl-does-not-existの回答に従ってbuild.gradleをいじると

Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

になった。

https://qiita.com/toastkidjp/items/49ad3035a6df525ce040 ほーーん???

ほーーん?????

ボタン押すとデータ取ってきて画面に表示、みたいのはどう実装するのが良いのか

安直にAsyncTaskで全部やるようにしたら元のスレッドからしかビューをいじれんぞと怒られる

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

DB触るだけならこれで良さそうだけど画面に表示して云々はこれだとダメそう

DB触るの重い処理だからバックグラウンドでやろうぜ、はわかるようなわからないような感じなんだけど(SPAでAPI叩くのと同じノリだと思っている)、紙芝居形式のアプリでそこ頑張るメリットがよくわからなかったのでとりあえずallowMainThreadQueriesでいいやとなってしまった 初期化はどのタイミングでするのが良いのだろうか あとはマイグレーションどうするとかかなーその辺解決したらとりあえず作り始めて良さそうだ

qiita.com

なんかこのチュートリアルが良さそう

Android Room with a View - Kotlin

リポジトリがDao持ってて、ViewModelインスタンスの初期化時にリポジトリ初期化してあとはViewModelがリポジトリ持ってる感じだった これActivityでも同じ事していいんだろうか というかViewModelがなんなのかよくわかってない

qiita.com

なんかいい感じのサイズのサンプルアプリケーションとかないかな

サンプルを眺める

github.com

良さげだ