Szukaj…


Wprowadzenie

Działanie reprezentuje pojedynczy ekran z interfejsem użytkownika (UI) . Aplikacja na Androida może mieć więcej niż jedną Aktywność, na przykład Aplikacja poczty e-mail może mieć jedną aktywność, aby wyświetlić listę wszystkich wiadomości e-mail, inną aktywność, aby wyświetlić zawartość wiadomości e-mail, jeszcze inną aktywność, aby utworzyć nową wiadomość e-mail. Wszystkie działania w aplikacji współdziałają ze sobą, tworząc doskonałe wrażenia użytkownika.

Składnia

  • void onCreate (Bundle saveInstanceState) // Wywoływany podczas rozpoczynania działania.

  • void onPostCreate (pakiet saveInstanceState) // Wywoływany, gdy uruchamianie aktywności jest zakończone (po wywołaniu onStart () i onRestoreInstanceState (pakiet)).

  • void onStart () // Wywoływany po onCreate (pakiet) - lub po onRestart (), gdy aktywność została zatrzymana, ale teraz jest ponownie wyświetlana użytkownikowi.

  • void onResume () // Wywoływany po onRestoreInstanceState (pakiet), onRestart () lub onPause (), aby Twoja aktywność zaczęła wchodzić w interakcje z użytkownikiem.

  • void onPostResume () // Wywoływany, gdy wznawianie aktywności jest zakończone (po wywołaniu onResume ()).

  • void onRestart () // Wywoływany po onStop (), gdy bieżąca aktywność jest ponownie wyświetlana użytkownikowi (użytkownik powrócił do niego).

  • void onPause () // Wywoływany jako część cyklu życia działania, gdy działanie przechodzi w tło, ale nie zostało (jeszcze) zabite.

  • void onStop () // Wywoływany, gdy użytkownik nie jest już widoczny dla użytkownika.

  • void onDestroy () // Wykonaj końcowe czyszczenie przed zniszczeniem działania.

  • void onNewIntent (Intent intent) // Jest to wywoływane dla działań, które ustawiają launchMode na „singleTop” w swoim pakiecie lub jeśli klient użył flagi FLAG_ACTIVITY_SINGLE_TOP podczas wywoływania startActivity (Intent).

  • void onSaveInstanceState (pakiet outState) // Wywoływany w celu odzyskania stanu instancji z działania przed zabiciem, aby stan mógł zostać przywrócony w onCreate (pakiet) lub onRestoreInstanceState (pakiet) (pakiet wypełniony tą metodą zostanie przekazany do obu ).

  • void onRestoreInstanceState (pakiet saveInstanceState) // Ta metoda jest wywoływana po onStart (), gdy aktywność jest ponownie inicjowana z wcześniej zapisanego stanu, podanego tutaj w saveInstanceState.

Parametry

Parametr Detale
Zamiar Może być używany z startActivity do uruchomienia działania
Pakiet Odwzorowanie kluczy String na różne wartości Parcelable .
Kontekst Interfejs do globalnych informacji o środowisku aplikacji.

Uwagi

Aktywność to składnik aplikacji, który zapewnia ekran, z którym użytkownicy mogą wchodzić w interakcje w celu wykonania czynności, takich jak wybranie telefonu, zrobienie zdjęcia, wysłanie wiadomości e-mail lub wyświetlenie mapy. Każde działanie ma okno, w którym można narysować interfejs użytkownika. Okno zwykle wypełnia ekran, ale może być mniejsze niż ekran i unosić się nad innymi oknami.

Wyklucz aktywność z historii stosu

Niech pojawi się działanie B które można otworzyć, i może ono dalej uruchamiać więcej działań. Ale użytkownik nie powinien się z tym spotykać podczas powrotu do czynności.

Zachowanie stosu aktywności

Najprostszym rozwiązaniem jest ustawienie atrybutu noHistory na true dla tego <activity> w AndroidManifest.xml :

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

To samo zachowanie jest również możliwe z kodu, jeśli wywołania B finish() przed rozpoczęciem następnego działania:

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

Typowe użycie flagi noHistory dotyczy „ekranu powitalnego” lub działań związanych z logowaniem.

