2017-02-22 36 views
3

Я пытаюсь добавить уведомления толчка в мое приложение следующим https://docs.microsoft.com/en-us/azure/notification-hubs/xamarin-notification-hubs-push-notifications-android-gcmXamarin.Android толчок уведомление ломает приложение, когда приложение не работает

После этого следующий шаг за шагом учебник, чтобы настроить Push уведомление о Xamarin.Android, устройства Android получают push-уведомления, когда приложение работает или работает в фоновом режиме. Но если я закрыть приложение, так что он больше не работает, а затем отправить уведомление толчок, устройство показывает это сообщение об ошибке:

«К сожалению, [App Name] перестал»

The image

Здесь идет моя реализация кода ..

[Service] // Must use the service tag 
public class PushHandlerService : GcmServiceBase 
{ 
    public static string RegistrationID { get; private set; } 
    private NotificationHub Hub { get; set; } 

    public PushHandlerService() : base(Constants.SenderID) 
    { 
     Log.Info(MyBroadcastReceiver.TAG, "PushHandlerService() constructor"); 
    } 

    protected override void OnRegistered(Context context, string registrationId) 
    { 
     Log.Verbose(MyBroadcastReceiver.TAG, "GCM Registered: " + registrationId); 
     RegistrationID = registrationId; 

     /*createNotification("PushHandlerService-GCM Registered...", 
          "The device has been Registered!");*/ 

     Hub = new NotificationHub(Constants.NotificationHubName, Constants.ListenConnectionString, 
            context); 
     try 
     { 
      Hub.UnregisterAll(registrationId); 
     } 
     catch (Exception ex) 
     { 
      Log.Error(MyBroadcastReceiver.TAG, ex.Message); 
     } 

     //var tags = new List<string>() { "falcons" }; // create tags if you want 
     var tags = new List<string>() { }; 

     try 
     { 
      var hubRegistration = Hub.Register(registrationId, tags.ToArray()); 
     } 
     catch (Exception ex) 
     { 
      Log.Error(MyBroadcastReceiver.TAG, ex.Message); 
     } 
    } 
    protected override void OnMessage(Context context, Intent intent) 
    { 
     Log.Info(MyBroadcastReceiver.TAG, "GCM Message Received!"); 

     var msg = new System.Text.StringBuilder(); 

     if (intent != null && intent.Extras != null) 
     { 
      foreach (var key in intent.Extras.KeySet()) 
       msg.AppendLine(key + "=" + intent.Extras.Get(key).ToString()); 
     } 

     string messageText = intent.Extras.GetString("message"); 
     if (!string.IsNullOrEmpty(messageText)) 
     { 
      createNotification("New hub message!", messageText); 
     } 
     else 
     { 
      createNotification("Unknown message details", msg.ToString()); 
     } 
    } 
    void createNotification(string title, string desc) 
    { 
     //Create notification 
     var notificationManager = GetSystemService(Context.NotificationService) as NotificationManager; 

     //Create an intent to show UI 
     var uiIntent = new Intent(this, typeof(MainActivity)); 

     //Create the notification 
     var notification = new Notification(Android.Resource.Drawable.SymActionEmail, title); 

     //Auto-cancel will remove the notification once the user touches it 
     notification.Flags = NotificationFlags.AutoCancel; 

     //Set the notification info 
     //we use the pending intent, passing our ui intent over, which will get called 
     //when the notification is tapped. 
     notification.SetLatestEventInfo(this, title, desc, PendingIntent.GetActivity(this, 0, uiIntent, 0)); 

     //Show the notification 
     notificationManager.Notify(1, notification); 
     dialogNotify(title, desc); 
    } 

    protected void dialogNotify(string title, string message) 
    { 
     MainActivity.instance.RunOnUiThread(() => { 
      AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.instance); 
      AlertDialog alert = dlg.Create(); 
      alert.SetTitle(title); 
      alert.SetButton("Ok", delegate { 
       alert.Dismiss(); 
      }); 
      alert.SetMessage(message); 
      alert.Show(); 
     }); 
    } 

    protected override void OnUnRegistered(Context context, string registrationId) 
    { 
     Log.Verbose(MyBroadcastReceiver.TAG, "GCM Unregistered: " + registrationId); 

     createNotification("GCM Unregistered...", "The device has been unregistered!"); 
    } 

    protected override bool OnRecoverableError(Context context, string errorId) 
    { 
     Log.Warn(MyBroadcastReceiver.TAG, "Recoverable Error: " + errorId); 

     return base.OnRecoverableError(context, errorId); 
    } 

    protected override void OnError(Context context, string errorId) 
    { 
     Log.Error(MyBroadcastReceiver.TAG, "GCM Error: " + errorId); 
    } 
} 

} `

+0

вы пробовали на реальном устройстве? Иногда это из-за эмулятора. – Smit

+0

Yaa Я пробовал, но результат такой же –

+0

Возможное дублирование http://stackoverflow.com/questions/38718719/android-application-get-crashed-when-application-is-not-running-or-not-in- system – Smit

ответ

3

Наконец я Исправлена ​​проблема путем асинхр метода OnMessage

Здесь код является:

protected override async void OnMessage(Context context, Intent intent) 
    { 
    Log.Info(MyBroadcastReceiver.TAG, "GCM Message Received!"); 
     await Task.Delay(1000); 

     var msg = new System.Text.StringBuilder(); 
     if (intent != null && intent.Extras != null) 
     { 
      foreach (var key in intent.Extras.KeySet()) 
       msg.AppendLine(key + "=" + intent.Extras.Get(key).ToString()); 
     } 

     string messageText = intent.Extras.GetString("message"); 
     if (!string.IsNullOrEmpty(messageText)) 
     { 
      createNotification("New hub message!", messageText); 
     } 
     else 
     { 
      createNotification("Unknown message details", msg.ToString()); 
     } 
    }` 
+0

Спасибо !!!! Ты сделал мой день !!! +! –

+0

welcome :) @ G.Mith –

+0

Привет, Я пытаюсь получить push-уведомления, когда приложение не работает на фоне, но не удача. У вас есть уведомления для этого сценария. – Deepak