2015-05-01 8 views
13

Nasza aplikacja zawiera różne powiadomienia, które mogą otwierać różne czynności. Dlatego stworzyliśmy schemat URI, aby to zrobić. Powiadomienia są odbierane i otwierane prawidłowe działania. Tworzę stos dla prawidłowej nawigacji z następującego kodu:Android 4.1.1 Tworzenie stosu dla aktywności po otrzymaniu powiadomienia o identyfikatorze 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()); 

Problem polega na tym, że w Androidzie 4.1.1 tego kodu, aby odtworzyć cały stos nie działa prawidłowo. Jedynym sposobem, zrobiłem to praca referecing klasę zamiast URI podczas tworzenia zamiar:

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

Problem z tym jest to, że będę musiał zrobić przełącznik indywidualnie dla każdego uri, aby móc tworzyć zamiar z każdą klasą. To przede wszystkim pokonuje cel URI. Również jeśli w przyszłości muszę dodać nowy Push Target, to nie tylko dodawanie URI w AndroidManifest.xml Muszę dodać nową skrzynkę w przełączniku Push Notification Receiver.

Czy ktoś wie, jak zrobić to w Androidzie 4.1.1 z identyfikatorami URI?

Extract oczywistego:

<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

Co powstrzymuje cię przed użyciem kodu na poprzednich API? Czy mówisz, że "nowe intencje (Intent.ACTION_DEFAULT, Uri.parse (uri));" nie działają lub masz problem z resztą kodu? – ianhanniballake

+0

Uri działało, ale kiedy wróciłem, aplikacja zamknęła się 4.1.1 i działa z Androidem 4.2.2. Ten sam kod: – Franklin

+0

Zakładając, że korzystasz z wersji SupportStackBuilder (http://developer.android.com/reference/android/support/v4/app/TaskStackBuilder.html) w wersji Support Library, nie ma w niej nic odmiennego od systemu Android 3.0+ budowany jest stos rodzica, który powodowałby, że 4.1.1 działa inaczej niż w wersji 4.2.2. Czy możesz dołączyć wpis manifestu działania dla jednej z działań, która nie działa? – ianhanniballake

Odpowiedz

1

nie próbowałem tego jeszcze, ale to mogłoby rozwiązać problem:

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

Jeśli to nie zadziała, spróbuj tego:

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

Również jeszcze jeden do wypróbowania:

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

Edit

znaleźli nowy sposób, że może pracować, miejmy nadzieję

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

Żadne z tych trzech rozwiązań nie zadziałało. Ma to sens, ponieważ nigdy nie ustawiamy komponentu. Dokumentacja mówi: "Odzyskaj konkretny komponent związany z intencją." Po otrzymaniu intencji jest to komponent, który został znaleziony, aby najlepiej sobie z nim poradzić (to znaczy samemu) i zawsze będzie miał wartość inną niż null; * we wszystkich innych przypadkach będzie null, chyba że zostanie wyraźnie ustawiony. * " – Franklin

+0

@Franklin Nie wiem, czy to zadziała, ale dodałem kolejną odpowiedź, która, mam nadzieję, zadziała. Po prostu próbuję znaleźć inny sposób, aby uzyskać rodzica z "Intencji". –

+0

Problem polega na tym, że robimy: intent.getComponent. Jest to wartość null, ponieważ nie tworzymy tego komponentu. – Franklin

Powiązane problemy