it-swarm.com.de

Durch Klicken auf Android-Benachrichtigungsaktionen wird der Benachrichtigungsbereich nicht geschlossen

Ich füge eine Benachrichtigung zur Systemleiste mithilfe der NotificationCompat-Bibliothek hinzu. Diese Benachrichtigung verfügt über zwei Aktionsschaltflächen. Außerdem ist die AutoCancel()-Eigenschaft in der Benachrichtigung auf true gesetzt. 

Wenn Sie auf die Aktionsschaltflächen klicken, wird System so konfiguriert, dass eine IntentService gestartet wird, die NotificationManager.cancel(NOTIFICATION_ID) aufruft und dann eine Aktivität in einer neuen Aufgabe startet.
Das Problem ist, dass die Benachrichtigung zwar aus dem Fach entfernt wird, die Schublade jedoch nicht ausgeblendet wird. Die aufgerufene Aktivität wird hinter die Schublade gezeichnet. 

Kann jemand bitte etwas Licht auf den speziellen Code werfen, der erforderlich ist, um die Auslosung zu schließen, außer die Benachrichtigung abzubrechen?

Vielen Dank.

44
Aster

Wenn Ihre Aktion in Form einer Sendung oder eines Dienstes erfolgt, Sie jedoch beabsichtigen, dass die Benachrichtigungsleiste kollabiert, sollten Sie die Sendung übertragen Android.intent.action.CLOSE_SYSTEM_DIALOGS von Ihrem onReceive. Dadurch wird die Schublade manuell geschlossen.

41
Andro Id

Ich habe festgestellt, dass, wenn Sie die Aktionsschaltflächen in erweiterten Benachrichtigungen verwenden, Sie zusätzlichen Code schreiben müssen und Sie mehr eingeschränkt sind. 

Vor der Verwendung erweiterter Benachrichtigungen bestand die Standardaktion in der Benachrichtigung zum Dateidownload darin, eine VIEW-Aktivität für die Datei zu starten. Die VIEW-Intention wurde von einer Chooser-Intention umschlossen. Ich konnte eine ausstehende Absicht für die Auswahl der Auswahl nicht direkt aus der Benachrichtigung verwenden, da die Auswahl abstürzen würde, wenn der Dateityp nicht angezeigt wurde. Ich hatte also einen BroadcastReceiver, der die Chooser-Absicht starten würde. 

Bei erweiterten Benachrichtigungen entschied ich mich, die Benachrichtigung über das Herunterladen von Dateien so zu ändern, dass standardmäßig die Aktivität der Dateidetails mit Aktionsschaltflächen für Anzeigen und Senden angezeigt wird. Wie von user2536953 bemerkt, schließt das Starten eines Broadcast-Empfängers von der Benachrichtigung die Benachrichtigungsschublade nicht. Aufgrund seiner Informationen, dass eine Aktivität die Schublade schließen würde, habe ich meinen Rundfunkempfänger zu einer NotificationActivity ohne Benutzeroberfläche geändert. 

Wie in diesem Beitrag angegeben, So schließen Sie die Android-Benachrichtigung nach dem Klicken auf Aktion , besteht ein weiteres Problem darin, dass Sie Ihre Benachrichtigung manuell abbrechen müssen, wenn der Benutzer auf eine Aktionsschaltfläche klickt. Die Benachrichtigung wird nur für die Standardaktion automatisch abgebrochen. Ich habe auch Code in NotificationActivity hinzugefügt, um damit umzugehen. 

Erstellen der erweiterten Benachrichtigung mit Schaltflächen "Anzeigen" und "Senden":

    NotificationCompat.Builder builder = new NotificationCompat.Builder(m_context).setAutoCancel(true);

    final PendingIntent contentIntent = DownloadedFileIntentUtils.buildPendingItemDetailIntent(m_context, item);
        builder.setContentIntent(contentIntent);

    PendingIntent viewIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_VIEW,
                m_context.getString(R.string.action_open), uri, MimeTypeUtil.getMimeType(item), id);
    builder.addAction(R.drawable.actionbar_open_with, m_context.getString(R.string.action_open), viewIntent);

    PendingIntent sendIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_SEND,
                m_context.getString(R.string.action_send), uri, MimeTypeUtil.getMimeType(item), id);
    builder.addAction(R.drawable.actionbar_share, m_context.getString(R.string.action_send), sendIntent);

    builder.setTicker(title)
    .setContentTitle(title)
    .setContentText(text)
    .setSmallIcon(R.drawable.notification_download);
    .setStyle(new NotificationCompat.BigTextStyle().bigText(text));

    getNotificationManager().notify(id, builder.build());

Erstellen der Absicht zum Starten einer Aktivität über die Benachrichtigungsaktionsschaltflächen:

    public static PendingIntent buildNotificationActionIntent(Context context, String action, String actionTitle, Uri uri,
        String mimeType, int notificationId) {
    // Build the file action intent (e.g. VIEW or SEND) that we eventually want to start.
    final Intent fileIntent = buildFileActionIntent(action, actionTitle, uri, mimeType);

    // Build the intent to start the NotificationActivity.
    final Intent notificationIntent = new Intent(context, NotificationActivity.class);
    // This flag must be set on activities started from a notification.
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    // Pass the file action and notification id to the NotificationActivity.
    notificationIntent.putExtra(Intent.EXTRA_INTENT, fileIntent);
    notificationIntent.putExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, notificationId);

    // Return a pending intent to pass to the notification manager.
    return PendingIntent.getActivity(context, s_intentCode.getAndIncrement(), notificationIntent, PendingIntent.FLAG_ONE_SHOT);
}

