Xamarin.Android
アプリケーションのライフサイクル - Xamarin.Andorid
サーチ…
前書き
Xamarin.Androidアプリケーションのライフサイクルは、通常のAndroidアプリと同じです。ライフサイクルについて言えば、アプリケーションライフサイクル、アクティビティライフサイクル、およびフラグメントライフサイクルについて話す必要があります。
以下では、それらを使用するための良い説明と方法を提供しようとします。私は公式のAndroidとXamarinのドキュメントと以下の備考のセクションで提供されている多くの役に立つWebリソースからこのドキュメントを入手しました。
備考
Androidアプリケーションのライフサイクルに関する幅広い知識への興味深いリンク:
https://developer.android.com/reference/android/app/Activity.html
http://www.vogella.com/tutorials/AndroidLifeCycle/article.html
https://github.com/xxv/android-lifecycle
https://developer.android.com/guide/components/fragments.html
https://developer.android.com/guide/components/activities/activity-lifecycle.html
アプリケーションライフサイクル
まず、Android.Applicationクラスを拡張して、アプリのライフサイクルに関連する2つの重要なメソッドにアクセスできるようにする必要があります。
OnCreate - アプリケーションの起動時に、他のアプリケーションオブジェクト(MainActivityなど)が作成される前に呼び出されます。
OnTerminate - このメソッドは、エミュレートされたプロセス環境で使用するためのものです。これは、Android搭載デバイスでは決して呼び出されません。プロセスを単に殺すだけでプロセスが削除されます。このとき、ユーザーコード(このコールバックを含む)は実行されません。ドキュメント: https : //developer.android.com/reference/android/app/Application.html#onTerminate()
Xamarin.Androidアプリケーションでは、Applicationクラスを以下のように拡張できます。 "MyApplication.cs"という新しいクラスをプロジェクトに追加します:
[Application]
public class MyApplication : Application
{
public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
{
}
public override void OnCreate()
{
base.OnCreate();
}
public override void OnTerminate()
{
base.OnTerminate();
}
}
上で書いたように、OnCreateメソッドを使うことができます。たとえば、ここでローカルデータベースを初期化したり、追加の設定を行うことができます。
さらに、OnConfigurationChangedやOnLowMemoryのようにオーバーライドできるメソッドがあります。
アクティビティライフサイクル
アクティビティのライフサイクルはかなり複雑です。あなたが知っているように、アクティビティはユーザーがそれとの対話を実行できるAndroidアプリ内の単一のページです。
下の図は、Android Activityライフサイクルの様子を示しています。
ご覧のとおり、Activityライフサイクルの具体的な流れがあります。モバイルアプリケーションでは、特定のライフサイクルの断片を処理する各アクティビティクラスのメソッドがあります。
[Activity(Label = "LifecycleApp", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Log.Debug("OnCreate", "OnCreate called, Activity components are being created");
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.MainActivity);
}
protected override void OnStart()
{
Log.Debug("OnStart", "OnStart called, App is Active");
base.OnStart();
}
protected override void OnResume()
{
Log.Debug("OnResume", "OnResume called, app is ready to interact with the user");
base.OnResume();
}
protected override void OnPause()
{
Log.Debug("OnPause", "OnPause called, App is moving to background");
base.OnPause();
}
protected override void OnStop()
{
Log.Debug("OnStop", "OnStop called, App is in the background");
base.OnStop();
}
protected override void OnDestroy()
{
base.OnDestroy();
Log.Debug("OnDestroy", "OnDestroy called, App is Terminating");
}
}
公式のAndroidのドキュメントには良い説明があります:
アクティビティの全ライフタイムは、onCreate(Bundle)の最初の呼び出しからonDestroy()の最後の呼び出しまでの間に発生します。アクティビティはonCreate()で "グローバル"状態のすべての設定を行い、残りのすべてのリソースをonDestroy()で解放します。たとえば、ネットワークからデータをダウンロードするスレッドがバックグラウンドで実行されている場合、onCreate()でそのスレッドを作成してから、onDestroy()でスレッドを停止することがあります。
アクティビティの可視的な有効期間は、onStart()への呼び出しと対応するonStop()への呼び出しの間で発生します。この間、ユーザは画面上のアクティビティを見ることができますが、フォアグラウンドには存在せず、ユーザと対話することもできます。これらの2つの方法の間で、ユーザーにアクティビティを表示するのに必要なリソースを維持できます。たとえば、OnStart()にBroadcastReceiverを登録して、UIに影響を与える変更を監視し、ユーザーが表示しているものが表示されなくなったときにonStop()で登録を解除できます。 onStart()メソッドとonStop()メソッドは、アクティビティが表示されてユーザーに表示されなくなるため、複数回呼び出すことができます。
onResume()の呼び出しとonPause()への対応する呼び出しの間で、アクティビティのフォアグラウンドの存続期間が発生します。この間、アクティビティは他のすべてのアクティビティの前にあり、ユーザと対話します。たとえば、デバイスがスリープ状態になったとき、アクティビティ結果が配信されたとき、新しいインテントが配信されたときなど、アクティビティは頻繁に再開と一時停止の状態になることがあるため、これらのメソッドのコードはかなり軽量でなければなりません。
フラグメントライフサイクル
あなたが知っているように、1つのアクティビティを持つことができますが、その中には異なるフラグメントが埋め込まそのため、フラグメントライフサイクルも開発者にとって重要です。
下の図は、Androidのフラグメントライフサイクルがどのようになっているかを示しています。
公式のAndroidのドキュメントに記載されているように、少なくとも以下の3つの方法を実装する必要があります:
OnCreate - フラグメントを作成するときにシステムがこれを呼び出します。実装内では、フラグメントが一時停止または停止してから再開するときに保持したいフラグメントの重要なコンポーネントを初期化する必要があります。
OnCreateView - フラグメントが初めてユーザーインターフェイスを描画するときにシステムがこれを呼び出します。フラグメントのUIを描画するには、フラグメントのレイアウトのルートであるこのメソッドからViewを返す必要があります。フラグメントがUIを提供しない場合、nullを返すことができます。
OnPause - このメソッドは、ユーザーがフラグメントを離れる最初の指示としてコールされます(必ずしもフラグメントが破棄されているとは限りません)。これは通常、(ユーザーが戻ってこない可能性があるため)現在のユーザーセッションを超えて保持する必要のある変更をコミットする場所です。
ここにXamarin.Androidのサンプル実装があります:
public class MainFragment : Fragment
{
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
// You should initialize essential components of the fragment
// that you want to retain when the fragment is paused or stopped, then resumed.
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
// The system calls this when it's time for the fragment to draw its user interface for the first time.
var mainView = inflater.Inflate(Resource.Layout.MainFragment, container, false);
return mainView;
}
public override void OnPause()
{
// The system calls this method as the first indication that the user is leaving the fragment
base.OnPause();
}
}
もちろん、別の状態を扱う場合は、ここにメソッドを追加することもできます。
GitHubの完全なサンプル
下記の方法で基本プロジェクトを取得したい場合は、私のGitHubからXamarin.Androidアプリケーションテンプレートをダウンロードできます。あなたは次の例を見つけることができます:
- アプリケーションライフサイクルメソッド
- アクティビティライフサイクルメソッド
- フラグメントライフサイクルメソッド
https://github.com/Daniel-Krzyczkowski/XamarinAndroid/tree/master/AndroidLifecycle/LifecycleApp