我目前正在开发一个android xamarin应用程序(Android 6及更高版本),但遇到了问题。
我们的客户希望通过密码键盘保护应用程序安全。每当启动应用程序时,用户都必须输入一个四位数的密码。
我们为密码键盘创建了一个活动。效果很好,但是问题如下:
如果应用被完全杀死(例如,被任务管理器关闭),便会打开密码键盘-> 冷启动。
例如,如果应用程序在后台并由任务管理器重新打开(用户按下主屏幕按钮,然后又想重新启动应用程序),我怎么能获得密码键盘打开的信息?> 热启动。
我已经尝试通过OnResume(),OnStart()来做到这一点。但不幸的是,每次打开另一个活动(例如,打开列表项的详细视图)时,它们都会触发。
答案 0 :(得分:1)
使用 IActivityLifecycleCallbacks 监听状态。
Application
注册ActivityLifecycleCallbacks
,例如,当应用程序生命周期中的每个活动都发生时,应用程序可以监听。活动的public void onActivityStarted(activity activity)
和public void onActivityStopped(activity activity)
的数量可用于确定应用程序是否在前台。因为当应用程序在前台运行时,活动必须已经启动onActivityStarted而不是onActivityStopped,所以在应用程序中打开的活动数量的统计信息必须为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)
{
//从前台切到后台
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()
回调中做些事情。