In mijn vorige bericht hoorde je dat Intents ons berichten van de ene Android-component naar de andere kon sturen. Welnu, een heel belangrijk soort component is een activiteit.
Activiteiten vormen een fundamenteel onderdeel van de ontwikkeling van Android-apps. En het is onmogelijk om activiteiten te begrijpen zonder hun levenscycli te begrijpen. In dit bericht leert u alles over de levenscyclus van de activiteit.
Een activiteit is een enkel scherm in Android. Het is als een venster in een desktop-app of een frame in een Java-programma. Met een activiteit kunt u al uw UI-componenten of widgets op het scherm plaatsen.
Het is belangrijk om te weten dat een activiteit een levenscyclus heeft: dat wil zeggen dat deze in een van verschillende toestanden kan zijn, afhankelijk van wat er met de app gebeurt en met de interactie van de gebruiker.
Laten we de levenscyclus van een Android-activiteit nader bekijken. Telkens wanneer de status Activiteit wordt gewijzigd, wordt een van de volgende levenscyclusmethoden aangeroepen in de klasse Activiteit.
onCreate ()
: Dit wordt genoemd wanneer de activiteit voor het eerst wordt geïnitialiseerd. U moet deze methode implementeren om elke initialisatie die specifiek is voor uw activiteit uit te voeren.
onStart ()
: Dit wordt de eerste keer dat de activiteit zichtbaar wordt voor de gebruiker, terwijl de activiteit zich klaarmaakt om naar de voorgrond te komen, interactief wordt. Zodra deze callback is voltooid, is de onResume ()
methode wordt aangeroepen.
onResume ()
: Wanneer de activiteit in deze toestand komt, begint deze te communiceren met de gebruiker. De activiteit gaat verder in deze toestand totdat er iets gebeurt dat focus opneemt vanuit de app of activiteit (zoals een inkomende oproep). Wanneer dit gebeurt, de onPause ()
methode wordt aangeroepen.
onPause ()
: Deze methode wordt gebruikt om bewerkingen te pauzeren die niet zouden moeten plaatsvinden wanneer de activiteit zich in de pauzestand bevindt. Een aanroep van deze methode geeft aan dat de gebruiker de app verlaat. In een muziekspeler-app zorgt een inkomende oproep ervoor dat de app bijvoorbeeld overschakelt naar een gepauzeerde status. Dit zou de momenteel spelende muziek moeten dempen of pauzeren. Wanneer de gebruiker terugkeert naar de app, de onResume ()
methode wordt aangeroepen.
onStop ()
: Deze methode wordt aangeroepen wanneer de activiteit niet langer zichtbaar is in de app. Dit kan bijvoorbeeld gebeuren wanneer een andere activiteit is geladen en het volledige scherm van het apparaat gebruikt. Wanneer deze methode wordt aangeroepen, wordt gezegd dat de activiteit in een stopstaat is. In deze staat belt het systeem de onRestart ()
om interactiviteit terug te brengen met Activiteit. Of het roept de onDestroy ()
methode om de activiteit te vernietigen.
onDestroy ()
: Dit wordt aangeroepen voordat de activiteit wordt vernietigd. Het systeem roept deze methode aan wanneer een gebruiker de activiteit beëindigt of omdat het systeem het proces dat de activiteit bevat tijdelijk opruimt om ruimte te besparen. Zorg ervoor dat u bronnen vrijmaakt die uw Activiteit heeft gemaakt in deze methode, anders heeft uw app een geheugenlek!
onRestart ()
: Dit wordt opgeroepen wanneer een activiteit opnieuw wordt gestart nadat deze was gestopt.
De meeste gebruikersinteracties met een app zorgen ervoor dat de actieve activiteit wordt gewijzigd. Dus een app schakelt tijdens activiteiten vele malen over tussen activiteiten.
Het is noodzakelijk om activiteiten aan elkaar te koppelen wanneer een activiteit een andere activiteit moet starten. Om een activiteit te starten, gebruik je startActivity ()
of startActivityForResult ()
. In beide gevallen moet je een intentie doorgeven.
startActivity ()
wordt gebruikt als de nieuw gestarte Activiteit geen resultaat hoeft te retourneren.
Het volgende codefragment laat zien hoe u een andere activiteit start met behulp van deze methode:
Intent intent = new Intent (this, SecondActivity.class); startActivity (intent);
U kunt ook acties uitvoeren, zoals het doorgeven van gegevens van de ene activiteit aan de andere. In dit geval wil uw huidige activiteit (de aanroepactiviteit) gegevens doorgeven aan een doelactiviteit. Dit is waar Intents van pas komen. Zie mijn vorige artikel voor meer informatie over het gebruik van intenties om een activiteit te starten.
startActivityForResult ()
wordt gebruikt om een andere activiteit te starten en verwacht gegevens terug te krijgen van de nieuw gestarte activiteit. Met andere woorden, gebruik dit wanneer u een resultaat van de doelactiviteit terug wilt krijgen naar de oproepactiviteit, bijv. als de doelactiviteit bepaalde gebruikersinformatie verzamelt in een modaal dialoogvenster.
U ontvangt het resultaat van de activiteit in de onActivityResult (int requestCode, int resultCode, Intent-gegevens)
methode. Het resultaat wordt als intentie geretourneerd.
Hier is een voorbeeld om te laten zien hoe het starten van een activiteit werkt.
Eerst maak je je Hoofdactiviteit
met uw onCreate ()
methode, een lay-outbestand en een aanvraagcode.
public class MainActivity breidt activiteit uit // Unieke aanvraagcode voor elke use case private static final int REQUEST_CODE_EXAMPLE = 0x9345; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);
In uw onCreate ()
methode, maakt u een nieuw exemplaar van een intentie om uw tweede activiteit te starten.
Wanneer je klaar bent om die activiteit te starten, bijvoorbeeld als reactie op een knopklik, bel je startActivityForResult ()
, die de nieuw gemaakte intentie en de aanvraagcode doorgeven.
// Maak een nieuw exemplaar van Intent om te starten SecondActivity final Intent intent = new Intent (this, SecondActivity.class); // Dit start SecondActivity met de aanvraagcode startActivityForResult (intent, REQUEST_CODE_EXAMPLE);
Toch, in jouw Hoofdactiviteit
, u moet gebeurtenissen met activiteitsresultaten afhandelen. Dit doe je door het onActivityResult ()
methode. Dit is hoe u het resultaat van de andere activiteit zult ontvangen.
Hier is hoe het eruit zou moeten zien:
// onActivityResult wordt alleen // genoemd als de andere activiteit eerder start met startActivityForResult @Override public void onActivityResult (int requestCode, int resultCode, Intent-gegevens) super.onActivityResult (requestCode, resultCode, data); // Eerst moeten we controleren of de requestCode overeenkomt met degene die we hebben gebruikt. if (requestCode == REQUEST_CODE_EXAMPLE) // De resultCode wordt ingesteld door de SecondActivity // Volgens afspraak RESULT_OK betekent dat wat // SecondActivity heeft gedaan, is gelukt als (resultCode == Activity.RESULT_OK) // Haal het resultaat op van de geretourneerde Intent final String resultaat = data.getStringExtra (SecondActivity.EXTRA_DATA); // Gebruik de gegevens - geef ze in dit geval in een Toast weer. Toast.makeText (dit, "Result:" + result, Toast.LENGTH_LONG) .show (); else // setResult is niet succesvol uitgevoerd door SecondActivity // Vanwege een fout of controle. Geen gegevens om op te halen.
Ga je gang en maak je eigen SecondActivity
. Het zou er ongeveer zo uit moeten zien als de onderstaande code.
@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_detail); laatste knop Button = (Button) findViewById (R.id.button); // Wanneer op deze knop wordt geklikt, willen we een result-knop retourneren.setOnClickListener (nieuwe View.OnClickListener () @Override public void onClick (View view) // Maak een nieuw Intent-object als container voor het uiteindelijke resultaat Intent-gegevens = new Intent (); // Voeg de vereiste gegevens toe die moeten worden teruggestuurd naar de MainActivity-gegevens.putExtra (EXTRA_DATA, "Enkele interessante gegevens!"); // Stel de resultCode in als Activiteit.RESULT_OK to // duiden op een succes en voeg de Intent toe // die onze resultaatgegevenssetResult (Activity.RESULT_OK, data) bevat; // Met finish () sluiten we de SecondActivity naar // return terug naar MainActivity-afwerking (););
Voordat een activiteit wordt beëindigd, worden de overeenkomstige levenscyclusmethoden aangeroepen.
De onPause ()
methode moet alle luisteraars en UI-updates stoppen. De onStop ()
methode moet de applicatiegegevens opslaan. eindelijk, de onDestroy ()
methode maakt bronnen vrij die de activiteit heeft toegewezen.
Wanneer de gebruiker terugschakelt naar een app die is beëindigd door het systeem, wordt de onResume ()
methode wordt genoemd. Op basis van opgeslagen gegevens kan het luisteraars opnieuw registreren en UI-updates activeren.
Een activiteit heeft een manier nodig om waardevolle status- en gebruikersgegevens te behouden die hij heeft verkregen. Deze gegevens kunnen worden verkregen via gebruikersinvoer of gecreëerd terwijl de activiteit niet op het scherm was.
Een verandering van de richting van het apparaat kan er bijvoorbeeld toe leiden dat een activiteit wordt vernietigd en opnieuw wordt gemaakt. In een dergelijk scenario moet u ervoor zorgen dat u alle activiteitenstatus opslaat voordat deze wordt vernietigd en laad deze opnieuw wanneer deze opnieuw wordt gemaakt. Anders kunnen alle gegevens die uw activiteit op dat moment heeft volledig verloren gaan.
Als u de activiteitsstatus wilt opslaan, kunt u deze overschrijven onSaveInstanceState ()
methode. Deze methode is doorgegeven a Bundel
object als een parameter. Een bundel kan tekenreeksen, primitieve gegevenstypen of objecten bevatten. Voeg in deze methode eenvoudig belangrijke staatsgegevens toe aan de bundel. Deze bundel wordt later teruggegeven aan de activiteit, zodat u de activiteitsstatus kunt herstellen.
Als u de opgeslagen status uit de bundel wilt halen en deze wilt terugzetten, implementeert u de onRestoreInstanceState ()
methode. Deze callback wordt opgeroepen tussen de onStart ()
en de onResume ()
lifecycle-methoden.
We zullen in een toekomstig artikel dieper ingaan op de status van Activiteitsinstantie.
Nadat je dit bericht hebt gevolgd, heb je een goed begrip van hoe een levenscyclus van een activiteit werkt. En je hebt geleerd dat er twee manieren zijn om een activiteit te starten en dat je een aantal aanwijzingen krijgt over hoe instantiestatus wordt behandeld in de levenscyclus van een activiteit.
Bedankt voor het lezen en kijk terwijl u hier bent naar enkele van onze andere berichten over het coderen van Android-apps.