Android
활동
수색…
소개
활동은 사용자 인터페이스 (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">
다음 동작을 시작하기 전에 B
가 finish()
를 호출하면 코드에서이 동일한 동작이 가능합니다.
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);
}