수색…


소개

활동은 사용자 인터페이스 (UI)가 있는 단일 화면을 나타냅니다. Android 앱에는 둘 이상의 활동이있을 수 있습니다 (예 : 이메일 앱은 모든 이메일을 나열하는 활동 하나, 이메일 내용을 표시하는 또 다른 활동, 새 이메일 작성 활동)을 가질 수 있습니다. 앱의 모든 활동이 함께 작동하여 완벽한 사용자 환경을 제공합니다.

통사론

  • void onCreate (Bundle savedInstanceState) // 작업이 시작될 때 호출됩니다.

  • void onPostCreate (Bundle savedInstanceState) // 작업 시작이 완료되면 (onStart () 및 onRestoreInstanceState (Bundle) 호출 후) 호출됩니다.

  • void onStart () // onCreate (Bundle) 이후 또는 onRestart () 이후에 호출되었지만 작업이 중단되었을 때 다시 사용자에게 표시됩니다.

  • void onResume () // 사용자가 상호 작용을 시작하기 위해 onRestoreInstanceState (Bundle), onRestart () 또는 onPause ()를 호출합니다.

  • void onPostResume () // 활동 재개가 완료되면 (onResume ()이 호출 된 후) 호출됩니다.

  • void onRestart () // 현재 액티비티가 사용자에게 다시 표시 될 때 (사용자가 다시 액티비티를 탐색 한 경우) onStop () 이후에 호출됩니다.

  • void onPause () // 액티비티가 백그라운드로 들어가지만 아직 (아직) 죽지 않았을 때 액티비티 라이프 사이클의 일부로 호출됩니다.

  • void onStop () // 사용자가 더 이상 볼 수 없을 때 호출됩니다.

  • void onDestroy () // 액티비티가 파기되기 전에 최종 정리를 수행합니다.

  • void onNewIntent (Intent intent) // 패키지의 launchMode를 "singleTop"으로 설정하거나 클라이언트가 startActivity (Intent)를 호출 할 때 FLAG_ACTIVITY_SINGLE_TOP 플래그를 사용하는 액티비티에 대해 호출됩니다.

  • void onSaveInstanceState (Bundle outState) // 상태가 onCreate (Bundle) 또는 onRestoreInstanceState (Bundle)에서 복원 될 수 있도록 살해되기 전에 작업 단위 인스턴스 상태를 검색하기 위해 호출됩니다.이 메서드로 채워진 Bundle은 둘 다 ).

  • void onRestoreInstanceState (Bundle savedInstanceState) //이 메소드는 이전에 저장된 상태에서 활동이 다시 초기화 될 때 onStart () 이후에 호출되며 여기서는 savedInstanceState에 지정됩니다.

매개 변수

매개 변수 세부
의지 startActivity 와 함께 사용하여 활동 시작 가능
묶음 String 키에서 다양한 Parcelable 값으로의 매핑.
문맥 응용 프로그램 환경에 대한 전역 정보에 대한 인터페이스.

비고

액티비티 는 전화를 걸거나 사진을 찍거나 이메일을 보내거나지도를 보는 등의 작업을하기 위해 사용자가 상호 작용할 수있는 화면을 제공하는 애플리케이션 구성 요소입니다. 각 활동에는 사용자 인터페이스를 그리는 창이 제공됩니다. 일반적으로 화면은 화면을 채우지 만 화면보다 작을 수 있으며 다른 창의 위에 떠있을 수 있습니다.

백 스택 기록에서 활동 제외

열릴 수있는 활동 B 가 있고, 더 많은 활동을 더 시작할 수 있습니다. 그러나 사용자는 작업 활동을 다시 탐색 할 때이를 접하지 않아야합니다.

활동 스택 동작

가장 간단한 해결책은 AndroidManifest.xml 에서 해당 <activity> 태그에 대해 noHistory 속성을 true 로 설정하는 것입니다.

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

다음 동작을 시작하기 전에 Bfinish() 를 호출하면 코드에서이 동일한 동작이 가능합니다.

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

noHistory 플래그의 일반적인 사용법은 "초기 화면"또는 로그인 활동입니다.

