wake-up-neo.com

Android-Benachrichtigung mit Schaltflächen

Ich versuche, eine Benachrichtigung mit zwei Tasten darauf zu machen:

  • man bringt mich zurück zur Aktivität
  • der andere schließt es

Hat jemand eine Idee, wie Sie das Schaltflächenklickereignis abfangen können (denken Sie daran, dass die Aktivität angehalten ist)?

14
doronsl

Ich freue mich, es zu posten! Nachdem ich die ganze Nacht gearbeitet hatte, fand ich etwas. Auf geht's!

1. Erstellen Sie eine XML-Layoutdatei für Ihre Benachrichtigung.

2. Erstellen Sie die Benachrichtigung mit dem Notification.Builder. Nachdem Sie alles hinzugefügt haben, was Sie möchten (Icons, Sounds usw.), machen Sie Folgendes:

        //R.layout.notification_layout is from step 1

        RemoteViews contentView=new RemoteViews(ctx.getPackageName(), R.layout.notification_layout);

        setListeners(contentView);//look at step 3

        notification.contentView = contentView;

3. Erstellen Sie eine Methode setListeners. Innerhalb dieser Methode muss man folgendes schreiben:

    //HelperActivity will be shown at step 4

    Intent radio=new Intent(ctx, packagename.youractivity.class);  
    radio.putExtra("AN_ACTION", "do");//if necessary

    PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0);
    //R.id.radio is a button from the layout which is created at step 2  view.setOnClickPendingIntent(R.id.radio, pRadio); 

    //Follows exactly my code!
    Intent volume=new Intent(ctx, tsapalos11598712.bill3050.shortcuts.helper.HelperActivity.class);
    volume.putExtra("DO", "volume");</p>

    //HERE is the whole trick. Look at pVolume. I used 1 instead of 0.
    PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0);
    view.setOnClickPendingIntent(R.id.volume, pVolume);

4. Für meine Anforderungen habe ich eine HelperActivity verwendet, die den Intentionen entspricht. Aber ich glaube nicht, dass es notwendig ist.

Wenn Sie den vollständigen Quellcode benötigen, können Sie ihn durchsuchen oder von meinem Git-Repo herunterladen. Der Code ist für den persönlichen Gebrauch bestimmt, erwarten Sie also nicht, einen wunderschönen Code mit vielen Kommentaren zu lesen. https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

ALLES OBEN BEANTWORTET DIE FRAGE DES FANGES VON VERSCHIEDENEN KNÖPFEN.

Über das Abbrechen der Benachrichtigung leite ich Sie hier weiter

So löschen Sie eine Benachrichtigung in Android

Denken Sie daran, die ID zu verwenden, die Sie bei der Benachrichtigungsmethode analysiert haben, als Sie die Benachrichtigung zum ersten Mal aufgerufen haben

41
LiTTle

In Bezug auf ICS ist die Frage einfach zu beantworten, da das erforderliche Verhalten die Standardbenachrichtigung widerspiegelt: Sie können close eine Benachrichtigung nach rechts wischen, und Sie können festlegen, welche activity gesendet werden soll Benutzer, wenn er es einfach mit PendingIntent drückt:

// The PendingIntent to launch our activity if the user selects this
// notification.  Note the use of FLAG_CANCEL_CURRENT so that, if there
// is already an active matching pending intent, cancel it and replace
// it with the new array of Intents.
PendingIntent contentIntent = PendingIntent.getActivities(this, 0,
        makeMessageIntentStack(this, from, message), PendingIntent.FLAG_CANCEL_CURRENT);

code aus http://developer.Android.com/guide/topics/ui/notifiers/notifications.html

4
Shine

Sie können einfach Aktionsschaltflächen in Ihrer Notification hinzufügen, indem Sie die Aktion auf Ihren Notification.Builder setzen und PendingIntent für jede Aktion definieren

unten ist der Beispielcode: 

    NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentTitle("My notification")
                .setContentText("Hello World!")
       .addAction(R.drawable.action_posetive,"posetive",PendingIntent.getActivity(0,intent,0))
.addAction(R.drawable.action_clear,"clear",PendingIntent.getActivity(0,intent,0));
        NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
3
Tushar Purohit

Wenn Sie einer Schaltfläche eine bestimmte Absicht zuordnen möchten:

views.setOnClickPendingIntent(R.id.your_button_id, pendingIntent);