public static Intent buildFileActionIntent(String action, String actionTitle, 
        Uri uri, String mimeType) {
    Intent intent = new Intent(action);
    intent.addCategory(Intent.CATEGORY_DEFAULT);

    if (action.equals(Intent.ACTION_SEND)) {
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intent.setType(mimeType);
    } else {
        intent.setDataAndType(uri, mimeType);
    }

    intent.putExtra(Intent.EXTRA_TITLE, actionTitle);

    // Grant read permission on the file to other apps without declared permission.
    int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
    intent.setFlags(flags);

    return intent;
}

Benachrichtigungsaktivität ohne Benutzeroberfläche:

public class NotificationActivity extends Activity {
private final static Logger s_logger = LogUtil.getLogger(NotificationActivity.class);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();

    // Cancel the notification that initiated this activity.
    // This is required when using the action buttons in expanded notifications.
    // While the default action automatically closes the notification, the
    // actions initiated by buttons do not.
    int notificationId = intent.getIntExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, -1);
    if (notificationId != -1) {
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        manager.cancel(notificationId);
    }

    // If there is an activity to handle the action, start the file action.
    if (DownloadedFileIntentUtils.verifyActivityIsAvailable(this, fileActionIntent, false)) {
            fileActionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            DownloadedFileIntentUtils.startFileActionActivity(this, fileActionIntent);
    }

    // Finish activity.
    finish();
}

public static void startFileActionActivity(Context context, Intent fileActionIntent) {
    // Start chooser intent.
    Intent chooser = Intent.createChooser(fileActionIntent, fileActionIntent.getStringExtra(Intent.EXTRA_TITLE));

    // Copy the flags from fileActionIntent to chooser intent.
    // FileActionExecutor must set FLAG_ACTIVITY_NEW_TASK on the intent passed to startActivity
    // because the flag is required when starting an activity from a context that is not an activity.
    chooser.addFlags(fileActionIntent.getFlags());

    context.startActivity(chooser);
}

Vergessen Sie nicht, NotificationActivity zu AndroidManifest.xml hinzuzufügen. 

9
Vicki

Ich weiß sehr gut zu schätzen, dass Soumyajyotis Antwort richtig sein sollte ... es ist tatsächlich nicht ... 

ich benutze

Intent CR = new Intent(CRCODE); 
PendingIntent.getBroadcast(getApplicationContext(), MY_ID, CR, 0);

in einem Remoteview-Layout für eine laufende Benachrichtigung ...

ich kann Ihnen versichern, dass die Schublade nicht geschlossen wird, sondern die Absicht ausgelöst und die Aktivität hinter der geöffneten Schublade gezeichnet wird. Außerdem werden die anderen Aufgaben ausgeführt, die ich meinem Empfänger zugewiesen habe.

ich habe sowohl GetActivity als auch GetService getestet (beide funktionieren unter meinen Umständen nicht, ich muss mehrere Absichten aufRecieve abfeuern) und beide schließen die Schublade richtig ...

Ich weiß, dass dies keine Antwort ist, aber wann und wenn ich es finde, werde ich zurücksenden, um dies zu bearbeiten ...

verrückter Gedanke ... vielleicht könnte eine Aktivität ohne Inhaltsansicht als Rundfunkempfänger bezeichnet werden, der bei Bedarf andere Klassen oder Apps in geeigneter Weise auslöst ...

der oben aufgeführte verrückte Gedanke funktioniert ... Starten Sie eine Aktivität mit PendingIntent.getActivity und verwenden Sie sie, um Broadcasts oder andere Absichten weiterzuleiten, und beenden Sie sich dann selbst ... der Effekt ist nicht direkt, aber für den Endbenutzer nicht wahrnehmbar

1
me_

versuche dies:

    NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
    Intent notificationIntent = new Intent(this.getBaseContext(), MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder mNotifyBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(
            getApplicationContext())
            .setTicker(getApplicationContext().getText(R.string.app_name))
            .setContentTitle(getApplicationContext().getText(R.string.app_name))
            .setContentText(getApplicationContext().getText(R.string.text))
            .setSmallIcon(R.drawable.smallicon)
            .setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher))
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .setVibrate(new long[]{150, 300});
    mNotifyBuilder.build().flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(1, mNotifyBuilder.build());
0

Das Android-System bricht den Benachrichtigungsbereich für Sie zusammen, wenn Sie auf eine Benachrichtigung klicken und eine Aktivität oder Sendung starten. Ich glaube nicht, dass es eine programmatische Möglichkeit gibt, den Benachrichtigungsbereich anhand Ihres Codes zu schließen. Ich schlage vor, dass Sie die Absichten überprüfen, die Sie an den Benachrichtigungs-Builder übergeben, und sicherstellen, dass sie die richtigen Referenzabsichten erhalten. Ich denke, etwas im Android-Benachrichtigungsmanager wird aufgrund der von Ihnen bereitgestellten Absicht blockiert. Bisher habe ich nicht gesehen, dass die Benachrichtigungsschublade geöffnet bleibt, sobald die Aktion durch die Benachrichtigung ausgelöst wird. Nur neugierig, ob Ihre Zielaktivität ein halbtransparenter Bereich ist, in dem die vorherige Aktivität sichtbar ist. Wenn dies der Fall ist, empfehle ich, den Hintergrund vollständig undurchsichtig zu machen (ohne transparenten/halbtransparenten Bereich). Möglicherweise verhindert das, dass der Android-Starter die Stoppsequenz abschließt, und lässt den Starter die Benachrichtigungsschublade nicht schließen. Ich hoffe ich konnte dir helfen. Alles Gute.

0