Android 응용 개발 에서 Activity 류 의 용법 을 전면적으로 분석 합 니 다.

13784 단어 AndroidActivity
Activity 클래스 는 android.app 패키지 에 있 습 니 다.계승 체 계 는 다음 과 같 습 니 다.
1.java.lang.Object
2.android.content.Context
3.android.app.ApplicationContext
4.android.app.Activity
activity 는 단독 으로 사용자 작업 을 처리 하 는 데 사 용 됩 니 다.거의 모든 activity 가 사용자 와 접촉 해 야 하기 때문에 activity 류 는 창 을 만 들 었 습 니 다.개발 자 는 setContentView(View)인 터 페 이 스 를 통 해 UI 를 activity 가 만 든 창 에 놓 을 수 있 습 니 다.activity 가 전체 화면 창 을 가리 킬 때 다른 방식 으로 도 실현 할 수 있 습 니 다.다른 activity 그룹 에 끼 워 넣 거나(Activity Group 사용).대부분의 Activity 하위 클래스 는 다음 과 같은 두 개의 인 터 페 이 스 를 실현 해 야 합 니 다.
onCreate(Bundle)인 터 페 이 스 는 activity 를 초기 화 하 는 곳 입 니 다.여기 서 는 보통 setContentView(int)가 자원 파일 에 정의 하 는 UI 를 호출 할 수 있 습 니 다.findView ById(int)를 사용 하면 UI 에서 정의 하 는 창 을 얻 을 수 있 습 니 다.
onPause()인 터 페 이 스 는 사용자 가 activity 를 떠 나 려 고 하 는 곳 입 니 다.여기 서 모든 수정 사항 이 제출 되 어야 합 니 다(일반적으로 ContentProvider 에 데 이 터 를 저장 하 는 데 사 용 됩 니 다).
Context.startActivity()를 사용 하기 위해 서 는 모든 activity 클래스 가 AndroidManifest.xml 파일 에 관련 된'activity'항목 을 정의 해 야 합 니 다.
Activity 클래스 는 Android 응용 라 이 프 사이클 의 중요 한 부분 입 니 다.다음은 Activity 의 각 포 인 트 를 구체 적 으로 정리 해 보 겠 습 니 다.
1.Activity 의 생명주기
2016229145632612.png (545×711)
2.Activity 간 에 데 이 터 를 전달 합 니 다.
1.Intent 를 통 해 데이터 전달
Intent.putExtra 방법 을 통 해 간단 한 데이터 형식 이나 직렬 화 가능 한 대상 을 Intent 대상 에 저장 한 다음 다른 Activity 에서 getInt,getString 등 방법 으로 이 데 이 터 를 얻 을 수 있 습 니 다.예제 코드 는 다음 과 같다.

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
 //      “     ”  email 
 Bundle bundle =new Bundle();//    email   
 bundle.putBoolean("boolean_key", true);//     
 bundle.putString("string_key", "string_value"); 
 intent.putExtra("key", bundle);//    email 
 startActivity(intent);//      Activity
다음은 데이터 가 져 오기:

 Intent intent =getIntent();//    email 
 Bundle bundle =intent.getBundleExtra("key");//    email 
 bundle.getBoolean("boolean_key");//     
 bundle.getString("string_key");
그러나 Bundle 을 사용 하여 데 이 터 를 전달 하 는 것 은 조금 번 거 롭 습 니 다.만약 에 한 가지 유형의 값 만 전달 하면 이렇게 할 수 있 습 니 다.

Intent intent =new Intent(EX06.this,OtherActivity.class); 
 intent.putExtra("boolean_key", true); 
 intent.putExtra("string_key", "string_value"); 
 startActivity(intent);
데이터 가 져 오기:

Intent intent=getIntent(); 
 intent.getBooleanExtra("boolean_key",false); 
 intent.getStringExtra("string_key");
2.정적 변 수 를 통 해 데이터 전달
직렬 화 되 지 않 고 간단 한 대상 에 적용 되 지만 정적 코드 블록 을 사용 하 는 것 은 추천 하지 않 습 니 다.