Ich nehme an, Sie brauchen nur eine Absicht zu senden, wenn Sie auf die Schaltfläche klicken. Sie müssen also die Hauptbenachrichtigungsabsicht nicht festlegen

notification.contentIntent = yourPendingIntent;

Andernfalls (wenn Sie wie üblich "notification.contentIntent = pendingIntent;" einstellen) werden beide Absichten aufgerufen, was möglicherweise nicht Ihren Erwartungen/Benutzern entspricht.

Wenn Sie dennoch auf andere Teile der Benachrichtigung drücken möchten, rufen Sie diese allgemeine Absicht (oder eine andere) auf. Sie können dieselbe Methode der Intention-per-View-Zuweisung wie oben verwenden. Vergiss nicht zu setzen

Android:clickable="true"

zu jeder Ansicht, für die Sie onClick () verfolgen möchten.

Sie können diese Absichten anhand ihrer Extras in der Aktivität nachverfolgen, die sie anrufen. Wenn Sie sind Sie rufen Ihre Haupt-/Launcher-Aktivität auf , dann werden Sie sie hier nachverfolgen (da sie für diese Methode aus Javadoc stammt): 

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Bundle data = intent.getExtras();

    if (data != null && data.containsKey(YOUR_INTENT_KEY_SOURCE_CONSTANT)) {
       // process your notification intent
    }

    // go on with smth else
}
3
qubit

Hier finden Sie ein vollständiges Beispiel

    //Add this code to onCreate or some onclick Buttton
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
    long when = System.currentTimeMillis();
    builder.setSmallIcon(R.drawable.ic_notification);
    Intent notificationIntent = new Intent(getApplicationContext(), notificationActivity.class).putExtra("notification", "1");
    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 1, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    Notification notification = builder.getNotification();
    notification.when = when;

    RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_view);
    remoteViews.setTextViewText(R.id.tvName, "New Name");
    listener(remoteViews,getApplicationContext());


    notification.contentView = remoteViews;
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    manager.notify(1, notification);

und dann können Sie Listener-Methode definieren: 

    public void listener(RemoteViews remoteViews, Context context) {
    // you have to make intetns for each action (your Buttons)
    Intent intent = new Intent("Accept");
    Intent intent2 = new Intent("Reject");

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,1,intent,0);
    PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context,1,intent2,0);

    // add actions here !
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("Accept");
    intentFilter.addAction("Reject");


    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals("Accept")){
                Toast.makeText(context, "Accepted !!", Toast.LENGTH_SHORT).show();
            } else if(intent.getAction().equals("Reject")) {
                Toast.makeText(context, "Rejected !!", Toast.LENGTH_SHORT).show();
            }
        }
    };

    context.registerReceiver(receiver,intentFilter);
    remoteViews.setOnClickPendingIntent(R.id.ivRequest,pendingIntent);
    remoteViews.setOnClickPendingIntent(R.id.ivReject,pendingIntent2);

}

und hier ist das notification_view Layout, um Ihre Benachrichtigung zu individualisieren.

    <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:padding="16dp">

<TextView
    Android:id="@+id/textView"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:text="Request from "
    />

<TextView
    Android:id="@+id/tvName"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:layout_marginStart="15dp"
    Android:layout_toRightOf="@id/textView"
    Android:text="Amin"
    />

<ImageView
    Android:id="@+id/ivRequest"
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:layout_alignParentEnd="true"
    Android:layout_centerVertical="true"
    Android:src="@drawable/notification"
    />

<ImageView
    Android:id="@+id/ivReject"
    Android:layout_width="30dp"
    Android:layout_height="30dp"
    Android:layout_marginEnd="10dp"
    Android:layout_toLeftOf="@id/ivRequest"
    Android:layout_centerVertical="true"
    Android:src="@drawable/trash"
    />

  </RelativeLayout>
2
Amin

Für mich funktioniert das sehr gut. Ich werde das ganze Beispiel aufschreiben. Dies ist für die Benachrichtigung create

