2012-09-14 12 views
5

Mam aplikację do quizów, która ma timer na całą gameaktywność, w której powinieneś odpowiedzieć na tyle pytań, ile możesz w wyznaczonych minutach.Aktywność nadal trwa po zakończeniu();

po zakończeniu przypisanych minut przeniesie Cię do aktywności związanej z wynikami który pokazuje twój wynik. Po naciśnięciu klawisza, utworzyłem okno dialogowe z ostrzeżeniem, które pyta, czy chcesz wrócić do głównego menu. Jeśli klikniesz "tak", strona powinna powrócić do głównego menu i zatrzymać/zabić działanie gry.

Po kliknięciu "tak", nastąpi powrót do menu głównego, ale gdy nadal znajdujesz się w dowolnym miejscu aplikacji, wyniki będą nadal wyświetlane z poprzedniej wersji gry, którą miałem. Może ja nie przedstawiłem naprawdę zakończył gameactivity .. Oto zegar iz powrotem prasa fragment z mojej działalności:

new CountDownTimer(seconds, 1000) { 
    public void onTick(long millisUntilFinished) { 
      timer.setText("Seconds left: " + millisUntilFinished/1000); 
    } 
    public void onFinish() { 
      Intent intent = new Intent(GameActivityAddition.this, Score.class); 
      intent.putExtra("totalscore", score); 
      intent.putExtra("numberquestions", rowId); 
      intent.putExtra("d", difficulty); 
      db.close(); 
      startActivity(intent); 
    } 
}.start(); 

@Override 
public void onBackPressed() { 
    AlertDialog.Builder abuilder = new Builder(GameActivityAddition.this); 
    abuilder.setMessage("Return to Main Menu?"); 
    abuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) { 
      Intent main = new Intent(GameActivityAddition.this, Main.class); 
      startActivity(main); 
      finish();   
     } 
    }); 
    abuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel();    
     } 
    }); 
    AlertDialog alert = abuilder.create(); 
    alert.show(); 
} 
+1

Być może dane, które ustawiłeś w działaniu wyniku, nie zostaną wyczyszczone po zakończeniu aktywności, co spowoduje wyświetlenie starszych danych podczas ponownego odwiedzania aktywności. – Hiral

+0

Nie przestajecie odliczać. – user996428

+0

Domyślam się, że zegar odliczający działa jak wątek, który działa nawet po wywołaniu funkcji finish(). Spróbuj dodać zmienną boolean do timera, aby kontrolować jej działanie. – Huang

Odpowiedz

1

nie ma gwarancji, że zakończenie() będzie natychmiast zamknąć bieżącej działalności (Jest września Androida).


aby rozwiązać ten problem spróbuj,


Hold odniesienie do timera (będziesz za pomocą tego, aby wyłączyć samowyzwalacz podczas urlopu użytkownika s obecny aktywny)

CountDownTimer resultTimer = new CountDownTimer(seconds, 1000) { 
    public void onTick(long millisUntilFinished) { 
      timer.setText("Seconds left: " + millisUntilFinished/1000); 
    } 
    public void onFinish() { 
      Intent intent = new Intent(GameActivityAddition.this, Score.class); 
      intent.putExtra("totalscore", score); 
      intent.putExtra("numberquestions", rowId); 
      intent.putExtra("d", difficulty); 
      db.close(); 
      startActivity(intent); 
    } 
}.start(); 


i onBackPressed() - zrezygnować z zegara w setPositiveButton zwrotnego,


@Override 
public void onBackPressed() { 
    AlertDialog.Builder abuilder = new Builder(GameActivityAddition.this); 
    abuilder.setMessage("Return to Main Menu?"); 
    abuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) { 
      resultTimer.cancel(); //Stop the timer 
      resultTimer = null; 
      Intent main = new Intent(GameActivityAddition.this, Main.class); 
      startActivity(main); 
      finish();   
     } 
    }); 
    abuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 

     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel();    
     } 
    }); 
    AlertDialog alert = abuilder.create(); 
    alert.show(); 
} 
+1

_ "Nie ma gwarancji, że funkcja finish() natychmiast zamknie bieżącą aktywność (jest to Android)." - To jest złe; gdy wywoływane jest 'finish()', działanie jest natychmiast kończone. Czym jest _nie_ zakończony, jest proces, w którym aktywność przeżyła. Wszystkie statyczne dane ustawione podczas działania pozostaną ustawione. –

+0

Moja zła, powinienem podać dodatkowe informacje.Nie ma gwarancji, że onDestroy działania zostanie wywołany natychmiast (nawet jeśli działanie zostanie całkowicie usunięte z ekranu), a pamięć zachowana nie tylko odpowiada statycznym danym. – 66CLSjY

+0

@ 66CLSjY - dziękuję za szczegółową odpowiedź. definitywnie to rozwiązałem! :) – omi0301

0

Wykończenie aktywność dominującą od aktywności dziecka można wdrożyć, uruchamiając działanie podrzędne przy użyciu startActivityForResult i zaimplementować funkcję onActivityResult w celu przetworzenia wyniku powrót przez aktywność dziecka. Przykład: Z ParentActivity, uruchom ChildActivity dla wyniku, używając startActivityForResult(). Następnie ustaw wynik, który poinformuje ParentActivity również o zakończeniu. Zakończ połączenie() w ChildActivity. Gdy ParentActivity odbierze ten wynik z ChildActivity, ParentActivity wywoła metodę finish() również na sobie. I tam możesz rozpocząć kolejną aktywność.

Dla kodu patrz: http://www.androidcompetencycenter.com/2009/03/tutorial-how-to-start-a-new-activity/

+0

Zrobiłem dokładnie to samo w mojej aplikacji, ale problem występuje, gdy naciśniesz przycisk Wstecz na aktywności dziecka, działanie zostanie wstrzymane, a onResume() s Aktywności nadrzędnej i jej fragmenty będą nazywane idealnie. Jednak 1. Aktywność zajmuje zbyt dużo czasu na wykończeniu i wygląda na to, że powieszono telefon. 2. Jeśli następnym razem pokażę jakikolwiek dialog, to nie zadziała, ponieważ Aktywność podrzędna jest nadal ich, ale nie jest widoczna .... Teraz, jeśli obrócę ekran lub przejdę do innego fragmentu na Zatrzymanie i na Przeszkodzie dziecka Aktywność jest nazywana a potem wszystko wydaje się normalne. – aProgrammer

1

Właściwość CountDownTimer jest, nawet ty zakończył działalność kontynuuje odliczanie. Jeśli chcesz to zatrzymać, wstaw countTimerVar.cancel(), gdy finish() i finish() oraz w pressBackButton.

Powiązane problemy