Windows Phone 8.1应用程序 - 自动注销(检测应用程序是否正在运行)

时间:2015-10-21 16:42:16

标签: windows mvvm windows-phone-8.1 mvvm-light win-universal-app

我正在构建一个Windows 8.1 Universal应用程序,具体而言,我正在开发Windows Phone端。该应用程序是使用MVVM模式构建的RT应用程序,我正在使用MVVM Light。

该应用程序适用于金融机构并公开付款信息。因此,如果在2分钟后没有活动,则需要将用户从应用程序中注销。

我已经高低搜索了解决这个问题的方法。唯一真正有效的是在视图中设置手势,并使用DispatchTimer,如果没有检测到手势,它会在2分钟后过期并重定向到应用程序锁定屏幕(不是内置的Windows屏幕)。手势重置计时器。以下是手势设置的一些示例代码:

public MainPage()
    {
        this.InitializeComponent();                      

        //Register the gestures, for the app timeout
        this.PointerPressed += MainPage_PointerPressed;
        this.PointerMoved += MainPage_PointerMoved;
        this.PointerReleased += MainPage_PointerReleased;
        gr.CrossSliding += Gr_CrossSliding;
        gr.Dragging += Gr_Dragging;
        gr.Holding += Gr_Holding;
        gr.ManipulationCompleted += Gr_ManipulationCompleted;
        gr.ManipulationInertiaStarting += Gr_ManipulationInertiaStarting;
        gr.ManipulationStarted += Gr_ManipulationStarted;
        gr.ManipulationUpdated += Gr_ManipulationUpdated;
        gr.RightTapped += Gr_RightTapped;
        gr.Tapped += Gr_Tapped;
        gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationTranslateY |
        Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia |
        Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap;

        InitializeTimer();
    }  

有一些方法可以在页面上接收手势输入,如下所示:

private void Gr_Tapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.TappedEventArgs args)
    {
        ResetTimer();
    }

这是我的计时器代码:

private DispatcherTimer _timer2 { get; set; }
    int ticks = 0;

    private void InitializeTimer()
    {
        _timer2 = new DispatcherTimer();
        _timer2.Tick += timer2_Tick;
        _timer2.Interval = new TimeSpan(00, 0, 1);
        bool enabled = _timer2.IsEnabled;
        _timer2.Start();
    }

    void timer2_Tick(object sender, object e)
    {
        ticks++;            

        if (ticks >= 120)
        {
            Timeout();
        }
    }

    private void Timeout()
    {
        _timer2.Stop();
        _timer2 = null;

        Frame.Navigate(typeof(LockView));
    }

    private void ResetTimer()
    {
        _timer2.Stop();
        _timer2.Start();

        ticks = 0;
    }

这个解决方案远非完美。如果我找不到更好的产品,我将不得不使用它,但它有4个主要问题;

  1. 它打破了MVVM模式。所有这些代码都必须放在View后面的代码中。我有7个视图,可以在用户登录后访问,因此会有很多重复次序
  2. 它不会捕获所有手势。例如,在向上和向下滚动一个装满项目的列表框时似乎忽略了
  3. 我必须从视图中可能被视为手势的任何地方调用ResetTimer()方法或_timer2.Stop()(即使在离开视图之前)
  4. 这只是一个混乱和尴尬的解决方案
  5. 有谁知道更好的方法来实现这一目标?当然,这是一个更优雅的解决方案,可能是更高级别的东西,而不是试图抓住每个按钮和按钮的最后按钮。

    此外,如果应用程序可以检测它是在前台还是后台运行,并且如果用户导航离开应用程序然后稍后再返回到锁定屏幕,则会自动导航到锁定屏幕。

    提前感谢任何建议......

0 个答案:

没有答案