public void createNotification2(String aMessage) {
    final int NOTIFY_ID = 11;
    String name = getString(R.string.app_name);
    String id = getString(R.string.app_name); // The user-visible name of the channel.
    String description = getString(R.string.app_name); // The user-visible description of the channel.
    NotificationCompat.Builder builder;
    if (notifManager == null) {
        notifManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = notifManager.getNotificationChannel(id);
        if (mChannel == null) {
            mChannel = new NotificationChannel(id, name, importance);
            mChannel.setDescription(description);
            mChannel.enableVibration(true);
            mChannel.setLightColor(getColor(R.color.colorPrimaryDark));
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            notifManager.createNotificationChannel(mChannel);
        }
    } else {

    }
    Intent Off_broadcastIntent = new Intent(this, Database_Update.class);
    Off_broadcastIntent.setAction("on");
    Off_broadcastIntent.putExtra("toastMessage", "1");
    PendingIntent Off_actionIntent = PendingIntent.getService(this, 0, Off_broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent on_broadcastIntent = new Intent(this, Database_Update.class);
    on_broadcastIntent.setAction("off");
    on_broadcastIntent.putExtra("toastMessage", "0");
    PendingIntent on_actionIntent = PendingIntent.getService(this, 0, on_broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent cancel_broadcastIntent = new Intent(this, Database_Update.class);
    cancel_broadcastIntent.setAction("cancel");
    cancel_broadcastIntent.putExtra("toastMessage", "close");
    PendingIntent cancel_actionIntent = PendingIntent.getService(this, 0, cancel_broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent content_intent = new Intent(this, Status_Page.class);
    content_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, content_intent, PendingIntent.FLAG_UPDATE_CURRENT);


    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, id)
            .setSmallIcon(Android.R.drawable.ic_popup_reminder)
            .setContentTitle(name)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .setAutoCancel(false)
            .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
            .addAction(R.drawable.block, "ON", Off_actionIntent)
            .addAction(R.drawable.notification, "OFF", on_actionIntent)
            .addAction(R.drawable.clear, "CLOSE", cancel_actionIntent);
    Notification notification = mBuilder.build();
    notification.flags = Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT;
    notifManager.notify(11, notification);
}

In Android Menifest

<service Android:name=".Database_Update"></service>

Dies ist eine Serviceklasse

public class Database_Update extends Service {
String result="";

Realm realm;
BlockList blockList;
@Override
public void onCreate() {
    try {
        RealmConfiguration config = new RealmConfiguration.Builder()
                .name("notification.realm")
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();
        realm = Realm.getInstance(config);

    } catch (Exception e) {

        Log.d("Error Line Number", Log.getStackTraceString(e));
    }
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    //Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    Log.d("SERVICE","SERVICE CHECKING");
    result=intent.getStringExtra("toastMessage");
    Log.d("SERVICE",result);
    if (realm!=null){
        Log.d("SERVICE","realm working");
    }else {
        Log.d("SERVICE","Realm not working");
    }
    blockList=realm.where(BlockList.class).equalTo("package_name", "BLOCK_ALL").findFirst();
    try {
        Log.d("SERVICE",blockList.getStatus());
    } catch (Exception e) {
        Log.d("Error Line Number", Log.getStackTraceString(e));
    }
    realm.beginTransaction();
    if (result.equals("1")){
        if (blockList==null){
            BlockList blockList_new=realm.createObject(BlockList.class);
            blockList_new.setPackage_name("BLOCK_ALL");
            blockList_new.setStatus("yes");
        }else {
            blockList.setStatus("yes");
        }
        Log.d("SERVICE","BLOCKING NOTIFICATION");
        Toast.makeText(this, "BLOCKING", Toast.LENGTH_SHORT).show();
    }else if (result.equals("0")){
        if (blockList==null){
            BlockList blockList_new=realm.createObject(BlockList.class);
            blockList_new.setPackage_name("BLOCK_ALL");
            blockList_new.setStatus("no");
        }else {
            blockList.setStatus("no");
        }
        Log.d("SERVICE","ALLOW NOTIFICATION");
        Toast.makeText(this, "ALLOW NOTIFICATION", Toast.LENGTH_SHORT).show();
    }else if (result.equals("close")){
        NotificationManager manager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        manager.cancel(11);
        Log.d("SERVICE","REMOVING");
        Toast.makeText(this, "CLOSED", Toast.LENGTH_SHORT).show();
    }
    realm.commitTransaction();
    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    // We don't provide binding, so return null
    return null;
}

@Override
public void onDestroy() {
    if (realm!=null){
        realm.close();
    }
    Toast.makeText(this, "REMOVING", Toast.LENGTH_SHORT).show();
}
}
0
Muhaiminurabir