14

Mam aplikację, która wysyła powiadomienia, które po wybraniu rozpoczynają działanie. Zgodnie z dokumentami systemu Android mogę używać NavUtils.shouldUpRecreateTask, aby sprawdzić, czy aktywność została uruchomiona bezpośrednio (tj. Od powiadomienia) lub przez zwykły stos działań. Jednak daje złą odpowiedź. Testuję to na JellyBean, ale korzystając z biblioteki wsparcia.NavUtils.shouldUpRecreateTask kończy się niepowodzeniem w przypadku JellyBean

Zasadniczo funkcja shouldUpRecreateTask zawsze zwraca wartość false, nawet jeśli działanie zostało uruchomione z powiadomienia.

Jakieś pomysły na pytanie, dlaczego funkcja Nie należy ponawiać odpowiedzi nieprawidłowej?

+0

Cześć Clyde, czy shouldUpRecreateTask pracuje dla Ciebie przed galaretką? Zawsze otrzymuję fałszywe informacje na temat emulatora, niezależnie od tego, czy zabiłem aplikację tuż przed otwarciem powiadomienia. – Maragues

+0

W rzeczywistości mam dokładnie ten sam problem. AFAIK, wygląda na to, że jest zepsuty. –

+0

Zobacz http://stackoverflow.com/questions/14602283/up-navigation-broken-on-jellybean – riwnodennyk

Odpowiedz

5

Nadal nie wiem, dlaczego shouldPrepRecreateTask nie powiedzie się - spojrzenie na kod źródłowy nie pomaga. Ale rozwiązanie jest dość proste - po prostu dodaję dodatkową wartość flagi do zamiaru dołączonego do powiadomienia i zaznacz to w onCreate(). Jeśli jest ustawiony, to działanie zostało wywołane z powiadomienia, więc tylny stos musi zostać odtworzony.

Kod wygląda następująco:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle b = getIntent().getExtras(); 
    fromNotification = b.getInt("fromNotification") == 1; 
    setContentView(R.layout.threadlist); 
} 

@Override 
public boolean onHomeButtonPressed() { 
    if(fromNotification) { 
     // This activity is not part of the application's task, so create a new task 
     // with a synthesized back stack. 
     TaskStackBuilder tsb = TaskStackBuilder.from(this) 
       .addNextIntent(new Intent(this, COPAme.class)); 
     tsb.startActivities(); 
    } 
     // Otherwise, This activity is part of the application's task, so simply 
     // navigate up to the hierarchical parent activity. 
    finish(); 
    return true; 
} 
+1

to nie pomoże, zniszczylibyśmy prawdziwy backstack na wypadek, gdybyśmy już używali aplikacji. Jest ok, jeśli nasza aplikacja została zamknięta. – Maragues

+0

@Maragues Jeśli działanie jest już otwarte, to onCreate nie jest wywoływane - na nowo jest wywoływana funkcjaNewIntent, więc odNotification nie jest ustawiona, więc tylny stos pozostaje nienaruszony. Jeśli działanie nie jest otwarte, to niszczenie istniejącego tylnego stosu jest dokładnie tym, czego chcę. – Clyde

+0

dlaczego używać getInt ("fromNotification") == 1, jeśli możesz użyć czegoś takiego jak getBoolean ("fromNotification", false)? – ademar111190

4

nie jest to poprawne! Kiedy zacząć od zgłoszenia trzeba utworzyć stos podczas budowania zgłoszenie wyjaśnione tutaj: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

Dlatego podczas tworzenia zawiadomienia będziesz musiał to zrobić:

Intent resultIntent = new Intent(this, ResultActivity.class); 
// ResultActivity is the activity you'll land on, of course 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
// make sure that in the manifest ResultActivity has parent specified!!! 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

a następnie po kliknij przycisk UP, aby uzyskać standardowy kod, który jest:

if (NavUtils.shouldUpRecreateTask(this, intent)) { 
    // This activity is NOT part of this app's task, so 
    // create a new task when navigating up, with a 
    // synthesized back stack. 
    TaskStackBuilder.create(this) 
    // Add all of this activity's parents to the back stack 
      .addNextIntentWithParentStack(intent) 
      // Navigate up to the closest parent 
      .startActivities(); 
} else { 
    NavUtils.navigateUpTo(this, intent); 
} 

To działa idealnie dla mnie.

+0

+1, wydaje mi się to najlepszą/najbardziej poprawną odpowiedzią dla mnie. Dzięki. – akent

+1

TaskStackBuilder.getPendingIntent ustawi flagę FLAG_ACTIVITY_CLEAR_TASK na intent, co spowoduje, że funkcja onNewIntent() NIE WYWOŁA SIĘ, OCZEKIWANI powyżej 2.3. więc w mojej opinii zapomnij o TaskStackBuilder, zamiast tego użyj zwykłego PendingIntent. – jiashie

3

Miałem ten sam problem co OP. NavUtils.shouldUpRecreateTask zawsze wydawał się zwracać fałsz. (JellyBean również) Użyłem następujących osiągnąć tę samą funkcjonalność.

case android.R.id.home: 
Intent upIntent = new Intent(this,ParentActivity.class); 
upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(upIntent); 
finish(); 
return true; 

W ten sposób można uzyskać "rodzicielską" intencję zamiast twardego kodowania.

Intent upIntent = NavUtils.getParentActivityIntent(this); 
Powiązane problemy