1

Я хочу показать уведомление, когда работает моя служба записи. Пользователь должен иметь возможность приостанавливать или останавливать рекордер непосредственно из уведомления. Поэтому я добавил две кнопки в «Уведомление» и реализовал BroadcastReceiver, который обрабатывает нажатия кнопок.Уведомления на Android: начните действие на кнопку

Он работает почти как я хочу, но есть одна проблема, которую я не могу решить. Когда пользователь нажимает кнопку, я хочу показать действие. Вот мой код:

private void showNotification() { 
    int requestID = (int) System.currentTimeMillis(); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("STOP_RECORDING"); 
    filter.addAction("PAUSE_RECORDING"); 
    filter.addAction("SHOW_ACTIVITY"); 

    this.broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      switch (intent.getAction()) { 
       case "STOP_RECORDING": onStopClick(); break; 
       case "PAUSE_RECORDING": onPauseClick(); break; 
       case "SHOW_ACTITIVY": break; 
       default: Log.i(T, "UNKNOWN ACTION IN NOTIFICATION INTENT"); 
      } 
     } 
    }; 

    Intent stdIntent = new Intent(getApplicationContext(), MyActivityClass.class); 
    stdIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), requestID, stdIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Intent intent1 = new Intent(); 
    intent1.setAction("STOP_RECORDING"); 
    PendingIntent stopIntent = PendingIntent.getBroadcast(getApplicationContext(), requestID, intent1, PendingIntent.FLAG_UPDATE_CURRENT); 

    Intent intent2 = new Intent(); 
    intent2.setAction("PAUSE_RECORDING"); 
    PendingIntent pauseIntent = PendingIntent.getBroadcast(getApplicationContext(), requestID, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 



    NotificationCompat.Builder notificationBuilder; 

    notificationBuilder = new NotificationCompat.Builder(this); 
    // ... configure notification (title, text, icon) 
    notificationBuilder.addAction(R.drawable.ic_pause_white_48dp, "Pause", pauseIntent); 
    notificationBuilder.addAction(R.drawable.ic_stop_white_48dp, "Stop", stopIntent); 

    registerReceiver(this.broadcastReceiver, filter); 
    ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(this.notificationID, notificationBuilder.build()); 
} 

В настоящее время правильное действие для каждой кнопки выполняется, но если приложение не отображается, когда пользователь щелкает, приложение не отображается. Как я могу это достичь?

Нужно ли вообще использовать BroadcastReceiver здесь? Есть ли возможность использовать getActivity вместо getBroadcast и определить, какая кнопка была нажата другим способом?

ответ

0

Хорошо, я нашел решение, которое намного проще и работает. Нет необходимости в BroadcastReceiver, я просто добавляю дополнительную информацию в свои намерения и читаю их в onNewIntent.

Мой код выглядит следующим образом:

public void onNewIntent(Intent intent) { 
    String action = intent.getStringExtra("_ACTION_"); 

    if(action != null) { 
     switch (action) { 
      case "STOP_RECORDING": onStopClick(); break; 
      case "PAUSE_RECORDING": onPauseClick(); break; 
      default: Log.i(T, "UNKNOWN ACTION IN NOTIFICATION INTENT"); 
     } 
    } 
} 

private void showNotification() { 
    int requestID = (int) System.currentTimeMillis(); 

    Intent stdIntent = new Intent(getApplicationContext(), MyActivity.class); 
    stdIntent.putExtra("_ACTION_", "test_dummy_value"); 
    stdIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), requestID, stdIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Intent intent1 = new Intent(getApplicationContext(), MyActivity.class); 
    intent1.setAction("STOP_RECORDING"); 
    intent1.putExtra("_ACTION_", "STOP_RECORDING"); 
    intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    PendingIntent stopIntent = PendingIntent.getActivity(getApplicationContext(), requestID, intent1, PendingIntent.FLAG_UPDATE_CURRENT); 

    Intent intent2 = new Intent(getApplicationContext(), MyActivity.class); 
    intent2.putExtra("_ACTION_", "PAUSE_RECORDING"); 
    intent2.setAction("PAUSE_RECORDING"); 
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    PendingIntent pauseIntent = PendingIntent.getActivity(getApplicationContext(), requestID, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder notificationBuilder; 

    notificationBuilder = new NotificationCompat.Builder(this); 
    // ... irrelevant code 
    notificationBuilder.addAction(R.drawable.ic_pause_white_48dp, "Pause", pauseIntent); 
    notificationBuilder.addAction(R.drawable.ic_stop_white_48dp, "Stop", stopIntent); 

    ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(this.notificationID, notificationBuilder.build()); 
} 

Может кто-нибудь сказать мне, если это лучший способ достичь своей цели? Я новичок в программировании на Android и хотел бы изучить его правильно :-)

Смежные вопросы