public class MainActivity extends Activity { 
  private Button btn; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    btn = (Button)findViewById(R.id.btOpenOtherActivity); 
    btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        //       
        Intent intent = new Intent(MainActivity.this,OtherActivity.class); 
        //  OtherActivity          
        OtherActivity.name = "wulianghuan"; 
        OtherActivity.age = "22"; 
        OtherActivity.address = "    "; 
        startActivity(intent); 
      } 
    }); 
  } 
}
public class OtherActivity extends Activity { 
  public static String name; 
  public static String age; 
  public static String address; 
  private TextView text_name; 
  private TextView text_age; 
  private TextView text_address; 

  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.other); 
    text_name = (TextView) findViewById(R.id.name); 
    text_age = (TextView) findViewById(R.id.age); 
    text_address = (TextView) findViewById(R.id.address);   
    //         
    text_name.setText("  :"+name); 
    text_age.setText("  :"+age); 
    text_address.setText("  :"+address); 
  } 
}

3.전역 대상 을 통 해 데이터 전달
프로그램 이 수시로 호출 할 수 있 도록 일부 데 이 터 를 오래 저장 하려 면 전역 대상 을 사용 하 는 것 을 권장 합 니 다.응용 프로그램 전역 클래스 는 정적 변 수 를 정의 할 필요 가 없습니다.일반 구성원 변 수 를 정의 하면 됩 니 다.그러나 전역 클래스 에는 반드시 무 참 구조 방법 이 있어 야 합 니 다.응용 프로그램 클래스 를 작성 한 후에<응용 프로그램>탭 에서 전역 클래스 이름 을 만들어 야 합 니 다.그렇지 않 으 면 시스템 이 자동 으로 전체 대상 을 만 들 지 않 습 니 다.

public class MainApplication extends Application {
  private String username;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }
}
public class MainActivity extends Activity {

  private MainApplication application;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    application = (MainApplication) getApplication();
    application.setUsername("sunzn");
  }

  public void open(View view) {
    Intent intent = new Intent(this, OtherActivity.class);
    startActivity(intent);
  }
}
public class OtherActivity extends Activity {
  private TextView tv_data;
  private MainApplication application;
  private String username;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_other);
    application = (MainApplication) getApplication();
    username = application.getUsername();
    tv_data = (TextView) findViewById(R.id.tv_data);
    tv_data.setText("     Activity         :" + username);
  }
}

3.Activity 에서 데 이 터 를 되 돌려 줍 니 다.
Activity 에서 데 이 터 를 되 돌려 주 려 면 startActivity ForResult 방법 으로 Activity 를 표시 해 야 합 니 다.
Activity 1 에서 Activity 2 로 이동:

Intent intent = new Intent();
 intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);
 Bundle bundle = new Bundle();
 bundle.putString("string", et_string.getText().toString());
 intent.putExtras(bundle);
 startActivityForResult(intent,0); //      
Activity 2 에서 데 이 터 를 Aactivity 1 로 되 돌려 줍 니 다.

Intent intent = new Intent();
intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);
Bundle bundle = new Bundle();
bundle.putInt("result", "Activity2     ");
intent.putExtras(bundle); 
AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK      
AnotherActivity.this.finish();
Activity 1 에 onActivity Resault 방법 을 다시 쓰 고 데 이 터 를 받 아들 입 니 다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          switch(resultCode) { //     ,      
          case RESULT_OK: 
             Bundle bundle =data.getExtras(); //  intent   bundle  
               String result = bundle.getInt("result"); 
          break; 
          default:
          break;
          } 

       }

