c# - Android Xamarin 检测从任务管理器开始
问题描述
我目前正在开发一个 android xamarin 应用程序(android 6 及更高版本),但我遇到了问题。
我们的客户希望通过密码键盘保护应用程序。每当应用程序启动时,用户必须输入一个四位数的密码。
我们为 pinpad 创建了一个活动。这工作得很好,但问题如下:
如果应用程序被完全杀死(例如被任务管理器) ->冷启动,则密码键盘只会打开。
例如,如果应用程序在后台并由任务管理器重新打开(用户按下主页按钮,然后想再次启动应用程序)->热启动,我如何实现密码键盘打开。
我试图通过 OnResume()、OnStart() 来做到这一点。但不幸的是,每次打开另一个活动(例如,打开列表项的详细视图)时,它们都会触发。
解决方案
使用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()
回调中做一些事情。
推荐阅读
- google-photos - 从相册中选择一些照片并创建一个 url 以使用 Google Photo API 共享它们
- flutter - 我怎样才能得到2次之间的差异?
- debian - 如何让 debian 看到非免费固件文件?
- artificial-intelligence - 如何从 AIML 中的特定映射值中获取键值?
- python - 低级鼠标位置
- visual-studio-code - 如何在 Visual Studio 代码中关闭“包含强调的项目”?
- video - Safari 不想自动播放视频。如何解决这个问题?
- regex - 如何将字符串正则表达式转换为列表?
- python - 如何将两个折线图与 y 轴的(数字/百分比)和 x 轴的日期组合并使用 openpyxl 设置缩放
- javascript - 尝试将正弦波音频另存为 .wav 文件时出现错误