Xamarin Android架构组件:不获取生命周期事件的回调

Xamarin Android架构组件:不获取生命周期事件的回调,xamarin,xamarin.android,android-architecture-components,Xamarin,Xamarin.android,Android Architecture Components,我试图使用架构组件包来检测应用程序何时进入后台或前台状态。问题是没有调用回调。在下面的示例代码中,未调用applicationforeground和applicationbackground上的方法: namespace POC.Droid { [Application] public class MyApp : Application, ILifecycleObserver { static readonly string TAG = "MyApp";

我试图使用架构组件包来检测应用程序何时进入后台或前台状态。问题是没有调用回调。在下面的示例代码中,未调用applicationforeground和applicationbackground上的方法

namespace POC.Droid
{
    [Application]
    public class MyApp : Application, ILifecycleObserver
    {
        static readonly string TAG = "MyApp";

        public MyApp(IntPtr handle, Android.Runtime.JniHandleOwnership ownerShip) : base(handle, ownerShip)
        {
        }

        public override void OnCreate()
        {
            base.OnCreate();
            ProcessLifecycleOwner.Get().Lifecycle.AddObserver(this);
        }

        [Lifecycle.Event.OnStop]
        public void onAppBackgrounded()
        {
            Log.Debug(TAG, "App entered background state.");
        }

        [Lifecycle.Event.OnStart]
        public void onAppForegrounded()
        {
            Log.Debug(TAG, "App entered foreground state.");
        }
    }
}

我的Xamarin版本是8.2.0.16(Visual Studio社区),Xamarin.Android.Arch.Lifecycle.Extensions版本是1.0.0。我正在使用牛轧糖装置(7.0)进行测试。

如果您在这里的活动中需要它,活动:

protected override void OnStart(){
            base.OnStart();
            Log.Debug(logTag, "MainActivity.OnStart() called, the activitiy is active");
        }

        protected override void OnPause()
        {
            base.OnPause();
            Log.Debug(logTag, "MainActivity.OnPause() called, the activity in background");
        }

        protected override void OnStop()
        {
            base.OnStop();
            Log.Debug(logTag, "MainActivity.OnStop() called, the activity is in background because of other activiy or app");
        }

        protected override void OnResume()
        {
            base.OnResume();
            Log.Debug(logTag, "MainActivity.OnResume() called, the activity stated");
        }

        protected override void OnRestart()
        {
            base.OnRestart();
            Log.Debug(logTag, "MainActivity.OnRestart() called,  the activity is startet");
        }

        protected override void OnDestroy()
        {
            base.OnDestroy();
            Log.Debug(logTag, "MainActivity.OnDestroy() called, activity is destroyed");
        }
对于Xamarin表单,您可以在app.xaml.cs中找到应用程序所需的事件

protected override void OnStart ( ) {
            // Handle when your app starts
        }

        protected override void OnSleep ( ) {
            // Handle when your app sleeps
        }

        protected override void OnResume ( ) {
            // Handle when your app resumes
        }

我过去使用过这个包,但是我更喜欢James Montemagno的实现,它可以作为一个名为“Plugin.CurrentActivity”的nuget包找到。它创建一个应用程序类并为您实现ILifecycle事件

根据描述:

为开发Xamarin插件时访问应用程序的当前活动提供了一个简单的解决方案。 这将为Android应用程序中的开发人员建立一个基本的“应用程序”类,并使用样板代码启动它们。 可与Android API 14一起使用+


*我假设您没有使用Xamarin.Forms。这对于原生的Xamarin Android项目非常有效



TL;DR请使用
[Export]

以下是更详细的说明:

通常,要调用lifecycle observer的方法,请确保存在相关的包。以下是my packages.config的一部分:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Xamarin.Android.Arch.Core.Common" version="26.1.0" targetFramework="monoandroid81" />
  <package id="Xamarin.Android.Arch.Core.Runtime" version="1.0.0.1" targetFramework="monoandroid81" />
  <package id="Xamarin.Android.Arch.Lifecycle.Common" version="26.1.0" targetFramework="monoandroid81" />
  <package id="Xamarin.Android.Arch.Lifecycle.Extensions" version="1.0.0.1" targetFramework="monoandroid81" />
  <package id="Xamarin.Android.Arch.Lifecycle.Runtime" version="1.0.3.1" targetFramework="monoandroid81" />
如您所见,您可以使用例如
[lifecycle.Event.OnStop]
注释生命周期方法。另外,请注意,您需要使用
[Export]
。请确保项目中引用了Mono.Android.Export,如下图所示

如果您想让活动具有生命周期观察员,我建议扩展
AppCompatActivity
,因为它是生命周期所有者:

using Android.App;
using Android.Arch.Lifecycle;
using Android.OS;
using Android.Support.V7.App;
using Android.Util;
using Java.Interop;

namespace Stopwatch_AAC
{

    [Activity(Label = "Minimal", Exported = true, MainLauncher = true)]
    public class Minimal : AppCompatActivity, ILifecycleObserver
    {
        const string TAG = "Stopwatch_AAC";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Lifecycle.AddObserver(this);
            Log.Debug(TAG, Lifecycle.CurrentState.ToString());
        }

        [Lifecycle.Event.OnAny]
        [Export]
        public void Hello()
        {
            Log.Debug(TAG, Lifecycle.CurrentState.ToString());
        }
    }
}

该插件使用ActivityLifecycleCallbacks为每个活动调用回调。我希望在应用程序级别进行回调。我找到的一个替代方法是实现
IGenericLifecycleObserver
接口,并在
OnStateChanged
方法中捕获状态更改事件。这是否仍然适用于您?我尝试了相同的方法,但它正在调用该方法。
[Export]
标记方法对您不起作用?在尝试了一些事情后,我意识到我在活动中缺少Exported=true。现在开始工作了!干杯这对我很有效@adienthu您应该将此标记为答案。我确保将
Mono.Android.Export
添加到我的项目参考中,但仍然
[Export]
希望解析为Java.Interop。。。我可能做错了什么?只是为了确定。。。您添加了对Xamarin Android项目的引用,而不是pcl项目,对吗?它不适用于发布配置。请检查是否收到有关dll的任何日志输出,或者是否未调用该方法?在调试模式下它能工作吗?
using Android.App;
using Android.Arch.Lifecycle;
using Android.OS;
using Android.Support.V7.App;
using Android.Util;
using Java.Interop;

namespace Stopwatch_AAC
{

    [Activity(Label = "Minimal", Exported = true, MainLauncher = true)]
    public class Minimal : AppCompatActivity, ILifecycleObserver
    {
        const string TAG = "Stopwatch_AAC";

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Lifecycle.AddObserver(this);
            Log.Debug(TAG, Lifecycle.CurrentState.ToString());
        }

        [Lifecycle.Event.OnAny]
        [Export]
        public void Hello()
        {
            Log.Debug(TAG, Lifecycle.CurrentState.ToString());
        }
    }
}