2017-11-13 3 views
4

Ich arbeite an einer App, wo ich einen Dienst habe, der immer im Hintergrund ausgeführt werden sollte. Dieser Dienst ist verantwortlich für eine Benachrichtigungsleiste, die immer sichtbar sein sollte. Die Benachrichtigungsleiste verfügt über 2 Schaltflächen, wobei die erste für das Erfassen und Speichern von Daten dient und die zweite eine Aktivität, die alle Daten anzeigt. Ich habe ein Problem festgestellt, bei dem, wenn ich die Anwendung schließe und dann die Benachrichtigungsschaltfläche drücke, die nach dem Start dieser Aktivität eine Aktivität startet, meine Benachrichtigungsschaltflächen nicht mehr reagieren. Beachten Sie, dass beide Schaltflächen vor dem Punkt funktionieren, an dem der zweite Klick die Aktivität startet.Android-Benachrichtigungsleiste Schaltflächen reagieren nicht

Hier ist ein Template-Code für meinen Benachrichtigungsdienst und für Benachrichtigungsleiste Tastenhandler

Dienst, der die Benachrichtigungsleiste

public class NotificationBarService extends Service { 

     private int notificationID; 


     @Override 
     public IBinder onBind(Intent intent){ 
      return null; 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId){ 


      notificationID = new Random().nextInt(); 

      RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification); 
      contentView.setImageViewResource(R.id.image, R.mipmap.ic_launcher); 
      contentView.setTextViewText(R.id.title, "Custom notification"); 
      contentView.setTextViewText(R.id.text, "This is a custom layout"); 


      //Handle the button for showing bookmarks on custom notification 
      Intent buttonsIntent2 = new Intent(this, NotificationBarButtonActivityHandler.class); 
      buttonsIntent2.putExtra(PENDING_ACTION, SHOW_BOOKMARKS); 
      contentView.setOnClickPendingIntent(R.id.notificationBarShowBookmarksButton, PendingIntent.getActivity(this, 0, buttonsIntent2, 0)); 


      //Handle the button for adding bookmark on custom notification 
      Intent buttonsIntent = new Intent(this, NotificationBarButtonActivityHandler.class); 
      buttonsIntent.putExtra(PENDING_ACTION, REGISTER_BOOKMARK); 
      contentView.setOnClickPendingIntent(R.id.notificationBarAddBookmarkFromChromeButton, PendingIntent.getActivity(this, 1, buttonsIntent, 0)); 


      RemoteViews notificationView = new RemoteViews(getPackageName(), 
        R.layout.custom_notification); 


      Intent switchIntent = new Intent(this, NotificationBarService.class); 
      PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 0, 
        switchIntent, 0); 

      notificationView.setOnClickPendingIntent(R.id.notificationBarShowBookmarksButton, 
        pendingSwitchIntent); 


      NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
        .setContent(contentView) 
        .setSmallIcon(R.drawable.notification_small_icon) 
        .setOngoing(true); 

      Notification notification = mBuilder.build(); 

      startForeground(notificationID, notification); 

      return START_STICKY; 
     } 


     @Override 
     public void onDestroy(){ 
      super.onDestroy(); 

      stopForeground(true); 

     } 
    } 

Klasse behandelt, die den Knopf drückt auf Benachrichtigungsleiste Griff

public class NotificationBarButtonActivityHandler extends Activity { 

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

     String action = (String) getIntent().getExtras().get(NotificationBarService.PENDING_ACTION); 

     if (action != null) { 
      if (action.equals(NotificationBarService.REGISTER_BOOKMARK)){ 
       CustomLogger.log("---------------- BUTTON FOR COLLECT DATA WAS PRESSED!!!"); 

       //Does something here 
      } 
      else if(action.equals(NotificationBarService.SHOW_BOOKMARKS)){ 
       CustomLogger.log("---------------- BUTTON FOR SHOW DATA WAS PRESSSED!!!"); 


       //Notification bar buttons start not responding right after 
       //this is executed. Note that this problem only occurs if I close the app 
       //and press the notification button to execute this code. 
       //Otherwise this works just fine. 
       Intent intent2; 
       intent2 = new Intent(this, BookmarkDisplayActivity.class); 
       startActivity(intent2); 
      } 
     } 


     finish(); 
    } 
} 

Also im Grunde, wenn ich die Anwendung schließe und den Code, der die Aktivität startet, beide Tasten funktionieren wie erwartet, aber sobald ich Sterne Bei der Aktivität hören beide Tasten auf zu arbeiten.

Antwort

3

Ok, endlich habe ich das Problem gelöst, dass ich die Art und Weise geändert habe, wie ich mit den Tasten drücke. Das habe ich jetzt bekommen und es funktioniert wie erwartet.

In NotificationBarService dies ist, wie ich die Zuhörer für die Tasten

Intent addBookmarkIntent = new Intent(this, NotificationBarButtonListener.class); 
      addBookmarkIntent.setAction(ADD_BOOKMARK_ACTION); 
      PendingIntent pendingAddBookmarkIntent = PendingIntent.getBroadcast(this, 0, addBookmarkIntent, 0); 
      contentView.setOnClickPendingIntent(R.id.notificationBarAddBookmarkFromChromeButton, pendingAddBookmarkIntent); 

      Intent showBookmarkIntent = new Intent(this, NotificationBarButtonListener.class); 
      showBookmarkIntent.setAction(SHOW_BOOKMARK_ACTION); 
      PendingIntent pendingShowBookmarkIntent = PendingIntent.getBroadcast(this, 0, showBookmarkIntent, 0); 
      contentView.setOnClickPendingIntent(R.id.notificationBarShowBookmarksButton, pendingShowBookmarkIntent); 

und dann erhalte ich eine Sendung selbst und behandeln es wie dieses

public static class NotificationBarButtonListener extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      final String action = intent.getAction(); 
      if(action.equals(ADD_BOOKMARK_ACTION)){ 
       CustomLogger.log("---------------- BUTTON FOR REGISTER BOOKMARK WAS PRESSED!!! "); 


      } 
      else if(action.equals(SHOW_BOOKMARK_ACTION)){ 
       CustomLogger.log("---------------- BUTTON FOR SHOW BOOKMARK WAS PRESSSED!!!"); 

      } 

     } 
    } 

Hinweis behandeln, dass dies mir erforderliche hinzufügen folgende Zeile zu meinem Manifest

<receiver android:name=".NotificationBarService$NotificationBarButtonListener"/> 
Verwandte Themen