Wyjaśnienie cyklu życia systemu Android

Załóżmy aplikację z funkcją MainActivity, która może wywoływać następne działanie za pomocą kliknięcia przycisku.

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);
    } }

i

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");
    } }

Kiedy aplikacja jest tworzona po raz pierwszy
D / MainActivity: wywoływanie onCreate z MainActivity
D / MainActivity: wywołanie onStart z MainActivity
D / MainActivity: wywoływanieResume z MainActivity
są nazywane

Kiedy ekran śpi
08: 11: 03.142 D / MainActivity: wywoływaniePauza z MainActivity
08: 11: 03.192 D / MainActivity: wywołanie onStop z MainActivity
są nazywane. I znowu, gdy się budzi
08: 11: 55.922 D / MainActivity: wywoływanie Uruchom ponownie z MainActivity
08: 11: 55.962 D / MainActivity: wywołanie onStart z MainActivity
08: 11: 55.962 D / MainActivity: wywoływanie Resume z MainActivity
są nazywane

Przypadek 1: Po wywołaniu następnego działania z działania głównego
D / MainActivity: wywołanie następnego działania
D / MainActivity: wywołanie onPause z MainActivity
D / NextActivity: wywoływanie onCreate z następnego działania
D / NextActivity: wywołanie onStart z następnego działania
D / NextActivity: wywołanie OnResume z Next Activity
D / MainActivity: wywołanie onStop z MainActivity

Podczas powrotu do głównego działania z następnego działania za pomocą przycisku wstecz
D / NextActivity: wywołanie onPause od następnego działania
D / MainActivity: wywoływanie Uruchom ponownie z MainActivity
D / MainActivity: wywołanie onStart z MainActivity
D / MainActivity: wywoływanieResume z MainActivity
D / NextActivity: wywoływanie onStop z następnego działania
D / NextActivity: wywoływanieDestroy z następnego działania

Przypadek 2: Gdy działanie jest częściowo zasłonięte (po naciśnięciu przycisku przeglądu) lub gdy aplikacja przechodzi w tło, a inna aplikacja całkowicie ją zasłania
D / MainActivity: wywołanie onPause z MainActivity
D / MainActivity: wywołanie onStop z MainActivity
a gdy aplikacja powróci na pierwszy plan i będzie mogła akceptować dane wprowadzane przez użytkownika,
D / MainActivity: wywoływanie Uruchom ponownie z MainActivity
D / MainActivity: wywołanie onStart z MainActivity
D / MainActivity: wywoływanieResume z MainActivity
są nazywane

Przypadek 3: Gdy działanie jest wywoływane w celu spełnienia ukrytych zamiarów, a użytkownik dokonał wyboru. Na przykład, gdy przycisk udostępniania jest wciśnięty, a użytkownik musi wybrać aplikację z wyświetlonej listy aplikacji
D / MainActivity: wywołanie onPause z MainActivity

Aktywność jest widoczna, ale teraz nieaktywna. Po dokonaniu wyboru i uruchomieniu aplikacji
D / MainActivity: wywoływanieResume z MainActivity
jest nazywany

Przypadek 4:
Gdy aplikacja zostanie zabita w tle (aby zwolnić zasoby dla innej aplikacji na pierwszym planie), onPause (dla urządzenia o strukturze plastra miodu) lub onStop (od urządzenia o strukturze plastra miodu) będą wywoływane jako ostatnie, zanim aplikacja zostanie zakończona.

Programy onCreate i onDestroy będą wywoływane jako najwyższe po każdym uruchomieniu aplikacji. Ale onPause, onStop, onRestart, onStart, onResume może być wywoływany wiele razy podczas cyklu życia.

Uruchomienie trybu

Tryb uruchamiania określa zachowanie nowej lub istniejącej aktywności w zadaniu.
Możliwe są tryby uruchamiania:

  • standard
  • singleTop
  • singleTask
  • pojedyncza instancja

Powinien zostać zdefiniowany w manifeście Androida w elemencie <activity/> jako atrybut android:launchMode .

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

Standard:

