Mr.Raindrop

Mr.Raindrop

一切都在无可挽回的走向庸俗。
twitter
github

【読書ノート】第一行のコード:Android(第2版)

書名第一行コード:Android(第 2 版)
著者郭霖
状態読み終わった
紹介Android + Java 開発

第一行コード:Android(第 2 版)

Android システムアーキテクチャ

  • Linux カーネル層
  • システムランタイブラリ層
  • アプリケーションフレームワーク層
  • アプリケーション層

Android の四大コンポーネント:アクティビティ(Activity)、サービス(Service)、ブロードキャスト(Broadcast Receiver)、コンテンツプロバイダー(Content Provider)

プロジェクト構造#

java フォルダー:プロジェクトコード

res フォルダー: プロジェクト画像、レイアウト、文字列などのリソース。

  • Drawable フォルダー:さまざまなタイプのグラフィックリソースを保存するために使用され、PNG、JPEG、GIF 画像、XML で定義された描画可能リソース(形状、セレクターなど)、および 9 パッチ画像(9-patch)を含むがこれに限定されない。これらのリソースは背景、アイコン、区切り線などとして使用できます。

  • Mipmap フォルダー:主にアプリケーションランチャーアイコンを保存するために使用されます。mipmap フォルダーを使用することで、異なる解像度や画面密度のデバイスでアプリケーションアイコンが最適に表示されることを保証します。

  • Layout フォルダー:ページレイアウトファイル

build.gradle app モジュールの gradle ビルドスクリプト

AndroidManifest.xml プロジェクトの設定ファイルで、四大コンポーネントはここで登録されます。

アクティビティ#

  • メインアクティビティの設定: activity タグに intent-filter タグなどの宣言を追加します。
  • ** メニューの追加:**menu リソースファイルを構築し、アクティビティで参照します。

Intent#

Intent を使用してアクティビティの遷移、サービスの起動、ブロードキャストの送信などを行います。

  • 明示的 Intent:起動するアクティビティを明示的に指定します。
    • アクティビティ起動時のパラメータ渡し: putExtra -> getStringExtra。
    • 前のアクティビティにデータを返す:startActivityForResult で新しいアクティビティを起動し、onActivityResult で新しいアクティビティが破棄されるときに返されるパラメータを受け取ります。
  • 暗黙的Intent:activity 内で現在のアクティビティが応答する action と category を設定することで、他のプログラムのアクティビティを起動することもできます(プロトコルによって異なり、ウェブページ、電話などをサポートし、パラメータを渡します)。

各 Intent は 1 つの action しか指定できませんが、複数の category を指定できます。

ライフサイクル#

アクティビティの可視性、スタックのトップにあるかどうかに基づいて、アクティビティライフサイクルの 4 つの状態:実行状態、一時停止状態、停止状態、破棄状態。

image

OnSaveInstance: アクティビティが回収される前に呼び出され、一時データを保持できます。

  • アクティビティの起動モード:standard、singleTop、singleTask、singleInstance。

ページコントロールとレイアウト#

  • コントロールの可視性:visible、invisible、gone
  • レイアウト

線形レイアウト LinearLayout:線形方向(水平 horizontal、垂直 vertical)で順次配置されます。

相対レイアウト RelativeLayout:相対位置決定方式(親レイアウトに対して、ページに対して)でコントロールを任意の位置に表示します。

フレームレイアウト FrameLayout:すべてのコントロールはデフォルトで左上に配置されます。

パーセントレイアウト:PrecentFrameLayout と PercentRelativeLayout

カスタムレイアウト:定義後、include でインポートします;

  • コントロールの継承構造

image

  • カスタムコントロール:カスタムレイアウトのロジックを再利用するために作成し、inflate でレイアウトファイルを動的に読み込みます。

フラグメント#

  • アクティビティ内に埋め込むことができる UI の断片で、各フラグメントには対応するレイアウトファイル、コードファイルがあります。
  • 1 つのアクティビティに複数のフラグメントを含めることができ、FrameLayout でフラグメントを切り替えます。
  • フラグメント内でアクティビティを取得し、フラグメントとアクティビティ、フラグメント同士の通信を行います。

フラグメントのライフサイクル#

image

動的レイアウトの読み込み#

例えば:デバイスタイプ(タブレット、携帯電話)に応じて異なるレイアウトを使用します。

  • 限定子を使用して異なるフォルダー名に対応します(限定子を利用してサイズ、解像度、方向を区別できます)。

ブロードキャストメカニズム#

プロセス間通信が可能です。

  • 標準ブロードキャスト:非同期で、同時に受信し、中断できません。
  • 順序ブロードキャスト:同期実行で、同時に 1 つだけ受信します。

ブロードキャストタイプ

  • 動的登録:コード内で登録し、使用後は速やかに閉じる必要があります。
  • 静的登録:AndroidManifest で登録します。

システムのブロードキャスト受信には、一部で権限を宣言する必要があります。

ブロードキャストの送信

  • 標準ブロードキャスト:カスタム intent + sendBroadcast メソッド
  • 順序ブロードキャスト:カスタム intent + sendOrderedBroadcast メソッド

ローカルブロードキャスト

LocalBroadCast を使用してブロードキャストを広め、対応する送信および受信メソッドを使用します。

データ永続化技術#

