Android 入門を読んでいる
使ってた筋トレ記録アプリが突如としてサービスを終了し、他にしっくり作るアプリが見つからなかったのでとにかく単純なログアプリを作ろうとしている。 ので、とりあえずAndroid入門を読んでいる。
てきとう
- Activity:単位がよくわからない。今の所1画面1アクティビティだけど説明見た感じそういう事でもなさそう
- ユーザがなんかする1単位? * 画面でいいらしい
- AndroidManifest.xml
- 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
- 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でいいやとなってしまった 初期化はどのタイミングでするのが良いのだろうか あとはマイグレーションどうするとかかなーその辺解決したらとりあえず作り始めて良さそうだ
なんかこのチュートリアルが良さそう
Android Room with a View - Kotlin
リポジトリがDao持ってて、ViewModelインスタンスの初期化時にリポジトリ初期化してあとはViewModelがリポジトリ持ってる感じだった これActivityでも同じ事していいんだろうか というかViewModelがなんなのかよくわかってない
なんかいい感じのサイズのサンプルアプリケーションとかないかな
サンプルを眺める
良さげだ