2016-04-18 28 views
7

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); 
} 

  • In 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); 
    } 
} 

  • E nel file manifesto

<receiver 
android:name=".AlarmReceiver" 
android:enabled="true" 
android:exported="true" 
android:process=":remote" 
android:label="AlarmReceiver"> 

  • Il codice di cui sopra è in esecuzione perfettamente quando applicazione è in stato in funzione ma la notifica non funziona quando applicazione è chiusa o ucciso
+1

è necessario implementare Background Servizio per farlo funzionare dopo l'applicazione viene ucciso o chiuso. Fai riferimento a questo: http://stackoverflow.com/a/34207954/6127411. –

+0

In Manifest user797725

risposta

0

AlarmManager funziona quando A pp è in esecuzione in primo piano o in background. Ma quando l'app viene chiusa/interrotta forzatamente/uccisa, viene eliminato anche Alarm Manager. L'allarme si spegnerà di nuovo solo se Android viene riavviato o l'App viene nuovamente lanciata dall'utente. Controlla anche queste risposte per riferimento link1, link2

+0

È ancora così? I link che hai condiviso sono un po 'datati ora. –

+0

Quindi, come fanno le App di allarme esistenti, perché per loro funzionano ancora nonostante siano state uccise –

5

1) Se qualcuno uccide la tua app, gli allarmi registrati all'app vengono annullati.

2) È possibile avviare il servizio in background sul Boot del dispositivo al fine di registrare i vostri allarmi, o eseguire qualsiasi altro codice è necessario impostare le notifiche ...

  • Add "androide. intent.action.BOOT_COMPLETED" al tuo BroadcastReceiver:

[BroadcastReceiver] 
[IntentFilter(new string[]{"android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)] 
public class AlarmReceiver : BroadcastReceiver 

  • Nella tua manifesta aggiuntivo nel bagagliaio autorizzazione 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>  

Nel caso di Xamarin di Stock Price example, se si imposta "RECEIVE_BOOT_COMPLETED" si è "auto" riavviare il servizio e la tua volontà iniziare a ricevere le notifiche al riavvio del loro telefono senza prima lanciare la vostra applicazione:

[BroadcastReceiver] 
[IntentFilter(new string[]{StockService.StocksUpdatedAction,Boo "android.intent.action.BOOT_COMPLETED"}, Priority = (int)IntentFilterPriority.LowPriority)] 
public class StockNotificationReceiver : BroadcastReceiver 

3) è possibile utilizzare un Service contro un SeviceIntent e sovrascrivere il StartCommandResult per tornare Sticky

con un servizio di Sticky-based, viene riavviato se viene terminata.

costante per tornare da onStartCommand (Intent, int, int): se il processo di questo servizio viene ucciso mentre è iniziato (dopo il ritorno dal onStartCommand (Intent, int, int)), poi lasciare in stato avviato ma non mantenere questo intento consegnato. Successivamente il sistema proverà a ricreare il servizio. Poiché è nello stato avviato, garantirà di chiamare onStartCommand (Intent, int, int) dopo aver creato la nuova istanza del servizio; se non ci sono comandi di avvio in sospeso da consegnare al servizio, verrà chiamato con un oggetto null intent, quindi è necessario fare attenzione a controllare questo.

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     return StartCommandResult.Sticky; 
    } 
+0

Ho visto il primo paragrafo [qui] (https://developer.android.com/reference/android/provider/AlarmClock. html) e sembra che forse in questo caso non sia necessaria l'autorizzazione 'SET_ALARM', è vero? Sto cercando di pianificare le notifiche locali e mi chiedo se dovrei aggiungere o meno quell'autorizzazione. Sembra che funzioni finora senza di esso. Grazie. – hvaughan3

+0

@ hvaughan3 se si sta scrivendo la propria applicazione sveglia, è necessario impostare quella perm per ricevere intenti. Se stai ricevendo intenti da un'app di allarme, no non è necessaria. – SushiHangover

+0

Questo ha senso ora. Grazie – hvaughan3