Android 활동 라이프 사이클 설명

버튼 클릭을 사용하여 다음 활동을 호출 할 수있는 MainActivity가있는 응용 프로그램을 가정합니다.

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

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

앱을 처음 만들 때
D / MainActivity : MainActivity에서 onCreate 호출
D / MainActivity : MainActivity에서 onStart 호출
D / MainActivity : MainActivity에서 onResume 호출
부르다

화면이 잠자기 상태 일 때
08 : 11 : 03.142 D / MainActivity : MainActivity에서 onPause 호출
08 : 11 : 03.192 D / MainActivity : MainActivity에서 onStop 호출
호출됩니다. 그리고 그것이 깨어 났을 때 다시
08 : 11 : 55.922 D / MainActivity : MainActivity에서 onRestart 호출
08 : 11 : 55.962 D / MainActivity : MainActivity에서 onStart 호출
08 : 11 : 55.962 D / MainActivity : MainActivity에서 onResume 호출
부르다

사례 1 : 주요 활동에서 다음 활동이 호출 될 때
D / MainActivity : 다음 활동 호출
D / MainActivity : MainActivity에서 onPause 호출
D / NextActivity : 다음 활동에서 onCreate 호출
D / NextActivity : 다음 활동에서 onStart 호출
D / NextActivity : 다음 활동에서 onResume 호출
D / MainActivity : MainActivity에서 onStop 호출

뒤로 버튼을 사용하여 다음 활동에서 주 활동으로 돌아갈 경우
D / NextActivity : 다음 활동에서 onPause 호출
D / MainActivity : MainActivity에서 onRestart 호출
D / MainActivity : MainActivity에서 onStart 호출
D / MainActivity : MainActivity에서 onResume 호출
D / NextActivity : 다음 활동에서 onStop 호출
D / NextActivity : 다음 활동에서 onDestroy 호출

사례 2 : 활동이 부분적으로 불투명 한 경우 (개요 버튼을 누를 때) 또는 앱이 백그라운드로 전환되고 다른 앱이 앱을 완전히 가릴 때
D / MainActivity : MainActivity에서 onPause 호출
D / MainActivity : MainActivity에서 onStop 호출
앱이 사용자 입력을 받아 들일 준비가 된 포 그라운드에서 돌아 왔을 때,
D / MainActivity : MainActivity에서 onRestart 호출
D / MainActivity : MainActivity에서 onStart 호출
D / MainActivity : MainActivity에서 onResume 호출
부르다

사례 3 : 암시 적 의도를 수행하기 위해 활동이 호출되고 사용자가 선택을 수행 할 때. 예를 들어 공유 버튼을 누르고 표시된 애플리케이션 목록에서 앱을 선택해야하는 경우
D / MainActivity : MainActivity에서 onPause 호출

액티비티는 표시되지만 현재 활성 상태가 아닙니다. 선택이 완료되고 앱이 활성화되면
D / MainActivity : MainActivity에서 onResume 호출
불렀다.

사례 4 :
앱이 백그라운드에서 종료 되면 (다른 포 그라운드 앱의 리소스를 확보하기 위해) onPause (프리 허니 콤 장치의 경우) 또는 onStop (허니 콤 장치 이후)이 앱이 종료되기 전에 마지막으로 호출됩니다.

onCreate 및 onDestroy는 응용 프로그램이 실행될 때마다 한 번 호출됩니다. 그러나 onPause, onStop, onRestart, onStart, onResume은 수명주기 동안 여러 번 호출 될 수 있습니다.

활동 launchMode

실행 모드는 작업의 새 활동 또는 기존 활동의 동작을 정의합니다.
가능한 시작 모드가 있습니다.

  • 표준
  • 싱글 탑
  • 단일 태스크
  • singleInstance

<activity/> 요소의 android manifest에 android:launchMode 속성으로 정의해야합니다.

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

표준:

