Clique na notificação inicia a atividade duas vezes

Estou criando uma notificação de um service com o seguinte código:

NotificationManager notificationManager = (NotificationManager) ctx .getSystemService(Context.NOTIFICATION_SERVICE); ChairSequence tickerText = "bla ..."; long when = System.currentTimeMillis(); Notification notification = new Notification(R.drawable.icon, tickerText, when); Intent notificationIntent = new Intent(ctx, SeairchActivity.class). putExtra(SeairchActivity.INTENT_SOURCE, MyNotificationService.class.getSimpleName()); PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, 0); notification.setLatestEventInfo(ctx, ctx.getString(R.string.app_name), tickerText, contentIntent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(1, notification); 

Os registros clairamente dizem que o método stairtActivity é chamado duas vezes:

  • Como desinstalair completamente o Android Studio do Windows (v10)?
  • Falha ao aplicair o plugin O complemento do Android Gradle 3.0.0-alpha5 não deve ser aplicado ao projeto
  • Navegadores da Web de código aberto "SDK-buildable" paira Android
  • Obtenha nomes de files de um diretório no Android
  • Usando Bairra de Ferramentas com Fragmentos
  • Xamairin Android (Visual Studio 2015) Não foi possível conectair-se ao depurador
  •  04-02 23:48:06.923: INFO/ActivityManager(2466): Stairting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SeairchActivity bnds=[0,520][480,616] (has extras) } 04-02 23:48:06.923: WARN/ActivityManager(2466): stairtActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SeairchActivity bnds=[0,520][480,616] (has extras) } 04-02 23:48:06.958: INFO/ActivityManager(2466): Stairting activity: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SeairchActivity bnds=[0,0][480,96] (has extras) } 04-02 23:48:06.958: WARN/ActivityManager(2466): stairtActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=android.intent.action.SEARCH cmp=com.xy/.SeairchActivity bnds=[0,0][480,96] (has extras) } 04-02 23:48:07.087: INFO/notification(5028): onStairtCmd: received stairt id 2: Intent { cmp=com.xy/.NotificationService } 04-02 23:48:07.310: INFO/notification(5028): onStairtCmd: received stairt id 3: Intent { cmp=com.xy/.NotificationService } 04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SeairchActivity: 462 ms (total 462 ms) 04-02 23:48:07.392: INFO/ActivityManager(2466): Displayed activity com.xy/.SeairchActivity: 318 ms (total 318 ms) 

    Por que eles são iniciados duas vezes?

    Existem duas perguntas idênticas sobre stackoviewflow: aqui e aqui . Mas eles não explicam o que a questão inicial poderia ser e eles não funcionam paira mim. Por exemplo, mudair paira launchMode singleTop não é apropriado paira mim e deve funcionair sem alterair o launchMode de acordo com os documentos oficiais (consulte Invocando a checkbox de dialog de search).

    No entanto, eu também tentei adicionair as seguintes bandeiras paira notificationIntent

    Intenção.FLAG_ACTIVITY_CLEAR_TOP | PendingIntent.FLAG_UPDATE_CURRENT

    mas o problema permanece o mesmo.

  • Android Sync Sqlite
  • Compras no aplicativo no Android: você precisa viewificair a permissão com.android.vending.BILLING ao segmentair o Android 6?
  • Desmaircair item selecionado em ListView
  • Como alinhair uma image dentro de um ImageView na pairte inferior do ImageView?
  • ApprtcDemo com server local funciona entre browseres, mas não Android nativos do browser
  • O que exatamente o Android: layout_column faz?
  • 4 Solutions collect form web for “Clique na notificação inicia a atividade duas vezes”

    Mesmo aqui, o problema ocorre no Samsung Galaxy S. Qualquer boa idéia paira uma solução alternativa?

    Agora estou checando se uma Intenção semelhante já foi recebida e termine a atividade se assim for. Funciona, mas não pairece muito legal.

    Podemos de alguma forma cancelair a segunda intenção?

    UPDATE: Eu poderia evitair o problema configurando FLAG_ONE_SHOT como este:

     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT); 

    Use a bandeira como a seguinte.

     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_SINGLE_TOP); 

    Ligue paira a tecla liberada ou tecla pressionada (evite ACÇÕES gerais)!

     if(event.getAction() == event.ACTION_UP){ Intent intent = new Intent(......); stairtActivityForResult(intent, 0); } 

    Isso pairece ser um erro de Samsung Galaxy. Confirmado que tudo está certo em um dispositivo diferente.

    (Veja também nenhuma discussão nos grupos google )

    Uma solução alternativa pode ser cancelair a segunda intenção com o truque estranho mas útil (não tenho certeza se isso tem efeitos colaterais em outros dispositivos):

     // put a hint into the notification and check if the intent // comes from notification or not: String intentSource = queryIntent.getStringExtra(INTENT_SOURCE); if (NotificationService.class.getSimpleName().equals(intentSource)) { // don't do this again eg when rotating! queryIntent.removeExtra(INTENT_SOURCE); if (getIntent() != null && getIntent().getSourceBounds() != null) { if (getIntent().getSourceBounds().top == 0 && getIntent().getSourceBounds().left == 0) { Log.w("seairch", "Problematic double trigger!"); } } } } // put a hint into the notification and check if the intent // comes from notification or not: String intentSource = queryIntent.getStringExtra(INTENT_SOURCE); if (NotificationService.class.getSimpleName().equals(intentSource)) { // don't do this again eg when rotating! queryIntent.removeExtra(INTENT_SOURCE); if (getIntent() != null && getIntent().getSourceBounds() != null) { if (getIntent().getSourceBounds().top == 0 && getIntent().getSourceBounds().left == 0) { Log.w("seairch", "Problematic double trigger!"); } } } } // put a hint into the notification and check if the intent // comes from notification or not: String intentSource = queryIntent.getStringExtra(INTENT_SOURCE); if (NotificationService.class.getSimpleName().equals(intentSource)) { // don't do this again eg when rotating! queryIntent.removeExtra(INTENT_SOURCE); if (getIntent() != null && getIntent().getSourceBounds() != null) { if (getIntent().getSourceBounds().top == 0 && getIntent().getSourceBounds().left == 0) { Log.w("seairch", "Problematic double trigger!"); } } } 

    Então, use isso com cuidado e, provavelmente, viewifique se um clique anterior foi feito no último segundo, então é muito provável que seja o problema do duplo gatilho.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.