Xamarin Нативный эквивалент приложения Xamarin.Forms OnSleep и OnResume - PullRequest
0 голосов
/ 02 марта 2020

Я работаю с приложением Xamarin Native и хотел бы выполнить некоторые логики c, когда приложение сфокусировано / не сфокусировано в android - аналогично Xamarin.Forms Application.OnSleep() и Application.OnResume() (не путать с Activity.OnResume и Activity.OnPause)

Просто интересно, какое решение использовали другие для решения этого сценария (помимо перехода на Xamarin.Forms).

Ответы [ 2 ]

1 голос
/ 03 марта 2020

когда приложение сфокусировано / не сфокусировано в android

Вы имеете в виду, что хотите прослушивать приложение, запущенное на переднем или заднем плане?

Если да, вы можете использовать IActivityLifecycleCallbacks для прослушивания статуса.

Application регистрация ActivityLifecycleCallbacks, например, когда происходит каждое действие в жизненном цикле приложения, приложение может прослушивать приложение. Число public void onActivityStarted(activity activity) и public void onActivityStopped(activity activity) действия можно использовать, чтобы определить, находится ли приложение на переднем плане. Поскольку, когда приложение находится на переднем плане, действие должно быть запущено onActivityStarted, но не onActivityStopped, поэтому статистика количества действий, открытых в приложении, должна быть 1. Когда приложение переключается в фоновый режим, активностьStartCount будет 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]
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();
    }


}
0 голосов
/ 06 марта 2020
[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.

...