Sök…


Introduktion

En aktivitet representerar en enda skärm med ett användargränssnitt (UI) . En Android-app kan ha mer än en aktivitet, till exempel En e-post-app kan ha en aktivitet för att lista alla e-postmeddelanden, en annan aktivitet för att visa e-postinnehåll, ännu en aktivitet för att komponera ny e-post. Alla aktiviteter i en app arbetar tillsammans för att skapa perfekt användarupplevelse.

Syntax

  • void onCreate (Bundle sparadInstanceState) // Ringas när aktiviteten startar.

  • void onPostCreate (Bundle sparadInstanceState) // Anropas när aktivitetsstart är slutfört (efter onStart () och onRestoreInstanceState (Bundle) har kallats)).

  • void onStart () // Called after onCreate (Bundle) - eller efter onRestart () när aktiviteten hade stoppats, men visas nu igen för användaren.

  • void onResume () // Kallas efter onRestoreInstanceState (Bundle), onRestart () eller onPause () för att din aktivitet ska börja interagera med användaren.

  • void onPostResume () // Anropas när aktivitetsuppdateringen är klar (efter att onResume () har kallats).

  • void onRestart () // Kallas efter onStop () när den aktuella aktiviteten visas igen för användaren (användaren har navigerat tillbaka till den).

  • void onPause () // Kallas som en del av aktivitetslivscykeln när en aktivitet går i bakgrunden, men inte (ännu) har dödats.

  • void onStop () // Ringas när du inte längre är synlig för användaren.

  • void onDestroy () // Utför någon slutlig sanering innan en aktivitet förstörs.

  • void onNewIntent (Intent intention) // Detta krävs för aktiviteter som ställer startMode till "singleTop" i deras paket, eller om en klient använde flaggan FLAG_ACTIVITY_SINGLE_TOP när man ringer startActivity (Intent).

  • void onSaveInstanceState (Bundle outState) // Kallas för att hämta per-instansstillstånd från en aktivitet innan den dödas så att staten kan återställas i onCreate (Bundle) eller onRestoreInstanceState (Bundle) (den bunt som fylls med denna metod kommer att skickas till båda ).

  • void onRestoreInstanceState (Bundle sparadInstanceState) // Den här metoden kallas efter onStart () när aktiviteten återinitieras från ett tidigare sparat tillstånd, som ges här i SaveInstanceState.

parametrar

Parameter detaljer
Avsikt Kan användas med startActivity för att starta en aktivitet
Bunt En kartläggning från strängnycklar till olika paketvärden .
Sammanhang Gränssnitt till global information om en applikationsmiljö.

Anmärkningar

En aktivitet är en applikationskomponent som tillhandahåller en skärm som användare kan interagera med för att göra något, som att ringa telefonen, ta ett foto, skicka ett e-postmeddelande eller visa en karta. Varje aktivitet ges ett fönster för att rita sitt användargränssnitt. Fönstret fyller vanligtvis skärmen, men kan vara mindre än skärmen och flyta ovanpå andra fönster.

Uteslut en aktivitet från back-stack-historiken

Låt det finnas aktivitet B som kan öppnas, och kan ytterligare starta fler aktiviteter. Men användaren ska inte stöta på det när han navigerar tillbaka i uppgifter.

Aktivitet stack beteende

Den enklaste lösningen är att ställa attributet noHistory till att vara true för den <activity> -taggen i AndroidManifest.xml :

<activity
     android:name=".B"
     android:noHistory="true">

Samma beteende är också möjligt från kod om B samtal är finish() innan nästa aktivitet startar:

finish();
startActivity(new Intent(context, C.class));

Typisk användning av noHistory flaggan är med "Splash Screen" eller inloggningsaktiviteter.

Android Activity LifeCycle Explained

Anta en applikation med en MainActivity som kan ringa Nästa aktivitet med ett knappklick.

public class MainActivity extends AppCompatActivity {

    private final String LOG_TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(LOG_TAG, "calling onCreate from MainActivity");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "calling onStart from MainActivity");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "calling onResume  from MainActivity");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "calling onPause  from MainActivity");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "calling onStop  from MainActivity");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "calling onDestroy  from MainActivity");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "calling onRestart  from MainActivity");
    }
    public void toNextActivity(){
        Log.d(LOG_TAG, "calling Next Activity");
        Intent intent = new Intent(this, NextActivity.class);
        startActivity(intent);
    } }

och