Domyślna wartość. Jeśli ten tryb zostanie ustawiony, nowe działanie będzie zawsze tworzone dla każdego nowego zamiaru. Możliwe jest uzyskanie wielu działań tego samego typu. Nowa aktywność zostanie umieszczona na górze zadania. Istnieje pewna różnica dla różnych wersji Androida: jeśli aktywność rozpoczyna się od innej aplikacji, na androidach <= 4.4 zostanie ona umieszczona na tym samym zadaniu co aplikacja startowa, ale na> = 5.0 zostanie utworzone nowe zadanie.

SingleTop:

Ten tryb jest prawie taki sam jak standard . Można utworzyć wiele instancji działania singleTop. Różnica polega na tym, że jeśli instancja działania już istnieje na górze bieżącego stosu, onNewIntent() zostanie wywołany zamiast tworzenia nowej instancji.

SingleTask:

Aktywność w tym trybie uruchamiania może mieć tylko jedną instancję w systemie . Nowe zadanie dla działania zostanie utworzone, jeśli nie istnieje. W przeciwnym razie zadanie z działaniem zostanie przeniesione na przód i onNewIntent zostanie polecenie onNewIntent .

Pojedyncza instancja:

Ten tryb jest podobny do singleTask . Różnica polega na tym, że zadanie, które posiada działanie z singleInstance może mieć tylko to działanie i nic więcej. Gdy działanie singleInstance utworzy inne działanie, zostanie utworzone nowe zadanie w celu umieszczenia tego działania.

Prezentowanie interfejsu użytkownika za pomocą setContentView

Klasa aktywności zajmuje się tworzeniem dla ciebie okna, w którym możesz umieścić swój interfejs użytkownika za pomocą setContentView .
Istnieją trzy metody setContentView :

  • setContentView(int layoutResID) - Ustaw zawartość aktywności z zasobu układu.
  • setContentView(View view) - Ustaw zawartość aktywności na jawny widok.
  • setContentView(View view, ViewGroup.LayoutParams params) - Ustaw zawartość aktywności na jawny widok z podanymi parametrami.

Po setContentView ten widok jest umieszczany bezpośrednio w hierarchii widoków działania. Sama może być złożoną hierarchią widoków.


Przykłady

Ustaw zawartość z pliku zasobów:

Dodaj plik zasobów (main.xml w tym przykładzie) z hierarchią widoku:
<?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>

Ustaw jako treść w działaniu:

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);
    }
}

Ustaw treść w jawnym widoku:

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);
    }
}

Wyczyść swój obecny stos działań i uruchom nowe działanie

Jeśli chcesz wyczyścić swój aktualny stos działań i uruchomić nowe działanie (na przykład wylogowanie z aplikacji i uruchomienie działania logowania), wydaje się, że istnieją dwa podejścia.

1. Cel (API> = 16)

Wywołanie finishAffinity() z działania

2. Cel (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();

Zakończ aplikację z wyłączeniem z ostatnich

Najpierw zdefiniuj ExitActivity w AndroidManifest.xml

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

Następnie klasa ExitActivity

/**
 * 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);
    }
}

Nawigacja aktywności

Nawigacja w górę odbywa się w android:parentActivityName="" poprzez dodanie android:parentActivityName="" w Manifest.xml do tagu aktywności. Zasadniczo za pomocą tego znacznika informujesz system o aktywności nadrzędnej działania.

Jak to jest zrobione?

<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>

Teraz, gdy kliknę strzałkę na pasku narzędzi HomeActivity, zabiorę mnie z powrotem do działania nadrzędnego.

Kod Java

Tutaj napiszę odpowiedni kod Java wymagany dla tej funkcjonalności.

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.
}
}

Jeśli uruchomisz ten kod, zobaczysz, kiedy naciśniesz przycisk Wstecz, przeniesie Cię z powrotem do MainActivity. Aby lepiej zrozumieć nawigację w górę, polecam czytanie dokumentów

Możesz bardziej dostosować to zachowanie do własnych potrzeb, zastępując

@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);
}

Prosty hack

Jest to prosty hack, który jest najczęściej używany do nawigacji do aktywności rodzica, jeśli rodzic jest w odwrocie. Przez wywołanie onBackPressed() jeśli id jest równy 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow