studio - xamarin android tutorial
Programar notificaciones usando el administrador de alarmas en formularios xamarin para Android (2)
1) Si alguien mata su aplicación, las alarmas registradas en su aplicación se cancelan.
2) Puede iniciar su servicio en segundo plano al Boot
el dispositivo para registrar sus alarmas, o ejecutar cualquier otro código que necesite para configurar sus notificaciones ...
- Agregue "android.intent.action.BOOT_COMPLETED" a su BroadcastReceiver:
[BroadcastReceiver]
[IntentFilter(new string[]{"android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)]
public class AlarmReceiver : BroadcastReceiver
- En su manifiesto, agregue el permiso de inicio completo:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
En el caso del ejemplo de precio de stock de Xamarin, si configura "RECEIVE_BOOT_COMPLETED", usted es "auto" reiniciar su servicio y su comenzará a recibir notificaciones al reiniciar su teléfono sin antes iniciar su aplicación:
[BroadcastReceiver]
[IntentFilter(new string[]{StockService.StocksUpdatedAction,Boo "android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)]
public class StockNotificationReceiver : BroadcastReceiver
3) Puede usar un Service
vs. un Service
SeviceIntent
y anular el StartCommandResult
para volver StartCommandResult
Con un servicio basado en Sticky, se reinicia si finaliza.
Constante para regresar de onStartCommand (Intención, int, int): si el proceso de este servicio se cancela mientras se inicia (después de regresar de onStartCommand (Intención, int, int)), déjelo en el estado iniciado pero no retenga este intención entregada. Más tarde, el sistema intentará volver a crear el servicio. Debido a que está en el estado de inicio, garantizará que se invoque onStartCommand (Intent, int, int) después de crear la nueva instancia de servicio; si no hay comandos de inicio pendientes para entregar al servicio, se llamará con un objeto de intento nulo, por lo que debe asegurarse de verificar esto.
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
return StartCommandResult.Sticky;
}
He creado una dependencia para mostrar las notificaciones
En My DeviceDetails_Droid.cs, configuré la alarma establecida durante 30 segundos
La funcionalidad para la notificación local funciona perfectamente cuando la aplicación está activa, pero cuando eliminé la aplicación (cerrar la aplicación) el receptor de la alarma no recibe ninguna llamada.
public void ShowNotification(string message, string title)
{
Intent alarmIntent = new Intent(Forms.Context, typeof(AlarmReceiver));
alarmIntent.PutExtra ("message", message);
alarmIntent.PutExtra ("title", title);
PendingIntent pendingIntent = PendingIntent.GetBroadcast(Forms.Context, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
AlarmManager alarmManager = (AlarmManager) Forms.Context.GetSystemService(Context.AlarmService);
//TODO: For demo set after 5 seconds.
alarmManager.Set(AlarmType.RtcWakeup, DateTime.Now.Millisecond + 30000, pendingIntent);
}
- En Androids MainActivity
[BroadcastReceiver]
public class AlarmReceiver : BroadcastReceiver
{
public override void OnReceive (Context context, Intent intent)
{
var message = intent.GetStringExtra ("message");
var title = intent.GetStringExtra ("title");
var notIntent = new Intent (context, typeof(MainActivity));
var contentIntent = PendingIntent.GetActivity (context, 0, notIntent, PendingIntentFlags.CancelCurrent);
var manager = NotificationManagerCompat.From (context);
var style = new NotificationCompat.BigTextStyle();
style.BigText(message);
//Generate a notification with just short text and small icon
var builder = new NotificationCompat.Builder (context)
.SetContentIntent (contentIntent)
.SetSmallIcon (Resource.Drawable.Icon)
.SetContentTitle (title)
.SetContentText (message)
.SetStyle (style)
.SetWhen (Java.Lang.JavaSystem.CurrentTimeMillis ())
.SetAutoCancel (true);
var notification = builder.Build();
manager.Notify(0, notification);
}
}
- Y en archivo manifiesto
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true"
android:process=":remote"
android:label="AlarmReceiver">
- El código anterior funciona perfectamente cuando la aplicación está en estado de ejecución. Pero la notificación no funciona cuando la aplicación se cierra o se mata.
AlarmManager funcionará cuando la aplicación se ejecute en primer plano o en segundo plano. Pero cuando se cierra la aplicación / se detiene la fuerza / muere, Alarm Manager también se elimina. La alarma se activará nuevamente solo si Android vuelve a iniciarse o el usuario inicia nuevamente la aplicación. Verifique estas respuestas también para referencia link1 , link2