public class NextActivity extends AppCompatActivity {
    private final String LOG_TAG = NextActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);
        Log.d(LOG_TAG, "calling onCreate from Next Activity");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "calling onStart from Next Activity");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "calling onResume  from Next Activity");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "calling onPause  from Next Activity");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "calling onStop  from Next Activity");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "calling onDestroy  from Next Activity");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "calling onRestart  from Next Activity");
    } }

När appen skapas först
D / MainActivity: call onCreate från MainActivity
D / MainActivity: anropar Starta från MainActivity
D / MainActivity: call onResume from MainActivity
kallas

När skärmen sover
08: 11: 03.142 D / MainActivity: call onPause from MainActivity
08: 11: 03.192 D / MainActivity: ringer på Stop från MainActivity
kallas. Och igen när det vaknar
08: 11: 55.922 D / MainActivity: call on Starta om från MainActivity
08: 11: 55.962 D / MainActivity: ringer på Starta från MainActivity
08: 11: 55.962 D / MainActivity: call onResume from MainActivity
kallas

Fall 1: När nästa aktivitet kallas från huvudaktivitet
D / MainActivity: anropar Next Activity
D / MainActivity: call onPause from MainActivity
D / NextActivity: call onCreate från Next Activity
D / NextActivity: ringa på Starta från Next Activity
D / NextActivity: call onResume from Next Activity
D / MainActivity: ringer på Stop från MainActivity

När du återvänder till huvudaktiviteten från nästa aktivitet med hjälp av tillbaka-knappen
D / NextActivity: call onPause from Next Activity
D / MainActivity: anropar omstart från MainActivity
D / MainActivity: anropar Starta från MainActivity
D / MainActivity: call onResume from MainActivity
D / NextActivity: ringer på Stop från Next Activity
D / NextActivity: anropar Destroy från Next Activity

Fall2: När aktivitet delvis är dold (När översiktsknappen trycks ned) eller När appen går till bakgrunden och en annan app döljer den helt
D / MainActivity: call onPause from MainActivity
D / MainActivity: ringer på Stop från MainActivity
och när appen är tillbaka i förgrunden redo att acceptera användaringångar,
D / MainActivity: anropar omstart från MainActivity
D / MainActivity: anropar Starta från MainActivity
D / MainActivity: call onResume from MainActivity
kallas

Fall3: När en aktivitet kallas för att uppfylla implicit avsikt och användaren har gjort ett urval. Till exempel när du trycker på delningsknappen och användaren måste välja en app i listan över visade applikationer
D / MainActivity: call onPause from MainActivity

Aktiviteten är synlig men inte aktiv nu. När valet är gjort och appen är aktiv
D / MainActivity: call onResume from MainActivity
kallas

Case4:
När appen dödas i bakgrunden (för att frigöra resurser för en annan förgrundsapp), kommer OnPause (för pre-honeycomb-enhet) eller onStop (för sedan honeycomb-enhet) att vara den sista som kallas innan appen avslutas.

onCreate och onDestroy kommer att kallas ytterst en gång varje gång applikationen körs. Men onPause, onStop, onRestart, onStart, onResume kanske kallas många gånger under livscykeln.

AktivitetsstartMode

Startläge definierar beteendet för ny eller befintlig aktivitet i uppgiften.
Det finns möjliga startlägen:

  • standard
  • singleTop
  • singleTask
  • SingleInstance

Det bör definieras i Android manifest i <activity/> element som android:launchMode attribut.

<activity
    android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"] />

Standard:

Standardvärde. Om detta läge ställs in skapas alltid ny aktivitet för varje ny avsikt. Så det är möjligt att få många aktiviteter av samma typ. Ny aktivitet kommer att placeras på toppen av uppgiften. Det finns en viss skillnad för olika Android-versioner: om aktivitet startar från en annan applikation, på androids <= 4.4 kommer den att placeras på samma uppgift som startprogram, men på> = 5.0 skapas en ny uppgift.

SingleTop:

Detta läge är nästan samma som standard . Många fall av singleTop-aktivitet kan skapas. Skillnaden är att om en förekomst av aktivitet redan finns på toppen av den aktuella stacken kommer onNewIntent() att anropas istället för att skapa en ny instans.

SingleTask:

Aktivitet med detta startläge kan endast ha en instans i systemet . Ny uppgift för aktivitet skapas om den inte finns. Annars flyttas uppgiften med aktivitet till front och onNewIntent kommer att anropas.

SingleInstance:

Det här läget liknar singleTask . Skillnaden är en uppgift som innehar en aktivitet med singleInstance kan bara ha denna aktivitet och inget mer. När singleInstance aktivitet skapar en annan aktivitet skapas en ny uppgift för att placera den aktiviteten.

