書名 | 第一行コード:Android(第 2 版) |
---|---|
著者 | 郭霖 |
状態 | 読み終わった |
紹介 | Android + Java 開発 |
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 つの状態:実行状態、一時停止状態、停止状態、破棄状態。
OnSaveInstance: アクティビティが回収される前に呼び出され、一時データを保持できます。
- アクティビティの起動モード:standard、singleTop、singleTask、singleInstance。
ページコントロールとレイアウト#
- コントロールの可視性:visible、invisible、gone
- レイアウト
線形レイアウト LinearLayout:線形方向(水平 horizontal、垂直 vertical)で順次配置されます。
相対レイアウト RelativeLayout:相対位置決定方式(親レイアウトに対して、ページに対して)でコントロールを任意の位置に表示します。
フレームレイアウト FrameLayout:すべてのコントロールはデフォルトで左上に配置されます。
パーセントレイアウト:PrecentFrameLayout と PercentRelativeLayout
カスタムレイアウト:定義後、include でインポートします;
- コントロールの継承構造
- カスタムコントロール:カスタムレイアウトのロジックを再利用するために作成し、inflate でレイアウトファイルを動的に読み込みます。
フラグメント#
- アクティビティ内に埋め込むことができる UI の断片で、各フラグメントには対応するレイアウトファイル、コードファイルがあります。
- 1 つのアクティビティに複数のフラグメントを含めることができ、FrameLayout でフラグメントを切り替えます。
- フラグメント内でアクティビティを取得し、フラグメントとアクティビティ、フラグメント同士の通信を行います。
フラグメントのライフサイクル#
動的レイアウトの読み込み#
例えば:デバイスタイプ(タブレット、携帯電話)に応じて異なるレイアウトを使用します。
- 限定子を使用して異なるフォルダー名に対応します(限定子を利用してサイズ、解像度、方向を区別できます)。
ブロードキャストメカニズム#
プロセス間通信が可能です。
- 標準ブロードキャスト:非同期で、同時に受信し、中断できません。
- 順序ブロードキャスト:同期実行で、同時に 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 も使用できます。比較については以下の記事を参照できます。
コンテンツプロバイダー#
主に異なるアプリケーション間でデータ共有機能を実現するために使用されます。
例えば、電話帳プログラムが連絡先を共有します。
権限#
実行時権限:ソフトウェア使用中に特定の権限を付与します。
開発時
- ユーザーが権限を付与したかどうかを確認する 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 設定を実現します。