【问题标题】:Xamarin Native equivalent of Xamarin.Forms App OnSleep and OnResumeXamarin 本机等效于 Xamarin.Forms App OnSleep 和 OnResume
【发布时间】:2020-06-14 21:39:07
【问题描述】:

我正在使用 Xamarin Native 应用程序,并且希望在应用程序在 android 中聚焦/不聚焦时执行一些逻辑 - 类似于 Xamarin.Forms Application.OnSleep()Application.OnResume()(不要混淆与Activity.OnResumeActivity.OnPause)

只是想知道其他人使用什么解决方案来解决这种情况(除了迁移到 Xamarin.Forms)。

【问题讨论】:

标签: xamarin xamarin.android application-lifecycle xamarin-native


【解决方案1】:

当应用程序在 android 中聚焦/失焦时

你的意思是你想监听应用在前台还是后台运行?

如果是,您可以使用 IActivityLifecycleCallbacks 来监听状态。

Application注册ActivityLifecycleCallbacks,这样,当app生命周期中的每个activity发生时,Application都可以监听。一个activity的public void onActivityStarted(activity activity)public void onActivityStopped(activity activity)的数量可以用来判断app是否在前台。因为当app在前台的时候,肯定有一个activity开启了onActivityStarted而不是onActivityStopped,所以app中开启的activity数量统计一定是1。当应用切换到后台时,activityStartCount 将为0

所以写一个 Helper 类:

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 并注册监听器:

[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();
    }


}

【讨论】:

    【解决方案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 包中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多