기본값. 이 모드가 설정되면 새로운 활동마다 항상 새로운 활동이 생성됩니다. 따라서 동일한 유형의 많은 활동을 얻을 수 있습니다. 새로운 활동이 작업의 맨 위에 배치됩니다. 안드로이드 버전마다 약간의 차이가 있습니다 : 활동이 다른 응용 프로그램에서 시작하는 경우, 안드로이드 <= 4.4에서는 시작 응용 프로그램과 동일한 작업에 배치되지만 5.0 이상에서는 새 작업이 생성됩니다.

싱글 탑 :

이 모드는 standard 과 거의 같습니다. singleTop 활동의 많은 인스턴스가 생성 될 수 있습니다. 차이점은 액티비티 인스턴스가 현재 스택의 맨 위에 이미 존재하면 새 인스턴스를 생성하는 대신 onNewIntent() 가 호출된다는 점입니다.

SingleTask :

이 실행 모드의 활동 은 시스템에 하나의 인스턴스 만 가질 수 있습니다. 활동에 대한 새 태스크가 작성됩니다 (존재하지 않는 경우). 그렇지 않으면 작업이있는 작업이 맨 앞으로 이동되고 onNewIntent 가 호출됩니다.

SingleInstance :

이 모드는 singleTask 와 유사합니다. 차이점은 singleInstance 로 작업을 수행하는 작업 만이 작업 만 수행 할 수 있다는 것입니다. singleInstance 활동이 다른 활동을 작성하면, 새 활동이 작성되어 해당 활동을 배치합니다.

setContentView를 사용하여 UI 표시

액티비티 클래스는 setContentView 하여 UI를 배치 할 수있는 창을 생성합니다.
세 가지 setContentView 메소드가 있습니다.

  • setContentView(int layoutResID) - 레이아웃 리소스에서 액티비티 컨텐츠를 설정합니다.
  • setContentView(View view) - 액티비티 컨텐츠를 명시 적보기로 설정합니다.
  • setContentView(View view, ViewGroup.LayoutParams params) - 제공되는 매개 변수를 사용하여 명시 적보기로 활동 내용을 설정합니다.

setContentView 가 호출되면이 뷰는 액티비티의 뷰 계층에 직접 배치됩니다. 자체적으로 복잡한 뷰 계층 구조 일 수 있습니다.


예제들

리소스 파일에서 콘텐츠 설정 :

뷰 계층 구조가있는 리소스 파일 (이 예제에서는 main.xml)을 추가하십시오.
<?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>

활동 내용으로 설정 :

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

콘텐츠를 명시 적보기로 설정합니다.

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

현재 활동 스택을 지우고 새로운 활동을 시작하십시오.

현재 활동 스택을 지우고 새 활동을 시작하려면 (예 : 앱에서 로그 아웃하고 활동에서 로그 시작) 두 가지 접근 방식이 표시됩니다.

1. 목표 (API> = 16)

액티비티에서 finishAffinity() 호출하기

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

최근 애플리케이션에서 제외 된 애플리케이션 종료

먼저 AndroidManifest.xml에 ExitActivity를 정의하십시오.

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

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

활동을위한 위로 탐색

위 탐색은 Manifest.xml의 android:parentActivityName="" 을 activity 태그에 추가하여 android:parentActivityName="" 에서 수행됩니다. 기본적으로이 태그를 사용하여 활동의 상위 활동에 대해 시스템에 알립니다.

어떻게 된거 야?

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

이제 HomeActivity의 툴바 안쪽에있는 화살표를 클릭하면 부모 작업으로 돌아갑니다.

자바 코드

여기서는이 기능에 필요한 적절한 Java 코드를 작성합니다.

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

이 코드를 실행하면 뒤로 버튼을 누르면 MainActivity로 돌아갑니다. 위로 탐색에 대한 이해를 돕기 위해 문서를 읽는 것이 좋습니다.

재정의를 통해 필요에 따라이 동작을 맞춤 설정할 수 있습니다.

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

간단한 해킹

이것은 부모가 배낭에있는 경우 부모 활동으로 이동하는 데 주로 사용되는 간단한 해킹입니다. id가 android.R.id.home 과 같은 경우 onBackPressed() 를 호출하여

@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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow