2012-06-30 13 views
19

Ich habe eine Anwendung mit zwei Tasten. Eine Schaltfläche, die die Anwendung "schließt" und eine, die den Algorithmus startet. Wenn ich auf "Beginne" klicke, wird die Anwendung "ausgeblendet" und eine Benachrichtigung in der Benachrichtigungsleiste angezeigt. Ich muss in der Lage sein, eine Methode auszuführen/aufzurufen, wenn auf die Benachrichtigung geklickt/gedrückt wird. Es gibt ein paar Antworten für diese Art von Frage, aber sie sind unglaublich vage und man zeigt nur auf einen Link zum Dokument auf BroadcastReceiver.So führen Sie eine Methode durch Klicken auf eine Benachrichtigung

Wenn Sie eine URL zum BroadcastReceiver-Dokument hinterlassen und "Diese Seite lesen" sagen, antworten Sie bitte nicht auf diese Frage. Wenn Sie erklären möchten, wie ich BroadcastReceiver verwenden kann, um eine Methode auszuführen (innerhalb derselben Klasse, die die Benachrichtigung angezeigt hat), zeigen Sie mir bitte Code, wie dies gemacht werden könnte.

Mein Algorithmus: Drücken Sie eine Taste, zeigen Sie Benachrichtigung an, klicken Sie auf Benachrichtigung, rufen Sie eine Methode auf (Aktivität nicht anzeigen). Das ist es.

Wenn es nicht möglich ist, lass es mich wissen. Wenn ja, zeig mir bitte, was du tun würdest, um es möglich zu machen. Etwas so einfaches sollte von den Entwicklern des Android SDK nicht übersehen worden sein.

+0

Ich habe nur den Benachrichtigungsmanager zu benachrichtigen und die Benachrichtigung in der Benachrichtigungsleiste anzuzeigen. Wenn ich auf die Benachrichtigung klicke, wird die Aktivität geöffnet. Ich wollte dieses Verhalten ändern, indem ich eine Methode aufrufen/ausführen, anstatt die Aktivität zu öffnen. Ich versuche mit Arfins Lösung zu arbeiten. Ich sehe einfach nicht, wie ich das erreichen soll.Ich habe eine "DummyActivity" erstellt und bin mir nicht sicher, ob der zweite Teil seiner Lösung in der "DummyActivity" sein soll. Ich bin nur verwirrt. Ich mag es, wenn Dinge reibungslos zusammenpassen. – AnDev

+0

yea AnDev Sobald deine Dummy-Aktivität beginnt, sende eine Broadcast-Nachricht von ihrer und beende sie einfach, so dass du jetzt die Broadcast-Nachricht in der Elternklasse erhältst, wie ich bereits erklärt habe, kannst du von dort aus jede gewünschte Methode aufrufen. Es ist nicht nötig, innerhalb der Dummy-Aktivität etwas anderes zu tun, als Broadcast zu senden und zu beenden. –

Antwort

8

Durch die Benachrichtigung klicken klicken wir können kein Feuerereignis oder Klick-Listener erhalten, während wir Ihre Anwendung in der Benachrichtigungsleiste hinzufügen, um eine ausstehende Absicht festzulegen, die normalerweise eine Aktivität startet, sobald eine Benachrichtigung geklickt oder gedrückt wird. Aber ich habe eine Lösung für Sie, wenn Sie wirklich Ihre Aktivität nicht anzeigen möchten, dann die Aktivität, die mit ausstehenden Absicht beginnen wird, senden Sie eine breite Besetzung von dort zu Ihrer übergeordneten Aktivität und nur die ausstehende Aktivität beenden und dann Empfänger einmal senden empfängt im Aufruf der Elternaktivität die gewünschte Methode im Empfänger. Für Ihre Referenz ..

// This is what you are going to set a pending intent which will start once 
// notification is pressed. Hopes you know how to add notification bar. 
Intent notificationIntent = new Intent(this, dummy_activity.class); 
notificationIntent.setAction("android.intent.action.MAIN"); 
notificationIntent.addCategory("android.intent.category.LAUNCHER"); 
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
           notificationIntent, 
           PendingIntent.FLAG_UPDATE_CURRENT | 
           Notification.FLAG_AUTO_CANCEL); 

// Now, once this dummy activity starts send a broad cast to your parent activity and finish the pending activity 
//(remember you need to register your broadcast action here to receive). 
    BroadcastReceiver call_method = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action_name = intent.getAction(); 
       if (action_name.equals("call_method")) { 
        // call your method here and do what ever you want. 
       } 
      }; 
     }; 
     registerReceiver(call_method, new IntentFilter("call_method")); 
    } 
} 
+0

Vielen Dank für Ihre Antwort. Es ist sehr gründlich und nützlich. – AnDev

+0

Wenn ich überprüfen möchte, ob sich die Anwendung im Vordergrund befindet oder nicht, klicken Sie auf Ereignis und je nach Code @Daud Arfin, wenn wir eine Aktivität starten, wird immer die App im Vordergrund angezeigt. Gibt es eine alternative Möglichkeit zu überprüfen, ob sich die Anwendung im Vordergrund befindet oder nicht, klicken Sie auf Ereignis –

+0

@Er Kimmi Dhingra - Sie können sich auf android Lebenszyklen verlassen .. Flags innerhalb onPause/onStop und onResume/onStart beibehalten. –

-3
protected void displayNotification() { 
    Log.i("Start", "notification"); 

    /* Invoking the default notification service */ 
    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this); 
    mBuilder.setAutoCancel(true); 

    mBuilder.setContentTitle("New Message"); 
    mBuilder.setContentText("You've received UnRead message."); 
    mBuilder.setTicker("New Message Alert!"); 
    mBuilder.setSmallIcon(R.drawable.icon2); 

    /* Increase notification number every time a new notification arrives */ 
    mBuilder.setNumber(++numMessages); 

    /* Creates an explicit intent for an Activity in your app */ 

    Intent resultIntent = new Intent(this, FreesmsLog.class); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    stackBuilder.addParentStack(FreesmsLog.class); 

    /* Adds the Intent that starts the Activity to the top of the stack */ 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
        0, 
        PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
    mBuilder.setContentIntent(resultPendingIntent); 
    mNotificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    /* notificationID allows you to update the notification later on. */ 
    mNotificationManager.notify(notificationID, mBuilder.build()); 

} 
+9

Scheint wie eine Kopie aus dem Beispielcode von Google. Beantwortet nicht die Frage von OP. – cdkn7

27

Nach mehreren Iterationen von Versuch und Irrtum, ich fand schließlich eine recht einfache und saubere Art und Weise eine beliebige Methode ausgeführt werden, wenn eine Aktion der Benachrichtigung geklickt wird. In meiner Lösung gibt es eine Klasse (ich nenne sie NotificationUtils), die die Benachrichtigung erstellt und außerdem eine statische IntentService-Klasse enthält, die ausgeführt wird, wenn auf Aktionen in der Benachrichtigung geklickt wird. Hier ist meine NotificationUtils Klasse, gefolgt von den notwendigen Änderungen an AndroidManifest.xml:

public class NotificationUtils { 
    public static final int NOTIFICATION_ID = 1; 

    public static final String ACTION_1 = "action_1"; 

    public static void displayNotification(Context context) { 

     Intent action1Intent = new Intent(context, NotificationActionService.class) 
      .setAction(ACTION_1); 

     PendingIntent action1PendingIntent = PendingIntent.getService(context, 0, 
       action1Intent, PendingIntent.FLAG_ONE_SHOT); 

     NotificationCompat.Builder notificationBuilder = 
       new NotificationCompat.Builder(context) 
         .setSmallIcon(R.drawable.ic_launcher) 
         .setContentTitle("Sample Notification") 
         .setContentText("Notification text goes here") 
         .addAction(new NotificationCompat.Action(R.drawable.ic_launcher, 
           "Action 1", action1PendingIntent)); 

     NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); 
     notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); 
    } 

    public static class NotificationActionService extends IntentService { 
     public NotificationActionService() { 
      super(NotificationActionService.class.getSimpleName()); 
     } 

     @Override 
     protected void onHandleIntent(Intent intent) { 
      String action = intent.getAction(); 
      DebugUtils.log("Received notification action: " + action); 
      if (ACTION_1.equals(action)) { 
       // TODO: handle action 1. 
       // If you want to cancel the notification: NotificationManagerCompat.from(this).cancel(NOTIFICATION_ID); 
      } 
     } 
} 

Jetzt brauchen Sie nur Ihre Aktionen in onHandleIntent umzusetzen und die NotificationActionService zu Ihrem Manifest innerhalb der <application> Tags hinzufügen:

<service android:name=".NotificationUtils$NotificationActionService" /> 

Zusammenfassung:

  • Erstellen Sie eine Klasse, die die Benachrichtigung erstellt.
  • Innerhalb dieser Klasse, fügen Sie eine IntentService innere Klassen (stellen Sie sicher, es ist statisch, oder Sie erhalten einen kryptischen Fehler!), die jede Methode basierend auf der Aktion ausgeführt werden kann, die geklickt wurde.
  • Deklarieren Sie die IntentService-Klasse in Ihrem Manifest.
+0

Was passiert, wenn das Feld Aktion bereits verwendet wird? Wie "ACTION_VIEW" –

+0

Sie könnten der Absicht eine zusätzliche hinzufügen, z. action1Intent.putExtra ("action1extra", 1), und dann in onHandleIntent verwenden if (intent.getIntExtra ("action1extra", -1) == 1) {...} –

+0

Verbrachte den besseren Teil meines bisherigen Tages suchen ein Weg, dies zu tun. Froh, dass ich deine Antwort gefunden habe, wirkt wie ein Zauber. – kalenpw

Verwandte Themen