Presenterar UI med setContentView

Aktivitetsklassen tar hand om att skapa ett fönster för dig där du kan placera ditt UI med setContentView .
Det finns tre setContentView metoder:

  • setContentView(int layoutResID) - Ställ in aktivitetsinnehållet från en layoutresurs.
  • setContentView(View view) - Ställ in aktivitetsinnehållet till en tydlig vy.
  • setContentView(View view, ViewGroup.LayoutParams params) - Ställ in aktivitetsinnehållet till en tydlig vy med tillhandahållna params.

När setContentView anropas placeras denna vy direkt i aktivitetens visningshierarki. Det kan i sig vara en komplex visningshierarki.


exempel

Ställ in innehåll från resursfilen:

Lägg till resursfil (main.xml i detta exempel) med visningshierarki:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello" /> 

</FrameLayout>

Ställ in det som innehåll i aktivitet:

public final class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // The resource will be inflated, 
        // adding all top-level views to the activity.
        setContentView(R.layout.main);
    }
}

Ställ in innehåll till en tydlig vy:

public final class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Creating view with container
        final FrameLayout root = new FrameLayout(this);
        final TextView text = new TextView(this);
        text.setText("Hello");
        root.addView(text);

        // Set container as content view
        setContentView(root);
    }
}

Rensa din nuvarande aktivitetsstapel och starta en ny aktivitet

Om du vill rensa din nuvarande aktivitetsstapel och starta en ny aktivitet (till exempel att logga ut från appen och starta en inloggningsaktivitet) verkar det finnas två tillvägagångssätt.

1. Mål (API> = 16)

Calling finishAffinity() från en aktivitet

2. Mål (11 <= API <16)

Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

Avsluta ansökan med undantag från Recents

Definiera först en ExitActivity i AndroidManifest.xml

<activity
        android:name="com.your_example_app.activities.ExitActivity"
        android:autoRemoveFromRecents="true"
        android:theme="@android:style/Theme.NoDisplay" />

Därefter ExitActivity-klassen

/**
 * Activity to exit Application without staying in the stack of last opened applications
 */
public class ExitActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Utils.hasLollipop()) {
            finishAndRemoveTask();
        } else if (Utils.hasJellyBean()) {
            finishAffinity();
        } else {
            finish();
        }
    }

   /**
    * Exit Application and Exclude from Recents
    *
    * @param context Context to use
    */
    public static void exitApplication(ApplicationContext context) {
        Intent intent = new Intent(context, ExitActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        context.startActivity(intent);
    }
}

Upp navigering för aktiviteter

Navigering android:parentActivityName="" görs i Android genom att lägga till android:parentActivityName="" i Manifest.xml till aktivitetstaggen. I grund och botten med denna tagg berättar du systemet om en aktivitets överordnade aktivitet.

Hur görs det?

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:name=".SkillSchoolApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".ui.activities.SplashActivity"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ui.activities.MainActivity" />
    <activity android:name=".ui.activities.HomeActivity"
     android:parentActivityName=".ui.activities.MainActivity/> // HERE I JUST TOLD THE SYSTEM THAT MainActivity is the parent of HomeActivity
</application>

När jag nu klickar på pilen i verktygsfältet i HomeActivity tar det mig tillbaka till överordnad aktivitet.

Java-kod

Här kommer jag att skriva rätt Java-kod som krävs för denna funktion.

public class HomeActivity extends AppCompatActivity {
    @BindView(R.id.toolbar)
    Toolbar toolbar;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ButterKnife.bind(this);
        //Since i am using custom tool bar i am setting refernce of that toolbar to Actionbar. If you are not using custom then you can simple leave this and move to next line
        setSupportActionBar(toolbar); 
        getSupportActionBar.setDisplayHomeAsUpEnabled(true); // this will show the back arrow in the tool bar.
}
}

Om du kör den här koden ser du när du trycker på tillbaka-knappen tar den tillbaka till MainActivity. För ytterligare förståelse av Up Navigation rekommenderar jag att du läser dokument

Du kan mer anpassa detta beteende efter dina behov genom att åsidosätta

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this); // Here you will write your logic for handling up navigation
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Enkel hack

Detta är en enkel hack som oftast används för att navigera till överordnad aktivitet om föräldern är i backstack. Genom att ringa onBackPressed() om id är lika med android.R.id.home

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case android.R.id.home:
                onBackPressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow