1515#endif
1616
1717using System ;
18+ using JetBrains . Annotations ;
1819using Sentry . Extensibility ;
1920#if UNITY_2020_3_OR_NEWER
2021using System . Buffers ;
@@ -55,13 +56,14 @@ public static class SentryInitialization
5556#endif
5657 public static void Init ( )
5758 {
58- RegisterAndroidCallbacks ( ) ;
59-
6059 var unityInfo = new SentryUnityInfo ( ) ;
6160 // Loading the options invokes the ScriptableOption`Configure` callback. Users can disable the SDK via code.
6261 var options = ScriptableSentryUnityOptions . LoadSentryUnityOptions ( unityInfo ) ;
6362 if ( options != null && options . ShouldInitializeSdk ( ) )
6463 {
64+ // Register LifeCycle Callbacks so the SDK is aware of the app losing focus during startup
65+ RegisterAndroidCallbacks ( options . DiagnosticLogger ) ;
66+
6567 // Certain integrations require access to preprocessor directives so we provide them as `.cs` and
6668 // compile them with the game instead of precompiling them with the rest of the SDK.
6769 // i.e. SceneManagerAPI requires UNITY_2020_3_OR_NEWER
@@ -83,74 +85,54 @@ public static void Init()
8385 }
8486 }
8587
86- private static void RegisterAndroidCallbacks ( )
88+ private static void RegisterAndroidCallbacks ( [ CanBeNull ] IDiagnosticLogger logger )
8789 {
8890#if UNITY_ANDROID && ! UNITY_EDITOR
91+ logger ? . LogError ( "Registering Android LifeCycleCallbacks." ) ;
92+
8993 try
9094 {
91- using ( var unityPlayer = new AndroidJavaClass ( "com.unity3d.player.UnityPlayer" ) )
92- using ( var activity = unityPlayer . GetStatic < AndroidJavaObject > ( "currentActivity" ) )
93- using ( var application = activity . Call < AndroidJavaObject > ( "getApplication" ) )
94- {
95- AndroidJavaProxy lifecycleCallbacks = new AndroidLifecycleCallbacks ( ) ;
96-
97- // Properly register the callbacks with the application
98- application . Call ( "registerActivityLifecycleCallbacks" , lifecycleCallbacks ) ;
95+ using var unityPlayer = new AndroidJavaClass ( "com.unity3d.player.UnityPlayer" ) ;
96+ using var activity = unityPlayer . GetStatic < AndroidJavaObject > ( "currentActivity" ) ;
97+ using var application = activity . Call < AndroidJavaObject > ( "getApplication" ) ;
98+ AndroidJavaProxy lifecycleCallbacks = new AndroidLifecycleCallbacks ( logger ) ;
9999
100- Debug . Log ( "Android lifecycle callbacks registered successfully" ) ;
101- }
100+ application . Call ( "registerActivityLifecycleCallbacks" , lifecycleCallbacks ) ;
102101 }
103102 catch ( Exception ex )
104103 {
105- Debug . LogError ( $ "Error setting up Android lifecycle callbacks: { ex } ") ;
104+ logger ? . LogError ( "Failed to register Android LifeCycleCallbacks. ") ;
106105 }
107106#endif
108107 }
109108
110109 private class AndroidLifecycleCallbacks : AndroidJavaProxy
111110 {
112- public AndroidLifecycleCallbacks ( ) : base ( "android.app.Application$ActivityLifecycleCallbacks" ) { }
111+ [ CanBeNull ] private IDiagnosticLogger _logger ;
113112
114- // Called when the activity is paused - app going to background
115- public void onActivityPaused ( AndroidJavaObject activity )
116- {
117- Debug . Log ( "Android: Application moved to background (onActivityPaused)" ) ;
118- // You can add your background transition handling here
119- }
120-
121- // Called when the activity is resumed - app coming to foreground
122- public void onActivityResumed ( AndroidJavaObject activity )
113+ public AndroidLifecycleCallbacks ( [ CanBeNull ] IDiagnosticLogger logger ) : base (
114+ "android.app.Application$ActivityLifecycleCallbacks" )
123115 {
124- Debug . Log ( "Android: Application moved to foreground (onActivityResumed)" ) ;
125- // You can add your foreground transition handling here
116+ _logger = logger ;
126117 }
127118
128- // The following methods are required to implement the interface
129- // but may not be needed for your background detection
130- public void onActivityCreated ( AndroidJavaObject activity , AndroidJavaObject savedInstanceState )
131- {
132- Debug . Log ( "Android: Activity created" ) ;
133- }
134-
135- public void onActivityStarted ( AndroidJavaObject activity )
136- {
137- Debug . Log ( "Android: Activity started" ) ;
138- }
139-
140- public void onActivityStopped ( AndroidJavaObject activity )
119+ // App going to background
120+ public void onActivityPaused ( AndroidJavaObject activity )
141121 {
142- Debug . Log ( "Android: Activity stopped ") ;
122+ _logger ? . LogInfo ( "Application move to background. Pausing session. ") ;
143123 }
144124
145- public void onActivitySaveInstanceState ( AndroidJavaObject activity , AndroidJavaObject outState )
125+ // App coming to foreground
126+ public void onActivityResumed ( AndroidJavaObject activity )
146127 {
147- // No action needed
128+ _logger ? . LogInfo ( "Application move to foreground. Resuming session." ) ;
148129 }
149130
150- public void onActivityDestroyed ( AndroidJavaObject activity )
151- {
152- Debug . Log ( "Android: Activity destroyed" ) ;
153- }
131+ public void onActivityCreated ( AndroidJavaObject activity , AndroidJavaObject savedInstanceState ) { }
132+ public void onActivityStarted ( AndroidJavaObject activity ) { }
133+ public void onActivityStopped ( AndroidJavaObject activity ) { }
134+ public void onActivitySaveInstanceState ( AndroidJavaObject activity , AndroidJavaObject outState ) { }
135+ public void onActivityDestroyed ( AndroidJavaObject activity ) { }
154136 }
155137
156138 private static void SetupNativeSdk ( SentryUnityOptions options , SentryUnityInfo unityInfo )
0 commit comments