質問: new Intent(this, nextType) StartActivity(nextIntent); }; } } ``` ### 試したこと StartActivity で画面遷移後に、呼び出した Activity にて Finish メソッドを実行しました。 ### 補足情報(FW/ツールのバージョンなど) 実行中に、出力ウィンドウにてメモリの増加を確認しましたが、Finish にて完全に開放されていないようでした。 Xamarin や Andoroid の開発は初めてで、ネットの情報を調べながら、上記要件の処理に対して、どのような方法が良いのかについて調べましたが、明確な情報を得ることができませんでした。
回答: どのようなアプリは分からなものの、「750回超もの(永遠に、延々と)画面遷移に耐えられる事」は過剰要件な気がしますが、解決必須ということであればご参考になれば。 ひとつは、問題を単純化するために Xamarin.Android の使用をやめ、Android Studio(Java または Kotlin)で同様の再現を試みることです。 Xamarin.Android は、Java の世界のメモリ管理に加え、.NET の世界のメモリ管理も並行して行っているため、どちらで問題が起こっているか切り分けが難しいです。 * Xamarin.AndroidにおけるJava相互運用の仕組みと、Javaバインディング・プロジェクト - Build Insider 次に、Android Studio(Java または Kotlin)で問題の再現ができれば、どこでメモリリークが発生しているかを突き止められます。これには LeakCanary というライブラリが便利です。 * LeakCanary 同種のライブラリは他にもあるかも知れません。 また、基本的なところですが、 > > Finish にて完全に開放されていないようでした > > > Activity のメモリ管理は Android OS に委ねられているので、Finish したらすぐにメモリが開放されることは通常ありません。 また、Java(JVM) でもあるのでガベージコレクトが実行されなければメモリが開放されることはありません。ガベージコレクトは `java.lang.System.gc()` で強制的に実施できます。 * アクティビティのライフサイクルについて | Android Developers なので上記コードで言えば `_button` のようなクラス内変数のインスタンスは、Activity がシステムにより破棄され、ガベージコレクトが実施されない限り残ることになります。 それでも通常は、システムが「メモリが少なくなってきた」ことを検知して適宜 Activity を破棄してくれるはずなのでそれほど気にしないです。 尚、開発者向け設定で「アクティビティを保持しない」と ON にすると、より積極的に Activity が破棄されると思います。 最後にこれは主観ですが、モバイル向けOSは、「永遠に動作し続ける事」よりも「突如端末が終了しても続きから復帰できる事」に重きが置かれていると考えるので、端末によっては(あるいは元の Android OS 自体にも)長時間動作に係る不具合はあってもおかしくないのでは、と思います。