【问题标题】:How to start Intent from OneSignal HandleNotificationOpened in Visual Studio with Xamarin如何从 OneSignal HandleNotification 启动 Intent 在 Visual Studio 中使用 Xamarin 打开
【发布时间】:2018-01-16 09:33:43
【问题描述】:

我尝试在 Android 应用程序中使用 OneSignal,它是使用 VS 和 Xamarin(不是 Xamarin Forms)创建的。它工作正常,但我无法实现某些功能。应用程序可以获得 3 种不同类型的推送通知。当应用程序获得第一种类型时,它仅更改全局变量。当应用程序获得 2-nd 和 3-rd 时,它需要启动特定的意图。在 iOS 应用程序中,我找到了解决方案,但在 Android 中,我发现解决方案仅适用于已关闭的应用程序,但不适用于后台应用程序。我无法从“HandleNotificationOpened”函数开始意图。任何人都可以帮我解决这个问题。 代码如下:

public class SplashActivity : Activity{
    static bool isNotify=false;
    static string messageAct = "";
    protected override void OnCreate(Bundle savedInstanceState)
    {

        OneSignal.Current.StartInit("mykey")
            .InFocusDisplaying(OSInFocusDisplayOption.None)
            .HandleNotificationOpened(HandleNotificationOpened)
            .EndInit();
        OneSignal.Current.IdsAvailable(IdsAvailable);
        base.OnCreate(savedInstanceState);
    }
    protected override void OnResume()
    {
        base.OnResume();
        Intent notificationIntent;
        if(isNotify){
            if(messageAct="1"){
                notificationIntent = new Intent(this, typeof(ProfileActivity));
            }
            if(messageAct="2"){
                notificationIntent = new Intent(this, typeof(NotificationsActivity));
            }
            else{
                notificationIntent = new Intent(this, typeof(MainActivity));
            }
        }
        else{
            notificationIntent = new Intent(this, typeof(MainActivity));
        }
        StartActivity(notificationIntent);
    }
    private static void HandleNotificationOpened(OSNotificationOpenedResult result)
    {
        OSNotificationPayload payload = result.notification.payload;
        Dictionary<string, object> additionalData = payload.additionalData;
        string message = payload.body;
        if (additionalData != null)
        {
            isNotify = true;
            if (additionalData.ContainsKey("act"))
            {
                messageAct = additionalData["act"].ToString();
            }
        }
    }
}

【问题讨论】:

    标签: android visual-studio xamarin xamarin.android onesignal


    【解决方案1】:

    看起来它需要为每个Activity添加OneSignal Init和HandleNotificationOpen。​​

    另一种解决方案,正如Joe Lv 建议的那样,创建 BaseActivity 类,扩展 Activity,在该类中添加 OneSignal Init 和 HandleNotificationOpen,并将其用于应用程序中的其他活动而不是 Activity。看起来像这样:

    public class BaseActivity : Activity{
            static bool isNotify=false;
            static string messageAct = "";
            protected override void OnCreate(Bundle savedInstanceState)
            {
                OneSignal.Current.StartInit("mykey")
                    .InFocusDisplaying(OSInFocusDisplayOption.None)
                    .HandleNotificationOpened(HandleNotificationOpened)
                    .EndInit();
                OneSignal.Current.IdsAvailable(IdsAvailable);
                base.OnCreate(savedInstanceState);
            }
            protected override void OnResume()
            {
                base.OnResume();
                Intent notificationIntent;
                if(isNotify){
                    if(messageAct="1"){
                        notificationIntent = new Intent(this, typeof(ProfileActivity));
                    }
                    if(messageAct="2"){
                        notificationIntent = new Intent(this, typeof(NotificationsActivity));
                    }
                    else{
                        notificationIntent = new Intent(this, typeof(MainActivity));
                    }
                }
                else{
                    notificationIntent = new Intent(this, typeof(MainActivity));
                }
                StartActivity(notificationIntent);
            }
            private static void HandleNotificationOpened(OSNotificationOpenedResult result)
            {
                OSNotificationPayload payload = result.notification.payload;
                Dictionary<string, object> additionalData = payload.additionalData;
                string message = payload.body;
                if (additionalData != null)
                {
                    isNotify = true;
                    if (additionalData.ContainsKey("act"))
                    {
                        messageAct = additionalData["act"].ToString();
                    }
                }
            }
        }
    
        public class ActivityOne : BaseActivity{
            // do ActivityOne stuff
        }
    
    
        public class ActivityTwo : BaseActivity{
            // do ActivityTwo stuff
        }
    

    【讨论】:

    • 那么,这是您问题的解决方案吗?
    • @JoeLv 好吧,它有效,所以是的。但我不确定这个解决方案是否是最优的。不幸的是,我没有时间找到更好的方法。
    • 为什么不创建一个BaseActivity,您只需在BaseActivity 中添加OneSignal Init 和HandleNotificationOpen,或者您可以尝试在您的Application 类中执行此操作。
    • @JoeLv 对不起,不明白,什么意思。什么 BaseActivity?
    • 您可以创建一个BaseActivity,它将被其他人Activity 扩展,在BaseActivity 中您可以执行将在每个Activity 中执行的操作。
    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多