1

Ich möchte einige Methoden ausführen, wenn ich auf Notification Action Button klicke. Ich habe auf dieser Seite gesucht, aber alles scheint in Ordnung zu sein und mein IntentService wird nicht aufgerufen.IntentService onHandleEvent() startet nicht

Meine Aktion-Button-Intent

Intent off = new Intent(); 
    off.setAction("action"); 
    off.putExtra("test", "off"); 
    PendingIntent pOff = PendingIntent.getService(context, 22, off, 0); 

Builder Mitteilung

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) 
      .setSmallIcon(/**/) 
      .setContentTitle(/**/) 
      .setContentText(/**/) 
      .addAction(/**/, "Off", pOff) 
      .setContentIntent(pendingIntent) 
      .setDefaults(Notification.DEFAULT_SOUND) 
      .setAutoCancel(true); 

Intent Service Class

public class NotificationServiceClass extends IntentService { 

public NotificationServiceClass(String name) { 
    super(name); 
} 

public NotificationServiceClass() { 
    super("NotificationServiceClass"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Log.i("test", "onHandle"); 
    if (intent.getAction().equals("action")) { 
     Log.i("test", "action"); 
     Bundle bundle = intent.getExtras(); 
     if (bundle != null) { 
      Log.i("test", "onHandleBundleNotNull"); 
      if (bundle.containsKey("test")) { 
       Log.i("test", bundle.getString("test")); 
      } 
     } 
    } 
} 
} 

XML-Deklaration für Service-Klasse

<service 
     android:name=".Manager.NotificationServiceClass" 
     android:exported="false"> 
    </service> 

Antwort

2

Pro der Intents and Intent Filters training, die Intent Sie gebaut haben, ist eine implizite Absichten:

Implizite Absichten nennen keine bestimmte Komponente, sondern eine allgemeine Aktion erklären auszuführen, die eine Komponente aus einer anderen Anwendung ermöglicht handle es. Wenn Sie beispielsweise dem Benutzer einen Standort auf einer Karte anzeigen möchten, können Sie mit einer impliziten Absicht anfordern, dass eine andere fähige App einen bestimmten Standort auf einer Karte anzeigt.

Was Sie wirklich wollen, ist eine explizite Absicht: eine, die die Komponente mit Namen auf der gleichen Seite wie pro die Note zu starten gibt:

Hinweis: Wenn Sie einen Dienst starten, sollten Sie immer Spezifizieren Sie den Komponentennamen. Andernfalls können Sie nicht sicher sein, welcher Dienst auf die Absicht reagiert, und der Benutzer kann nicht sehen, welcher Dienst gestartet wird.

Wenn Ihre Absicht erstellen, sollten Sie

// Note how you explicitly name the class to use 
Intent off = new Intent(context, NotificationServiceClass.class); 
off.setAction("action"); 
off.putExtra("test", "off"); 
PendingIntent pOff = PendingIntent.getService(context, 22, off, 0); 
+0

Das war ein wirklich dummer Fehler. Vielen Dank für den Hinweis. –

0

Mit Blick auf Ihrem Code verwenden, ich sehe Sie nicht das PendingIntent welcher Klasse zu sagen für Ihren Service zu nutzen.

sollten Sie fügen:

off.setClass(this, NotificationServiceClass.class); 

Ansonsten ist der PendingIntent nichts zu tun hat.