diff --git a/com.unity.mobile.notifications/CHANGELOG.md b/com.unity.mobile.notifications/CHANGELOG.md index 56b1f7d9..09d93fe0 100644 --- a/com.unity.mobile.notifications/CHANGELOG.md +++ b/com.unity.mobile.notifications/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this package will be documented in this file. - [iOS] [[1259811](https://issuetracker.unity3d.com/product/unity/issues/guid/1259811)] Fixed UNITY_USES_REMOTE_NOTIFICATIONS being falsely set to 1 when Mobile Notifications isn't used. - [Android] [[1271866](https://issuetracker.unity3d.com/product/unity/issues/guid/1271866)] Fixed AndroidReceivedNotificationMainThreadDispatcher allocating a new list on every frame. - [Editor] [[1254618](https://issuetracker.unity3d.com/product/unity/issues/guid/1254618)] Fixed "SerializedObject target has been destroyed" errors when navigating Mobile Notifications settings. +- [Android] [[1172850](https://issuetracker.unity3d.com/product/unity/issues/guid/1172850)] Fix Android crash when many notifications are scheduled at once. ## [1.3.0] - 2020-06-02 diff --git a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs index f8d1809b..dec965e5 100644 --- a/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs +++ b/com.unity.mobile.notifications/Runtime/Android/AndroidNotificationCenter.cs @@ -43,7 +43,11 @@ public class AndroidNotificationCenter /// public static event NotificationReceivedCallback OnNotificationReceived = delegate {}; + private static AndroidJavaClass s_NotificationManagerClass; private static AndroidJavaObject s_NotificationManager; + private static AndroidJavaObject s_NotificationManagerContext; + private static AndroidJavaClass s_UnityPlayer; + private static AndroidJavaObject s_CurrentActivity; private static bool s_Initialized; public static bool Initialize() @@ -60,15 +64,19 @@ public static bool Initialize() #if UNITY_EDITOR || !UNITY_ANDROID s_NotificationManager = null; s_Initialized = false; + s_NotificationManagerClass = null; + s_NotificationManagerContext = null; + s_UnityPlayer = null; + s_CurrentActivity = null; #elif UNITY_ANDROID - AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity"); - AndroidJavaObject context = activity.Call("getApplicationContext"); + s_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); + s_CurrentActivity = s_UnityPlayer.GetStatic("currentActivity"); + var context = s_CurrentActivity.Call("getApplicationContext"); - AndroidJavaClass managerClass = new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); - - s_NotificationManager = managerClass.CallStatic("getNotificationManagerImpl", context, activity); + s_NotificationManagerClass = new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); + s_NotificationManager = s_NotificationManagerClass.CallStatic("getNotificationManagerImpl", context, s_CurrentActivity); s_NotificationManager.Call("setNotificationCallback", new NotificationCallback()); + s_NotificationManagerContext = s_NotificationManager.Get("mContext"); s_Initialized = true; #endif @@ -295,11 +303,7 @@ public static AndroidNotificationIntentData GetLastNotificationIntent() if (!Initialize()) return null; - AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); - AndroidJavaObject currentActivity = unityPlayer.GetStatic("currentActivity"); - - AndroidJavaObject intent = currentActivity.Call("getIntent"); - + var intent = s_CurrentActivity.Call("getIntent"); return ParseNotificationIntentData(intent); } @@ -311,11 +315,7 @@ internal static void SendNotification(int id, AndroidNotification notification, Debug.LogError("Failed to schedule notification, it did not contain a valid FireTime"); } - AndroidJavaClass managerClass = - new AndroidJavaClass("com.unity.androidnotifications.UnityNotificationManager"); - AndroidJavaObject context = s_NotificationManager.Get("mContext"); - - AndroidJavaObject notificationIntent = new AndroidJavaObject("android.content.Intent", context, managerClass); + var notificationIntent = new AndroidJavaObject("android.content.Intent", s_NotificationManagerContext, s_NotificationManagerClass); notificationIntent.Call("putExtra", "id", id); notificationIntent.Call("putExtra", "channelID", channelId);