首页 > 解决方案 > Android Xamarin 检测从任务管理器开始

问题描述

我目前正在开发一个 android xamarin 应用程序(android 6 及更高版本),但我遇到了问题。

我们的客户希望通过密码键盘保护应用程序。每当应用程序启动时,用户必须输入一个四位数的密码。

我们为 pinpad 创建了一个活动。这工作得很好,但问题如下:

如果应用程序被完全杀死(例如被任务管理器) ->冷启动,则密码键盘只会打开。

例如,如果应用程序在后台并由任务管理器重新打开(用户按下主页按钮,然后想再次启动应用程序)->热启动,我如何实现密码键盘打开。

我试图通过 OnResume()、OnStart() 来做到这一点。但不幸的是,每次打开另一个活动(例如,打开列表项的详细视图)时,它们都会触发。

标签: c#androidxamarin

解决方案


使用IActivityLifecycleCallbacks来监听状态。

Application注册ActivityLifecycleCallbacks,这样,当应用生命周期中的每个活动发生时,应用程序都可以监听。活动的数量public void onActivityStarted(activity activity)和数量public void onActivityStopped(activity activity)可用于确定应用程序是否在前台。因为当app在前台的时候,肯定是一个activity开启了onActivityStarted而不是onActivityStopped,所以app中打开的activity数量统计一定是1。当app切换到后台时,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)
            {
                //从前台切到后台
                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();
    }


}

你可以在onFront()回调中做一些事情。


推荐阅读