このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成日 January 29, 2018、最終更新日 June 8, 2019(様式変更)
トップページ > Android 開発トップ > android_main 関数(ループ前2)

Android 開発

ここでは、android_main 関数のメインループ前の処理(センサー初期化部)を検討しています。

android_main 関数(ループ前)」では、android_main 関数の最初の部分について、検討しました。 ここでは、その続きで、メインループ開始前までの部分を検討しています。
自動生成されたコードのこの部分には、主にセンサーの初期化があります。今はセンサーを利用しないので深くは追っていません。

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

android_main 関数(ループ前2)

投稿 January 29, 2018, 最終更新 July 30, 2018(様式変更)

Visual C++ 2015 で、新しく Android ネイティブアプリを作成したときに作成される、main.cpp の android_main 関数の struct engineengine を初期化・設定したあとの部分、メインループ前までを検討します。

void android_main(struct android_app* state) {
	(中略)

	// 加速度計の監視の準備
	engine.sensorManager = ASensorManager_getInstance();
	engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, ASENSOR_TYPE_ACCELEROMETER);
	engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager, state->looper, LOOPER_ID_USER, NULL, NULL);

	if (state->savedState != NULL) {
		// 以前の保存状態で開始します。復元してください。
		engine.state = *(struct saved_state*)state->savedState;
	}
→ 以降、メインループに続く。

engine.sensorManager は、ASensorManager* として定義されています。 Android Developers では、これに該当します。 このクラスは android.hardware.SensorManager ですので、ハードウェアに関するものと言えます。 デバイスのセンサーへのアクセスであるとされています。
ASensorManager_getInstance 関数は、センサーマネージャーへの参照を返している、ということになります。

注意書きとして、センサーを使わないとき、特にアプリがポーズ状態(表にいない)では必ず disable すること、でないと電池の無駄遣いになります、とありますので、注意しないといけません。

engine.accelerometerSensor は、const ASensor* として定義されています。 Android Developers の Sensor のページに、センサーの一覧がありました。 ASensorManager_getDefaultSensor 関数ASENSOR_TYPE_ACCELEROMETER を渡して、加速度の既定センサーを取得しています(ない場合は NULL が返る)。

engine.sensorEventQueue は、ASensorEventQueue* として定義されています。 「新たなセンサー イベントキューを作成し、ルーパーに関連づけます」ということです。 「ルーパー」とは 「スレッドのイベントループをトラックしている状態のこと」だそうですが、現時点では、Windows の「メッセージキュー」相当、と考えて良さそうです。 第2引数の state->looperALooper* であるとされていますので、ここにメッセージが送られる、と言えます。 なお、ALooper は、単なる構造体のようです。

まとめると、加速度センサーを使いたいので、加速度センサーを取得するためにセンサーマネージャーを取得し、それを使って加速度センサーを取得、 発生イベントの通知先イベントキューを作成している、ということになります。 センサーを使わないアプリについては、この部分は削除してよい、というよりも、残しておくとバッテリーを消費する、ということになりそうです。

▲ページ先頭へ

保存状態の復帰

投稿 January 29, 2018, 最終更新 July 30, 2018(様式変更)

続きの部分についても確認します。

	if (state->savedState != NULL) {
		// 以前の保存状態で開始します。復元してください。
		engine.state = *(struct saved_state*)state->savedState;
	}

今わかっているところ ( 1/29/2018 時点 ) では、アプリの起動時には state->savedState は NULL であり、 アプリがポーズ状態(アクティブでなくなった状態、裏にまわっている状態)になるとき、保存したいデータを malloc 関数で確保したメモリへのポインタを設定する、 ということです。APP_CMD_SAVE_STATE が通知されたとき、データを保存しています。

基本的に、ポーズ状態になると、ここで保存したデータ以外は壊されても文句を言えない、なので状態を再現するのに必要なデータは保存が必要、 で、それはコードの通り、struct saved_state 構造体に入っていなくてはならない、ということです。

なるべく元の状態に戻したいからといって、あまりにもたくさんの(メモリを使う)データを保存するのも良くないでしょうから、サイズの目安があるといいのですが。

▲ページ先頭へ

関連トピックス

android_main 関数(ループ前)
ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。前半部分を扱っています。

android_main 関数(メインループ)
ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。このページの続きです。


その他のおすすめ

おすすめ記事はありません。

JavaScriptが無効です
▲ページ先頭へ


© 2017-2019 StraightApps.com 無断転載を禁じます。No reproduction without permission.