Android 应用处于 "closed" 时未收到 PushNotification
Android not receiving PushNotification when App is "closed"
我正在使用 GCM 服务推送通知,当应用程序打开或处于后台时它工作正常,但当应用程序关闭时它会崩溃:
异常:
FATAL EXCEPTION: main Process: br.com.siagri.SiagriAutorize, PID:
15786 android.runtime.JavaProxyThrowable:
System.NotSupportedException: Could not activate JNI Handle 0xbeed8498
(key_handle 0xa7376b4) of Java type
'md5d8b390bb35897e87a51d1b4384dffa30/GcmService' as managed type
'SiagriAuth.Droid.Services.GcmService'. --->
System.InvalidOperationException: You MUST call Xamarin.Forms.Init();
prior to using it.
我已经关注了这个tutorial and taked a look at this sample
但我没有看到任何 about/diferent 通知在应用程序关闭时有效。
这是我接收和处理通知的方法:
private void CreateNotification(string title, string desc, string approvalCode)
{
try
{
//Create notification
var notificationManager = GetSystemService(NotificationService) as NotificationManager;
//Create an intent to show ui
var uiIntent = new Intent(this, typeof(MainActivity));
//Use Notification Builder
var builder = new NotificationCompat.Builder(this);
//Create the notification
//we use the pending intent, passing our ui intent over which will get called
//when the notification is tapped.
var notification = builder.SetContentIntent(PendingIntent.GetActivity(this, 0, uiIntent, 0))
.SetSmallIcon(Resource.Drawable.icon)
.SetTicker(title)
.SetContentTitle(title)
.SetContentText(desc)
.SetPriority((int)NotificationPriority.High)
.SetDefaults((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate)
//Set the notification sound
.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
//Auto cancel will remove the notification once the user touches it
.SetAutoCancel(true).Build();
//Show the notification
int uniqueIdentifier = 0;
for (int i = 0; i < approvalCode.Length; i++)
{
uniqueIdentifier += (int)approvalCode[i];
}
notificationManager?.Notify(uniqueIdentifier, notification);
}
catch (Exception e)
{
Debug.WriteLine(e);
App.LocalAlert("Erro", "Erro ao criar notificação.");
}
}
protected override void OnMessage(Context context, Intent intent)
{
try
{
if (intent != null && intent.Extras != null)
{
var messageText = intent.Extras.GetString("message");
var approvalCode = intent.Extras.GetString("ApprovalCode");
if (!string.IsNullOrEmpty(messageText) && !string.IsNullOrEmpty(approvalCode))
CreateNotification($"Solicitação - {approvalCode}", messageText, approvalCode);
}
}
catch (Exception e)
{
Debug.WriteLine(e);
App.LocalAlert("Erro", "Erro ao criar notificação.");
}
}
我正在使用这些程序集:
[assembly: Permission(Name = "myProject.permission.C2D_MESSAGE")]
[assembly: UsesPermission(Name = "myProject.permission.C2D_MESSAGE")]
[assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")]
[assembly: UsesPermission(Name = "android.permission.INTERNET")]
[assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]
[assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")]
还有这些 IntentFilter:
[BroadcastReceiver(Permission = Constants.PERMISSION_GCM_INTENTS)]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_MESSAGE }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
知道如何使它适用于封闭的应用程序吗?
Obs.:我已经 运行 应用程序处于发布模式。
我的错误是在 GcmService 的构造中,我在那里实例化了我的存储库,所以我试图访问数据库,我只是从构造函数中删除并放入我注册的方法,这就是我使用它的地方。
public GcmService() : base(PushHandlerBroadcastReceiver.SenderIds)
{
Log.Info(PushHandlerBroadcastReceiver.Tag, "PushHandlerService() constructor");
_permissaoRepository = new PermissaoRepository(App.SiagriAuthContext);
_loginRepository = new LoginRepository(App.SiagriAuthContext);
}
我改为:
public GcmService() : base(PushHandlerBroadcastReceiver.SenderIds)
{
Log.Info(PushHandlerBroadcastReceiver.Tag, "PushHandlerService() constructor");
}
所以当应用程序关闭时我无法访问我的数据库,这是很合理的。
我快速搜索了应用程序关闭时尝试使用数据库,但我没有找到,但是 here and here 有一些关于使用本地数据库的内容。
我正在使用 GCM 服务推送通知,当应用程序打开或处于后台时它工作正常,但当应用程序关闭时它会崩溃:
异常:
FATAL EXCEPTION: main Process: br.com.siagri.SiagriAutorize, PID: 15786 android.runtime.JavaProxyThrowable: System.NotSupportedException: Could not activate JNI Handle 0xbeed8498 (key_handle 0xa7376b4) of Java type 'md5d8b390bb35897e87a51d1b4384dffa30/GcmService' as managed type 'SiagriAuth.Droid.Services.GcmService'. ---> System.InvalidOperationException: You MUST call Xamarin.Forms.Init(); prior to using it.
我已经关注了这个tutorial and taked a look at this sample 但我没有看到任何 about/diferent 通知在应用程序关闭时有效。
这是我接收和处理通知的方法:
private void CreateNotification(string title, string desc, string approvalCode)
{
try
{
//Create notification
var notificationManager = GetSystemService(NotificationService) as NotificationManager;
//Create an intent to show ui
var uiIntent = new Intent(this, typeof(MainActivity));
//Use Notification Builder
var builder = new NotificationCompat.Builder(this);
//Create the notification
//we use the pending intent, passing our ui intent over which will get called
//when the notification is tapped.
var notification = builder.SetContentIntent(PendingIntent.GetActivity(this, 0, uiIntent, 0))
.SetSmallIcon(Resource.Drawable.icon)
.SetTicker(title)
.SetContentTitle(title)
.SetContentText(desc)
.SetPriority((int)NotificationPriority.High)
.SetDefaults((int)NotificationDefaults.Sound | (int)NotificationDefaults.Vibrate)
//Set the notification sound
.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
//Auto cancel will remove the notification once the user touches it
.SetAutoCancel(true).Build();
//Show the notification
int uniqueIdentifier = 0;
for (int i = 0; i < approvalCode.Length; i++)
{
uniqueIdentifier += (int)approvalCode[i];
}
notificationManager?.Notify(uniqueIdentifier, notification);
}
catch (Exception e)
{
Debug.WriteLine(e);
App.LocalAlert("Erro", "Erro ao criar notificação.");
}
}
protected override void OnMessage(Context context, Intent intent)
{
try
{
if (intent != null && intent.Extras != null)
{
var messageText = intent.Extras.GetString("message");
var approvalCode = intent.Extras.GetString("ApprovalCode");
if (!string.IsNullOrEmpty(messageText) && !string.IsNullOrEmpty(approvalCode))
CreateNotification($"Solicitação - {approvalCode}", messageText, approvalCode);
}
}
catch (Exception e)
{
Debug.WriteLine(e);
App.LocalAlert("Erro", "Erro ao criar notificação.");
}
}
我正在使用这些程序集:
[assembly: Permission(Name = "myProject.permission.C2D_MESSAGE")]
[assembly: UsesPermission(Name = "myProject.permission.C2D_MESSAGE")]
[assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")]
[assembly: UsesPermission(Name = "android.permission.INTERNET")]
[assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]
[assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")]
还有这些 IntentFilter:
[BroadcastReceiver(Permission = Constants.PERMISSION_GCM_INTENTS)]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_MESSAGE }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
[IntentFilter(new[] { Constants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new[] { "br.com.siagri.SiagriAutorize" })]
知道如何使它适用于封闭的应用程序吗?
Obs.:我已经 运行 应用程序处于发布模式。
我的错误是在 GcmService 的构造中,我在那里实例化了我的存储库,所以我试图访问数据库,我只是从构造函数中删除并放入我注册的方法,这就是我使用它的地方。
public GcmService() : base(PushHandlerBroadcastReceiver.SenderIds)
{
Log.Info(PushHandlerBroadcastReceiver.Tag, "PushHandlerService() constructor");
_permissaoRepository = new PermissaoRepository(App.SiagriAuthContext);
_loginRepository = new LoginRepository(App.SiagriAuthContext);
}
我改为:
public GcmService() : base(PushHandlerBroadcastReceiver.SenderIds)
{
Log.Info(PushHandlerBroadcastReceiver.Tag, "PushHandlerService() constructor");
}
所以当应用程序关闭时我无法访问我的数据库,这是很合理的。 我快速搜索了应用程序关闭时尝试使用数据库,但我没有找到,但是 here and here 有一些关于使用本地数据库的内容。