2017-10-19 40 views
0

Je veux faire une exécution avec l'aide d'une méthode dans PCL AddData();, mais je cherche un moyen de l'attacher sur la propriété d'une notification appelée AddAction ci-dessous :AddAction sur une notification pour exécuter une méthode dans Xamarin (PCL)

.AddAction(Resource.Drawable.tick_notify, "Take", pIntent) 

mais je ne sais pas comment câbler parce que le troisième paramètre a besoin d'un PendingIntent, Est-il possible d'ajouter la méthode AddData du PCL? pour effectuer une certaine action?

EDITED

Service.cs

using System; 
using Android.App; 
using Android.Content; 
using Android.OS; 

namespace Diabetes.Droid 
{ 
    [Service] 
    public class Mservice : Service 
    { 
     //Receiver class 
     private AlarmReceiver mReceiver = new AlarmReceiver(); 
     /// <summary> 
     /// Raises the bind event. 
     /// </summary> 
     /// <param name="intent">Intent.</param> 
     public override IBinder OnBind(Intent intent) 
     { 
      return null; 
     } 



     /// <summary> 
     /// Called by the system when the service is first created. 
     /// </summary> 
     public override void OnCreate() 
     { 
      base.OnCreate(); 
      //IntentnFilter all actities to receive information 
      IntentFilter iF = new IntentFilter(); 
      iF.AddAction("com.android.music.metachanged"); 
      iF.AddAction("com.android.music.playstatechanged"); 
      iF.AddAction("com.android.music.playbackcomplete"); 
      iF.AddAction("com.android.music.queuechanged"); 
      iF.AddAction("com.htc.music.metachanged"); 
      iF.AddAction("fm.last.android.metachanged"); 
      iF.AddAction("com.sec.android.app.music.metachanged"); 
      iF.AddAction("com.nullsoft.winamp.metachanged"); 
      iF.AddAction("com.amazon.mp3.metachanged"); 
      iF.AddAction("com.miui.player.metachanged"); 
      iF.AddAction("com.real.IMP.metachanged"); 
      iF.AddAction("com.sonyericsson.music.metachanged"); 
      iF.AddAction("com.rdio.android.metachanged"); 
      iF.AddAction("com.samsung.sec.android.MusicPlayer.metachanged"); 
      iF.AddAction("com.andrew.apollo.metachanged"); 
      //register receiver with intentnfilter 
      RegisterReceiver(mReceiver, iF); 
     } 
     public override void OnDestroy() 
     { 
      base.OnDestroy(); 
     } 
    } 
} 

Répondre

1

Non, il n'y a pas de moyen de lier méthode directement à l'action de notification. Certainement parce que les notifications sont exécutées sur l'interface du téléphone système, hors de votre code d'application.

Vous devez générer une intention en attente et utiliser un récepteur pour pouvoir recevoir le rappel.

Cette restriction existe de la même manière dans Xamarin.

Vous pouvez trouver un exemple (en code Java standard Android) dans l'échantillon google UniversalMusicPlayer#MediaNotificationManager.java

Créer votre intention:

mAddDataPendingIntent = PendingIntent.getBroadcast(mService, REQUEST_CODE, 
       new Intent(ACTION_ADD_DATA).setPackage(pkg), PendingIntent.FLAG_CANCEL_CURRENT); 

Puis, quand la construction de votre notification:

notificationBuilder.addAction(new NotificationCompat.Action(icon, label, mAddDataPendingIntent)); 

Enregistrez votre diffusion:

IntentFilter filter = new IntentFilter(); 
       filter.addAction(ACTION_ADD_DATA); 
       mService.registerReceiver(this, filter); 

Et recevez l'action:

@Override 
public void onReceive(Context context, Intent intent) { 
    final String action = intent.getAction(); 
    LogHelper.d(TAG, "Received intent with action " + action); 
    switch (action) { 
     case ACTION_ADD_DATA: 
      addData(); 
      break; 
    } 
} 
+0

Selon votre code i peut remplacer 'mTransportControls.play()' 'avec AddData();' Méthode. –

+0

L'autre problème que je rencontre est Java, si du tout vous avez fourni le code C# –

+0

Oui, c'est ici que vous appelez votre méthode. J'ai mis à jour ma réponse pour être plus liée à votre contexte. A propos de la version C#, désolé mais mes connaissances sur xamarin sont trop faibles pour vous donner un exemple complet. – smora