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

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

直前の記事「android_main 関数(ループ前)」では、android_main 関数の最初の部分について、検討しました。 ここでは、その続きで、メインループ開始前までの部分を検討しています。

自動生成されたコードのこの部分には、主にセンサーの初期化があります。今はセンサーを利用しないので深くは追っていません。

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

▼ セクション一覧

android_main 関数(ループ前2)
保存状態の復帰


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 では、「SensorManager」に該当します。 このクラスは 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 は、単なる構造体のようです。

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

▲ページ先頭へ

保存状態の復帰

投稿 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 構造体に入っていなくてはならない、ということです。

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

▲ページ先頭へ
line
関連トピックス
line

次の手順は・・・
android_main 関数(メインループ)

ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。メインループ処理を検討しています。

この記事の前は・・・
android_main 関数(ループ前)

ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。このページの前半です。

一番最初は・・・
Visual C++ 2015 で、新規プロジェクトを作成する

Visual C++ 2015 で、Android ネイティブアプリを作成するため、新規プロジェクトを作成する手順を記録しています。

line
その他のおすすめ
line

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

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


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