Android における 3 つのデータ永続化方法

  • ファイル
  • SharedPreferences
  • データベース

ファイル#

  • アプリケーションディレクトリの files フォルダーに保存されます。
  • ファイルストリームの書き込み(openFileOutput、openFileInput)。

SharedPreferences#

キーと値のペアでデータを保存します。データはパッケージ名 /shared_prefs/ に XML 形式で保存されます。

データの保存#

  • sharedPreferences オブジェクトを取得し、edit () メソッドで Editor オブジェクトを取得します。
  • データオブジェクトを保存および取得します。
  • apply メソッドを使用して保存します。

データの読み込み#

  • get メソッドを使用してキーに基づいて対応する値を取得します。

SQLite#

書籍では、Android API、SQL 文、および LitePal メソッドを使用してデータベース操作を行うことが言及されており、Greendao も使用できます。比較については以下の記事を参照できます。

Android 中のデータベースフレームワーク GreenDao と LitePal の比較、統合、使用詳細、greendao とネイティブ SQLite の性能比較_litepal と sqlite、greendao のどちらが良いか - CSDN ブログ

コンテンツプロバイダー#

主に異なるアプリケーション間でデータ共有機能を実現するために使用されます。

例えば、電話帳プログラムが連絡先を共有します。

権限#

実行時権限:ソフトウェア使用中に特定の権限を付与します。

開発時

  • ユーザーが権限を付与したかどうかを確認する checkSelfPermission。
  • 権限が付与されていれば続行し、そうでなければ権限を要求する requestPermission。

他のプログラムのデータへのアクセス#

  • getContentResolver を使用してインスタンスを取得します。
  • データを読み取ります。

コンテンツプロバイダーの作成#

ContentProvider から継承したクラスを作成し、以下のメソッドをオーバーライドします。

  • onCreate 初期化呼び出し
  • query uri パラメータに基づいてどのテーブルをクエリするかを決定します。
  • insert 挿入
  • update 既存データの更新
  • delete 削除
  • getType uri に基づいて対応する MIME タイプを取得します。

モバイルマルチメディア#

通知#

  • 通知インスタンス NotificationManager を取得します。
  • 通知オブジェクトを作成し、Intent を追加して通知クリック操作を実行します。
  • 送信します。

カメラ、音声と動画#

ネットワーク#

  • webView を使用してウェブページを表示します。
  • http を使用して HttpURLConnection、OKHttp にアクセスします。

OKHttp を使用して GET、POST などのリクエストを行うことができます。

  • XML 解析:Pull 解析、SAX 解析
  • JSON 解析:JSONObject、GSON

サービス#

  • Android でプログラムをバックグラウンドで実行するための解決策。
  • アプリケーションプロセスが殺された場合、そのプロセスに依存するすべてのサービスも停止します。

Android マルチスレッドプログラミング#

Thread クラスを継承します。

Runnable インターフェースを実装します。

匿名クラスを作成します。

サブスレッドでの UI 更新#

Android ではサブスレッドで UI を更新することは許可されていません。

非同期メッセージ処理メカニズムを介してコントロールの更新を実現します。

非同期メッセージ処理の構成

  • Message:スレッド間で伝達されるメッセージ
  • Handler:メッセージを送信および処理します。
  • MessageQueue:メッセージキューで、すべての Handler のメッセージを格納し、各スレッドには 1 つだけ存在します。
  • Looper:スレッド内のメッセージキューを管理します。

AsyncTask の使用

  • onProExecute は実行前に呼び出されます。
  • doInBackground はサブスレッドで実行されます。
  • onProgressUpdate はバックグラウンドで publishProgress が UI を更新するのに応答します。
  • onPostExecute はタスク実行完了後の操作です。

サービス#

  • 定義後、Intent を介して起動または停止します(startService、stopService)。
  • サービスインスタンスは 1 つだけですが、startService を呼び出すたびに onStartCommand が 1 回実行されます。

** フォアグラウンドサービス:** サービスに通知を追加し(通知バーに表示)、startForeground を呼び出します。

**IntentService:** 非同期、自動停止。


アクティビティとサービスの通信#

  • Binder オブジェクトを構築し、Service で onBind メソッドを使用します。
  • アクティビティで Binder メソッドを呼び出します。

位置ベースのサービス#

  • API キーを申請し、SDK をダウンロードします。
  • 権限を宣言します。
  • 緯度と経度、住所、地図を含む位置情報を取得します。

Material Design#

  • ToolBar
  • スライドメニュー 最初の子コントロールがメインページの内容を表示し、2 番目が隠しコンテンツを表示します。
  • NavigationView はスライドメニューの上部とメニューのレイアウトをカスタマイズできます。
  • FloatingActionButton 浮動ボタン
  • SnackBar 提示と操作可能なボタンを追加します。
  • CoordinatorLayout はすべての子コントロールのイベントを監視し、自動的に合理的な応答を行います。
  • CardView カードレイアウト
  • SwipeRefreshLayout プルダウン更新

上級開発#

  • カスタム Application クラスでグローバルに Context を取得します。
  • オブジェクトの Serializable(シリアル化実装)または Parcelabel(完全なオブジェクトを分解)インターフェースを実装して、Intent でオブジェクトを渡します。
  • カスタムログツールを作成します。
  • 定期タスクを作成します:Alarm 設定を実現します。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。