4.Activity 의 네 가지 생 성 모드
저 희 는 프로젝트 를 개발 하 는 과정 에서 이 응용 프로그램 에서 여러 개의 Activity 구성 요소 간 의 도약 이나 다른 응용 프로그램 을 끼 워 넣 는 재 활용 가능 한 Activity 와 관련 될 것 입 니 다.예 를 들 어 우 리 는 반복 되 는 Activity 가 아 닌 원래 의 Activity 인 스 턴 스 로 이동 하고 싶 을 수도 있 습 니 다.기본 로드 모드 대신 Activity 에 특정한 로드 모드 를 설정 해 야 합 니 다.시작 모드 의 위 치 를 Manifest.xml 파일 에서 Activity 의 android:launchMode 속성 으로 설정 합 니 다.
1.표준 모드
이것 은 기본 모드 입 니 다.설정 할 필요 가 없습니다.Activity 를 활성화 할 때마다 Activity 인 스 턴 스 를 만 들 고 작업 스 택 에 넣 습 니 다.스 택 에 들 어 가 는 것 과 같 습 니 다.back 키 를 누 르 면 이전 Activity 로 돌아 가 는 것 은 스 택 을 취소 하 는 것 과 같 습 니 다.
2.singleTop 모드
작업 의 스 택 에 이 Activity 의 인 스 턴 스 가 존재 한다 면 이 인 스 턴 스(인 스 턴 스 의 onNewIntent()를 다시 사용 합 니 다.그렇지 않 으 면 새로운 인 스 턴 스 를 만 들 고 스 택 에 이 Activity 의 인 스 턴 스 가 존재 하 더 라 도 스 택 꼭대기 에 없 으 면 새로운 인 스 턴 스 를 만 듭 니 다.스 택 에서 같은 Activity 를 반복 하 는 여러 문 제 를 해결 할 수 있 습 니 다.
3.singleTask 모드
스 택 에 이 Activity 의 인 스 턴 스 가 있 으 면 이 인 스 턴 스 를 다시 사용 합 니 다(인 스 턴 스 의 onNewIntent()를 호출 합 니 다.다시 사용 할 때 이 인 스 턴 스 를 스 택 으로 되 돌려 줍 니 다.따라서 그 위 에 있 는 인 스 턴 스 는 스 택 에서 옮 겨 집 니 다.스 택 에 이 인 스 턴 스 가 존재 하지 않 으 면 새로운 인 스 턴 스 를 만들어 스 택 에 넣 습 니 다.single Task 모드 는 전체 응용 프로그램 을 종료 하 는 데 사용 할 수 있 습 니 다.주 Activity 를 SingTask 모드 로 설정 한 다음 종료 할 Activity 에서 주 Activity 로 이동 한 다음 주 Activity 의 onNewIntent 함 수 를 다시 쓰 고 함수 에 finish 를 추가 합 니 다.
4.singleInstance 모드
새 스 택 에 이 Activity 의 인 스 턴 스 를 만 들 고 여러 응용 프로그램 이 스 택 에 있 는 이 Activity 인 스 턴 스 를 공유 하도록 합 니 다.이 모드 의 Activity 인 스 턴 스 가 특정한 스 택 에 존재 하면 모든 응용 프로그램 이 이 Activity 를 다시 활성화 할 때 이 스 택 의 인 스 턴 스 를 다시 사용 합 니 다(인 스 턴 스 의 onNewIntent()를 호출 합 니 다.그 효 과 는 여러 애플 리 케 이 션 이 하나의 애플 리 케 이 션 을 공유 하 는 것 과 같 으 며,누가 이 액 티 비 티 를 활성화 하 더 라 도 같은 애플 리 케 이 션 에 들어간다.
5.Activity 현장 보존 상태
일반적으로 onPause()와 onStop()방법 을 호출 한 activity 인 스 턴 스 는 메모리 에 존재 합 니 다.activity 의 모든 정보 와 상태 데 이 터 는 사라 지지 않 습 니 다.activity 가 다시 프론트 데스크 톱 으로 돌아 가면 모든 변경 사항 이 유 지 됩 니 다.그러나 시스템 메모리 가 부족 할 때 onPause()와 onStop()방법 을 호출 한 activity 는 시스템 에 의 해 파 괴 될 수 있 습 니 다.이 때 메모리 에 이 activity 의 인 스 턴 스 대상 이 저장 되 지 않 습 니 다.나중에 이 activity 가 다시 프론트 데스크 톱 으로 돌아 가면 이전 변경 사항 이 사라 집 니 다.activity 가 죽 기 전에 모든 인 스 턴 스 를 저장 하 는 상 태 를 호출 할 수 있 습 니 다.개발 자 는 onSaveInstanceState()방법 을 다시 쓸 수 있 습 니 다.onSaveInstanceState()방법 은 Bundle 형식의 인 자 를 받 아들 일 수 있 습 니 다.개발 자 는 상태 데 이 터 를 이 Bundle 대상 에 저장 하여 이 상태 가 onCreate(Bundle)나 onRestoreInstanceState(Bundle)(들 어 오 는 Bundle 인 자 는 onSaveInstanceState 로 봉 인 된 것)에서 회복 되도록 할 수 있 습 니 다.이 방법 은 activity 가 죽 기 전에 호출 됩 니 다.이 activity 가 나중에 어느 순간 돌아 올 때 이전 상 태 를 회복 할 수 있 습 니 다.onSave InstanceState()방법 을 호출 하면,호출 은 onPause()나 onStop()방법 이전에 발생 하 며,생명주기 방법 도 아니다.
데이터베이스 에 기록 등 을 삽입 하면 지속 적 인 데 이 터 를 저장 하 는 작업 은 onPause()에 두 어야 합 니 다.onSaveInstanceState()방법 은 과도 데이터 만 저장 할 수 있 습 니 다.예 를 들 어 UI 컨트롤 의 상태,구성원 변수의 값 등 입 니 다.

public class MainActivity extends Activity { 
  private String temp;  
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //  savedInstanceState     ,           savedInstanceState null 
    if (savedInstanceState != null) { 
      temp = savedInstanceState.getString("temp"); 
      System.out.println("onCreate: temp = " + temp); 
    } 
  } 

  public void onRestoreInstanceState(Bundle saveInstanceState) { 
    super.onRestoreInstanceState( saveInstanceState); 
    String temp = saveInstanceState.getString("temp"); 
    System.out.println("onResume: temp = " + temp); 

  } 

  //       outState   ,        activity    onCreate   onRestoreInstanceState  
  @Override 
  protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("temp", temp); 
  }

6.Activity 에 관 한 기술
1.Activity 방향 설정

android:screenOrientation="portrait">//    ,    landscape     
2.액 티 비 티 전체 화면 설정
onCreate 방법 에 다음 코드 를 추가 합 니 다:

//       
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
 WindowManager.LayoutParams.FLAG_FULLSCREEN); 
//      
requestWindowFeature(Window.FEATURE_NO_TITLE);
창 크기,위치,투명도 변경
onCreate 방법 에 다음 코드 를 추가 합 니 다:

Window w=getWindow();
w.setBackgroundDrawableResource(resourceID);//      
WindowManager.LayoutParams layoutParams = w.getAttributes();
layoutParams.height = 200; 
layoutParams.width= 200;
layoutParams.gravity = Gravity.TOP;
layoutParams.x=50;//  Gravity     
layoutParams.y=50;
layoutParams.alpha = 0.5;//0:    ,1:   
w.setAttributes(layoutParams);
3.모든 창 닫 기

Intent intent = new Intent(); 
intent.setClass(Android123.this, CWJ.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //     FLAG   
startActivity(intent)
다른 방법:호출 종료 방법 에 Myapplication.getInstance().exit()를 쓰 십시오.

public class MyApplication extends Application {

   private List<Activity> activityList = new LinkedList<Activity>();
   private static MyApplication instance;

   private MyApplication() {
   }

   //           MyApplication  
   public static MyApplication getInstance() {
       if (null == instance) {
           instance = new MyApplication();
       }
       return instance;

   }

   //   Activity    
   public void addActivity(Activity activity) {
       activityList.add(activity);
   }

   //     Activity finish
   /*
   *     Activity  onCreate      Activity MyApplication       
   * 
   * MyApplication.getInstance().addActivity(this);
   * 
   *        Activity     exit  
   * 
   * MyApplication.getInstance().exit();
   */
   public void exit() {

       for (Activity activity : activityList) {
           activity.finish();
       }

       System.exit(0);

   }


좋은 웹페이지 즐겨찾기