Xamarin Native эквивалент приложений Xamarin.Forms OnSleep и OnResume
Я работаю с приложением Xamarin Native и хотел бы выполнить некоторую логику, когда приложение сфокусировано / не сфокусировано в android - аналогично Xamarin.Forms Application.OnSleep()
, а также Application.OnResume()
(не путать с Activity.OnResume
, а также Activity.OnPause
)
Просто интересно, какое решение другие использовали для решения этого сценария (помимо перехода на Xamarin.Forms).
2 ответа
[Application]
public class MyApp : Application, ILifecycleObserver
{
[Export, Lifecycle.Event.OnStop]
public void OnAppBackgrounded()
{
}
[Export, Lifecycle.Event.OnStart]
public void OnAppForegrounded()
{
}
public override void OnCreate()
{
// For handling when the app goes into the foreground or background
ProcessLifecycleOwner.Get().Lifecycle.AddObserver(this);
}
Пока все работает как ожидалось. ProcessLifecycleOwner находится вXamarin.Android.Arch.Lifecycle.Extensions
пакет nuget.
когда приложение сфокусировано / не сфокусировано в android
Вы имеете в виду, что хотите прослушивать приложение, работающее на переднем или заднем плане?
Если да, вы можете использовать IActivityLifecycleCallbacks для прослушивания статуса.
Application
Регистрация ActivityLifecycleCallbacks
, например, когда происходит каждое действие в жизненном цикле приложения, Приложение может прослушивать. Номерpublic void onActivityStarted(activity activity)
а также public void onActivityStopped(activity activity)
действия можно использовать, чтобы определить, находится ли приложение на переднем плане. Поскольку, когда приложение находится на переднем плане, действие должно быть запущено onActivityStarted, но не onActivityStopped, поэтому статистика количества действий, открытых в приложении, должна быть1
. Когда приложение переключается в фоновый режим, activityStartCount будет0
.
так что напишите классы помощника:
public class AppFrontBackHelper
{
public static OnAppStatusListener mOnAppStatusListener;
private LifecycleCallBack lifecycleCallBack;
public AppFrontBackHelper()
{
}
/**
* Register status listener, only used in Application
* @param application
* @param listener
*/
public void register(Application application, OnAppStatusListener listener)
{
mOnAppStatusListener = listener;
lifecycleCallBack = new LifecycleCallBack();
application.RegisterActivityLifecycleCallbacks(lifecycleCallBack);
}
public void unRegister(Application application) => application.UnregisterActivityLifecycleCallbacks(lifecycleCallBack);
public interface OnAppStatusListener
{
void onFront();
void onBack();
}
public class LifecycleCallBack : Java.Lang.Object, Application.IActivityLifecycleCallbacks
{
public int activityStartCount { get; private set; }
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
{
}
public void OnActivityDestroyed(Activity activity)
{
}
public void OnActivityPaused(Activity activity)
{
}
public void OnActivityResumed(Activity activity)
{
}
public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
{
}
public void OnActivityStarted(Activity activity)
{
activityStartCount++;
//A value from 1 to 0 indicates cutting from the background to the foreground
if (activityStartCount == 1)
{
if (mOnAppStatusListener != null)
{
mOnAppStatusListener.onFront();
}
}
}
public void OnActivityStopped(Activity activity)
{
activityStartCount--;
//A value from 1 to 0 indicates cutting from the foreground to the background
if (activityStartCount == 0)
{
//from foreground to background
if (mOnAppStatusListener != null)
{
mOnAppStatusListener.onBack();
}
}
}
}
}
затем настройте приложение и зарегистрируйте слушателя:
[Application]
public class MyApplication : Application,AppFrontBackHelper.OnAppStatusListener
{
protected MyApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}
public override void OnCreate()
{
base.OnCreate();
AppFrontBackHelper appFrontBackHelper = new AppFrontBackHelper();
appFrontBackHelper.register(this, this);
}
public void onBack()
{
Toast.MakeText(this, "from front to back", ToastLength.Short).Show();
}
public void onFront()
{
Toast.MakeText(this, "from back to front", ToastLength.Short).Show();
}
}