トップページ > 記事閲覧
【Android】アプリ再立ち上げ時に初期化したい
名前:まるまる 日時: 2019/12/24 01:06

Android版にて、アプリ再立ち上げ時にグローバル変数を初期化する方法はないのでしょうか? または、後述の通りアプリ自身のプロセスを終了する手段でも良いと考えています。 以下は、アプリを立ち上げると2つの変数が高速にカウントアップされ、端末の"戻る"ボタン を押すとアプリが終了するサンプルです。 端末の戻るボタンを押すと見かけ上はアプリが終了しますが、そのまま再度アプリを実行すると、  グローバル変数:カウントがリセットされない  ローカル変数:カウントがリセットされる と差が生まれます。 ---------- #include "DxLib.h" int cntG = 0; int android_main(void) { if( DxLib_Init() == -1 ){ return -1; } int cntL = 0; while( ProcessMessage() == 0 ) { //Ecsキー(or 戻るボタン)を検出したらループから抜ける if( CheckHitKey(KEY_INPUT_ESCAPE) == 1 ){ break; } ClearDrawScreen(); DrawFormatString(50, 50, GetColor(255, 255, 255), "グローバル変数:%d", cntG); DrawFormatString(50, 80, GetColor(255, 255, 255), "ローカル変数 :%d", cntL); cntG += 1; cntL += 1; WaitTimer(10); } DxLib_End(); return 0; } ---------- アプリ側で「DxLib_End(); ⇒ return 0;」を呼ぶとホーム画面には戻るものの、起動中の アプリリストを開くと裏ではアプリのプロセスが残った状態になっています。 裏でアプリのプロセスが残ったい状態のまま再度アプリを立ち上げると、android_main()関数 内は再実行されるものの、グローバル変数は初期化されないようです。  ※手動でアプリリストから完全に終了すれば、再実行時はグローバル変数も初期化される。 いくら何でも、ユーザーに対して『アプリ終了時は手動でアプリリストから完全終了して ください』と案内するのは、不自然かつ不親切なので避けたいと思います。 ひとつ思いつく方法としては、何かしらの方法でアプリ自身のプロセスを終了させる方法です。 既存アプリでも、例えばMicrosoftのEdge(Android版)では、アプリ上からアプリ自身の プロセスを終了する機能を提供しているようですが、ネットで軽く調べてもSystem.exit()や Activity#finish()などのそれらしい機能は見当たるものの、正しく使いこなすのはハードルが 高いと感じています。 他力本願で恐縮ですが、DXライブラリ側で(例えばEdgeのように)アプリ自身のプロセスを 終了させる手段を提供していただけると大変助かるのですが、いかがでしょうか・・・? 上記のサンプルレベルであれば、「グローバル変数を使わない」や「android_main()関数内 で再度初期化する」などの手もあるのですが、 私の身勝手な都合ではあるものの、別途Windows版で作ったものを移植する関係で、複雑な コード全体を見直すのは現実的ではないことから、何か方法がないかご相談した次第です。 よろしくお願いします。
メンテ

Page: 1 |

Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.1 )
名前:管理人 日時:2019/12/24 02:50

> Android版にて、アプリ再立ち上げ時にグローバル変数を初期化する方法はないのでしょうか? 現時点ではまるまるさんも仰られている「android_main()関数内で再度初期化する」しか無いですね… > 他力本願で恐縮ですが、DXライブラリ側で(例えばEdgeのように)アプリ自身のプロセスを > 終了させる手段を提供していただけると大変助かるのですが、いかがでしょうか・・・? APIレベル21( Android 5.0 ) 以降は Activity#finishAndRemoveTask() で完全終了できるそうです ただ、これが C++ を使う NativeActivity でも使えるのか不明なので、試す必要があります 本日はもう時間が無いので、明日以降試してみたいと思います m(_ _)m
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.2 )
名前:管理人 日時:2019/12/25 01:44

finishAndRemoveTask を使用したところ、終了後にタスク一覧に残らなくなりましたが ネイティブレベル( C++ レベル )のタスクはしっかり残ってしまっているらしく やはり再起動時にグローバル変数の値はそのままでした orz 他にも killProcess というAPIでアプリを終了する方法もあるようなので、 次は killProcess を試してみます
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.3 )
名前:まるまる 日時:2019/12/25 07:59

DXライブラリ側でアプリ自体のプロセスを終了する手段の提供を検討して 頂ける旨、承知しました。 ご対応ありがとうございます。非常に助かります。 引き続き、よろしくお願い致します。
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.4 )
名前:管理人 日時:2019/12/26 01:16

killProcess では意図した通りにプロセスが完全終了してくれました android_main から抜けた際に killProcess で完全終了するかどうかを設定するための関数 SetUseAndroidKillProcessFlag を追加したバージョンをこちらにアップしましたので、 よろしければダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 追加した SetUseAndroidKillProcessFlag の定義は以下の通りです // アプリを終了した際に、プロセスを完全に終了するかを設定する // KillProcessFlag // TRUE : アプリを終了したら、プロセスを完全に終了する // FALSE : アプリを終了しても、プロセスは完全には終了しない( デフォルト ) ) int SetUseAndroidKillProcessFlag( int KillProcessFlag ) ; DxLib_Init の呼び出し前に SetUseAndroidKillProcessFlag( TRUE ); という記述を増やせば、android_main から return で抜けてソフトを終了した際に プロセスを完全に終了させて、次の起動の時はグローバル変数も初期化された状態になります よろしければお試しください m(_ _)m ( 因みにプロセスが生き残っているかどうかと、アプリリストに残っているかどうかは別らしく、 この関数を使用してプロセスを完全に終了しても、アプリリストには残ったままです )
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.5 )
名前:まるまる 日時:2019/12/28 09:01

ご対応ありがとうございます。 Android 10端末で、グローバル変数が初期化さえることを確認しました。 一方で、4.4.2では依然として正しく初期化されないようです。 "killProcess"は「API level 1」と定まっているため、OSバージョンには依存せず Android 4でも動作する認識ですが、ライブラリ側の仕様でしょうか?  ttps://developer.android.com/reference/android/os/Process.html#killProcess(int) なお、確認端末はXperia SO-02Fです。
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.6 )
名前:管理人 日時:2019/12/28 23:26

すみません、killProcess を呼んでいる箇所が少し前まで API level 21 以降でしか 使用できない finishAndRemoveTask を呼んでいた箇所で、API level 21 未満では 処理を行わないようにする if 文がそのままとなっていました 4.4.2 でも killProcess が呼ばれるように修正しましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 【Android】アプリ再立ち上げ時に初期化したい ( No.7 )
名前:まるまる(解決) 日時:2019/12/29 01:49

頂いた修正版を試したところ、Android 4.4.2でも正しく動作しました。 非常に助かりました。 そのまま使わせていただきます。 ご対応ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存