2015-05-01 13 views
13

La nostra app ha notifiche diverse che possono aprire diverse attività. Quindi abbiamo creato lo schema URI per farlo. Le notifiche vengono ricevute e aprono le attività corrette. Creo lo stack per la navigazione corretta con il seguente codice:Android 4.1.1 Crea stack per attività quando si riceve una notifica con URI

Intent intent = new Intent(Intent.ACTION_DEFAULT, Uri.parse(uri)); 

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addNextIntentWithParentStack(intent); 

PendingIntent contentIntent = 
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
Notification.Builder mBuilder = new Notification.Builder(context); 
mNotifM.notify(NotificationId.getID(), mBuilder.setStyle(new Notification.BigTextStyle(mBuilder) 
      .bigText(bigText) 
      .setBigContentTitle(title) 
      .setSummaryText(summaryText)) 
      .setContentTitle(title) 
      .setSmallIcon(R.drawable.udechile_launcher) 
      .setContentText(summaryText) 
      .setAutoCancel(true) 
      .setContentIntent(contentIntent) 
      .setTicker(bigText) 
      .build()); 

Il problema è che in Android 4.1.1 che il codice per ricreare la pila non funziona correttamente. L'unico modo che ha reso il lavoro è referecing della classe invece del uri quando si crea l'intento:

intent = new Intent(context, MatchDetail.class); 

Il problema di questo è che dovrò fare uno switch-case per ogni uri per essere in grado di creare l'intento con ogni classe. In primo luogo, ciò sconfigge lo scopo dell'URI. Anche se in futuro ho bisogno di aggiungere un nuovo Push Target non è solo aggiungendo l'URI in AndroidManifest.xml Devo aggiungere un nuovo caso nello switch del Push Notifier Receiver.

Qualcuno sa come farlo funzionare su Android 4.1.1 con URI?

Estratto di manifesto:

<activity 
     android:name=".controller.MatchDetail" 
     android:label="@string/title_activity_match_detail" 
     android:parentActivityName=".controller.MainActivity" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".controller.MainActivity" /> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE"/> 
      <data android:scheme="scheme" android:host="base" android:path="/name" /> 
     </intent-filter> 
    </activity> 
+0

Cosa vi impedisce di utilizzare il codice a API precedenti? Stai dicendo il 'nuovo Intento (Intent.ACTION_DEFAULT, Uri.parse (uri));' non funziona o hai un problema con il resto del codice? – ianhanniballake

+0

L'uri ha funzionato ma quando torno indietro l'app si chiude con 4.1.1 e funziona con android> 4.2.2. Stesso codice – Franklin

+0

Supponendo che si stia utilizzando la versione della libreria di supporto di [TaskStackBuilder] (http://developer.android.com/reference/android/support/v4/app/TaskStackBuilder.html), non c'è nulla di diverso da Android 3.0+ su come lo stack genitore è in fase di costruzione che farebbe sì che 4.1.1 funzioni diversamente dalla 4.2.2. Puoi includere la voce manifest dell'attività per una delle attività che non funziona? – ianhanniballake

risposta

1

non l'ho ancora provato questo, ma questo potrebbe risolvere il tuo problema:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addParentStack(Class.forName(intent.getComponent().getClassName())); 
stackBuilder.addNextIntent(intent); 

Se questo non funziona, provate questo:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addNextIntent(context, Class.forName(intent.getComponent().getClassName())); 
stackBuilder.addNextIntent(intent); 

anche un altro per provare:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addNextIntentWithParentStack(new Intent(context, Class.forName(intent.getComponent().getClassName()))); 

Modifica

trovato un nuovo modo che potrebbe funzionare, si spera

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); 
stackBuilder.addParentStack(new ComponentName(context, Class.forName(intent.getComponent().getClassName()))); 
stackBuilder.addNextIntent(intent); 
+0

Nessuna delle tre soluzioni ha funzionato. Ha senso perché non impostiamo mai il componente. La documentazione dice: "Recupera il componente concreto associato all'intento.Quando ricevi un intento, questo è il componente che è stato trovato per gestirlo al meglio (cioè tu stesso) e sarà sempre non nullo; * in tutti gli altri casi sarà nullo se non impostato in modo esplicito. * " – Franklin

+0

@Franklin Non so se questo funzionerà, ma ho aggiunto un'altra risposta che si spera funzionerà. Sto solo cercando di trovare un altro modo per ottenere il genitore da un 'Intento'. –

+0

Il problema è quando facciamo: intent.getComponent. Questo è nullo perché non creiamo questo componente. – Franklin

Problemi correlati