Xamarin的本地等效Xamarin.Forms应用程序OnSleep和OnResume
我正在使用Xamarin本机应用程序,并且希望在android中应用程序处于焦点/不焦点时执行一些逻辑-类似于Xamarin.FormsXamarin的本地等效Xamarin.Forms应用程序OnSleep和OnResume,xamarin,xamarin.android,application-lifecycle,xamarin-native,Xamarin,Xamarin.android,Application Lifecycle,Xamarin Native,我正在使用Xamarin本机应用程序,并且希望在android中应用程序处于焦点/不焦点时执行一些逻辑-类似于Xamarin.Formsapplication.OnSleep(),和application.OnResume()(不要与Activity.OnResume和Activity.OnPause)混淆) 只是想知道其他人使用了什么解决方案来解决这个场景(除了迁移到Xamarin.Forms) 当应用程序在android中聚焦/不聚焦时 您的意思是要侦听应用程序在前台还是后台运行 如果是,您
application.OnSleep()
,和application.OnResume()
(不要与Activity.OnResume
和Activity.OnPause
)混淆)
只是想知道其他人使用了什么解决方案来解决这个场景(除了迁移到Xamarin.Forms)
当应用程序在android中聚焦/不聚焦时
您的意思是要侦听应用程序在前台还是后台运行
如果是,您可以使用IActivityLifecycleCallbacks来监听状态
应用程序
注册ActivityLifecycleCallbacks
,这样,当应用程序生命周期中的每个活动发生时,应用程序都可以监听。活动的public void on activitystarted(活动活动)
和public void on activitystopped(活动活动)
的数量可用于确定应用程序是否位于前台。因为当应用程序位于前台时,活动必须在ActivityStarted上启动,而不是在ActivityStopped上启动,因此应用程序中打开的活动数量的统计信息必须为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();
}
}
到目前为止,它似乎按照预期工作。ProcessLifecycleOwner位于
Xamarin.Android.Arch.Lifecycle.Extensions
nuget软件包中。MainActivity没有onStart()、onResume()和onPause()方法吗?我刚刚理解了你的意思,你想要应用程序级别的OnSleep/onResume,我建议你使用LifecycleObserver。看看这个:它能工作吗?@LeoZhu MSFT感谢你的回复。我也发布了一个我今天早上找到的答案。我必须进一步测试它,但它看起来很有希望。
[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);
}