초보자를 위한 활동


이 섹션 소개:

이 섹션에서는 Android의 4가지 주요 구성 요소 중 하나인 Activity(활동)에 대해 먼저 설명합니다. PS: 공식 웹사이트 문서: Activity

는 다음과 같이 소개됩니다. 의미 정보:

Activity는 사용자가 애플리케이션에서 일부 대화형 작업을 수행할 수 있는 화면 영역을 제공합니다. 그것. , 전화 걸기, 사진 찍기, 이메일 보내기, 지도 보여주기 등! 활동은 사용자 인터페이스를 그리는 창으로 이해될 수 있습니다. 그리고 이 창은 전체 화면을 채울 수도 있고, 화면보다 작을 수도 있고, 다른 창 위에 떠 있을 수도 있습니다!

위 단락에서 다음 정보를 얻을 수 있습니다.

1. 활동은 사용자 인터페이스를 표시하는 데 사용되며 사용자는 활동 상호 작용을 통해 관련 작업을 완료합니다2. 앱은 여러 활동을 허용합니다

좋습니다. 자세한 내용은 여기까지입니다. API를 계속 읽고 이 섹션을 시작하세요~


  1. Activity의 개념과 Activity의 수명 주기 다이어그램1.jpg

참고:

1. onPause() 및 onStop()이 호출된다는 전제는 : 새로운 활동이 열렸습니다! 전자는 이전 활동이 여전히 표시되는 경우이고, 후자는 이전 활동이 더 이상 표시되지 않는 경우입니다.
2. 또한 개인 테스트: AlertDialog 및 PopWindow는 위의 두 가지 콜백 메서드를 실행하지 않습니다~


2. Activity/ActionBarActivity/AppCompatActivity의 차이점:

설명을 시작하기 전에 이 세 가지에 대해 말씀드리겠습니다. 활동 1의 차이점 생성: 말할 필요도 없이 Activity. 후자의 두 가지는 모두 하위 버전과의 호환성을 위해 제안되었습니다. ActionBarActivity는 이름에서 알 수 있듯이 ActionBar~이며 5.0 이후에는 Google에서 폐기되었습니다. ToolBar... Android Studio에서 활동을 생성할 때 기본 상속은 AppCompatActivity입니다! 물론 Activity만 작성할 수도 있지만 AppCompatActivity는 새로운 기능을 제공합니다! 둘 중 하나를 선택하세요~


3.Activity 생성 과정

2.png

PS:

자, 위에서 언급한 것처럼 Activity와 AppCompatActivity를 상속받을 수 있지만 후자는 Just got을 제공합니다. 새로운 것 좀! 또한, 안드로이드의 4가지 주요 컴포넌트를 정의했다면, 사용 여부에 관계없이 AndroidManifest.xml에서 비교해야 한다는 점을 기억하세요. 이 구성 요소는 선언되어야 합니다. 그렇지 않으면 프로그램이 런타임 중에 직접 종료되고 ClassNotFindException이 보고됩니다...


4 onCreate()에서 하나의 매개변수와 두 개의 매개변수의 차이점:

as를 사용하는 친구들은 Act의 onCreate() 메서드를 다시 작성할 때 이 항목에 두 개의 매개변수가 있다는 것을 알게 될 것입니다:

3.png

하지만 일반적으로 매개변수는 하나뿐입니다:

4.png

음, 이것은 5.0에서 제공되는 새로운 방법입니다. 이를 사용하려면 먼저 구성 파일에서 활동에 대한 속성을 설정해야 합니다:

android: persistableMode=" persistAcrossReboots"

그러면 우리 활동에는 지속 기능이 있습니다. 일반적으로 우리는 이를 다른 두 가지 방법과 함께 사용합니다:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPerciousState)
public void onRestoreInstanceState( BundleSavedInstanceState, PersistableBundle persistState)

이 두 가지 방법의 이름을 잘 알고 있는 친구도 있을 것 같습니다.

  1. 홈 버튼을 클릭하여 홈페이지로 돌아가거나 길게 눌러 다른 프로그램 실행을 선택하세요
  2. 전원 버튼을 눌러 닫으세요. 화면
  3. 이 새로운 Activity
  4. 를 시작하면 가로 화면과 세로 화면을 전환할 때 반드시 실행됩니다. 왜냐하면 가로 화면과 세로 화면을 전환할 때 해당 Act가 먼저 파괴된 다음 다시 생성되었습니다. 중요한 원칙: 시스템이 "사용자의 허가 없이" 활동을 삭제하면 시스템에서 onSaveInstanceState가 호출됩니다. 이는 귀하에게 데이터를 저장할 수 있는 기회(저장할 수도 있고 저장하지 않을 수도 있음)를 제공해야 하기 때문에 시스템의 책임입니다.

후자의 방법은 onCreate와 같이 전자에 의해 저장된 데이터를 검색할 수도 있습니다. 일반적으로 onStart()와 onResume() 사이에서 실행됩니다! 데이터를 얻고 저장하는 방법이 두 가지인 이유는 종료하지 않고 액트 점프를 피하기 위해서입니다. 그런 다음 onCreate() 메서드를 사용하지 말고 저장된 데이터를 꺼내고 싶습니다~

Back to: Back to this Activity에는 지속 기능이 있으며 추가된 PersistableBundle 매개 변수가 이러한 메서드를 만듭니다. 시스템을 종료 후 다시 시작하는 데이터 복구 기능이 있습니다! ! 그리고 다른 직렬화 작업에는 영향을 주지 않습니다. 아직 구체적으로 어떻게 구현되는지는 모르겠지만, 다른 파일에 저장해 두었을 수도 있겠네요~! 나중에 원리를 알게 되면 알려드릴게요! 또한 API 버전은 21 이상이 필요합니다. 즉, 유효하려면 버전 5.0 이상이어야 합니다~


4 Activity를 시작하는 여러 가지 방법

Android에서는 다음에서 새 Activity를 시작할 수 있습니다. 두 가지 방법을 따르면서 여기에서 시작하는 방법에 주의를 기울이십시오. 모드 시작! ! 명시적 시작과 암시적 시작으로 구분됩니다!

1. 명시적 시작: 패키지 이름으로 시작, 다음과 같이 작성:

① 가장 일반적인:

startActivity(new Intent(현재 Act.this, Act.class 시작 예정) ); ) ;
intent.setComponent(cn) ;
startActivity(intent) ;3
인텐트 초기화 시 패키지 이름 지정:


Intentintent = new Intent("android.intent.action.MAIN" );
intent .setClassName("현재 액트의 정규화된 클래스 이름", "시작 액트의 정규화된 클래스 이름");
startActivity(intent);

2. 암시적 시작: 액션, 카테고리 또는 인텐트 필터의 데이터를 통해 구현됩니다. 이는 인텐트의 인텐트 필터**를 통해 달성됩니다. 이 인텐트 장에서 이에 대해 자세히 설명합니다! 이것이 당신이 여기서 알아야 할 전부입니다!

5.png

3. 패키지 이름을 통해 직접 apk를 시작하는 또 다른 방법도 있습니다.

Intentintent = getPackageManager().getLaunchIntentForPackage
(" apk");
if(intent != null) startActivity(intent) ;

5. 가로 및 세로 화면 전환 및 상태 저장 관련 문제

앞서 언급한 것처럼 앱이 가로 및 세로 화면을 전환하면 현재 활동이 삭제되고 새 활동이 생성됩니다. 인생주기에서 자신 각 메소드에 Log를 출력하는 문장을 추가하여 판단하거나, 버튼 클릭 후 TextView를 수정하기 위해 버튼과 TextView를 설정합니다. 텍스트를 선택한 다음 가로 화면과 세로 화면 사이를 전환하면 TextView 텍스트가 이전 내용으로 다시 변경되는 것을 마술처럼 발견할 수 있습니다! 가로 화면과 세로 화면 간에 전환할 때 Act는 다음 수명 주기를 거칩니다.
onPause-> onStop-> onDestory-> onCreate->onStart->onResume
전환 시 다음과 같은 문제가 발생할 수 있습니다. 가로 화면과 세로 화면 사이:


1. 먼저 가로 화면과 세로 화면 사이의 자동 전환을 비활성화하는 방법에 대해 이야기하겠습니다. AndroidManifest.xml에서 Act에 속성을 추가하는 방법은 android:screenOrientation입니다. 다음과 같은 선택적 값이 있습니다.

  • unspecified: 기본값 시스템이 표시 방향을 결정합니다. 결정 전략은 장치와 관련되어 있으므로 장치마다 표시 방향이 다릅니다.
  • landscape: 가로 화면 표시(가로가 세로보다 길다)
  • portrait: 세로 화면 표시(세로가 가로보다 길다)
  • user: 사용자가 현재 선호하는 방향
  • Behind: 그리고 이 활동 아래 활동의 방향은 동일합니다(활동 스택에서)
  • sensor: 물리적 센서에 의해 결정됩니다. 사용자가 기기를 회전하면 화면이 세로와 가로로 전환됩니다.
  • nosensor: 사용자가 장치를 회전해도 변경되지 않도록 물리적 센서를 무시합니다("지정되지 않은" 설정 제외).

2.

가로 및 세로 화면에 대해 서로 다른 레이아웃을 로드하려는 경우:

1) 두 가지 다른 레이아웃 세트를 준비합니다. Android는 가로 및 세로 화면에 따라 서로 다른 레이아웃을 로드합니다. 두 개의 레이아웃 폴더 만들기:

layout-land가로 화면, layout-port세로 화면 그런 다음 이 두 레이아웃 파일 세트를 이 두 폴더에 넣으면 파일 이름이 동일하므로 Android가 자체적으로 판단한 다음 해당 레이아웃을 로드합니다.

2) 코드에서 직접 판단하고 원하는 것을 로드하세요.

보통 onCreate() 메서드에서 레이아웃 파일을 로드합니다. 여기서는 가로 및 세로 화면의 상태를 판단할 수 있습니다. 키 코드는 다음과 같습니다. :

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.horizontal screen);
}

else if (this.getResources().getConfiguration ( ).orientation ==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.vertical screen);
}

3. 시뮬레이터를 가로 화면과 세로 화면으로 전환하는 방법

시뮬레이터가 GM인 경우. 시뮬레이터에서 스위치 버튼을 누르기만 하면 됩니다. 기본 시뮬레이터의 경우 Ctrl + F11/F12를 눌러 전환하세요!


4. 상태 저장 문제:

위에서 언급한 것처럼 BundleSavedInstanceState 매개변수를 통해 완료할 수 있습니다! 세 가지 핵심 메서드:


onCreate(Bundle selectedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle saveInstanceState);

onSaveInstanceState() 메소드를 재정의하고 이 번들에 데이터를 쓰기만 하면 됩니다. 예:

outState.putInt("num",1);

이런 방법으로 onCreate 또는 onRestoreInstanceState에서 데이터를 꺼낼 수 있습니다. 내부에 데이터가 저장되어 있지만 가져오기 전에 null인지 확인해야 합니다!

savedInstanceState.getInt("num");

그럼 원하는 대로 하세요~


6. 시스템에서 제공하는 공통 활동

자, 마지막으로 몇 가지 시스템을 연결하겠습니다. 몇 가지 일반적인 활동이 제공됩니다!

//1. 전화 걸기
//모바일 고객 서비스에 전화 10086
Uri uri = Uri.parse("tel:10086");
Intentintent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent ; );
intent.putExtra("sms_body", "Hello");
startActivity(intent);

///3. MMS 보내기(첨부 파일이 포함된 문자 메시지 보내기와 동일)
Intentintent = new Intent(Intent. ACTION_SEND) ;
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM , uri );
intent.setType("image/png");
startActivity(intent);

//4. 브라우저 열기:
// Google 홈페이지 열기
Uri uri = Uri.parse("http: //www .baidu.com");
Intent Intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

///5. 이메일 보내기: (Google 서비스를 거세하는 것은 쓸모가 없습니다!!! !)
// someone@domain.com으로 이메일 보내기
Uri uri = Uri.parse("mailto:someone@domain.com");
Intentintent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity( intent);
// "Hello"라는 내용을 포함하여 someone@domain.com에 이메일을 보냅니다.
Intentintent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com") ;
intent .putExtra(Intent.EXTRA_SUBJECT, "제목");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
// 여러 사람에게 이메일 보내기
Intentintent=new Intent(Intent.ACTION_SEND);
String[] tos = {"1@abc.com", "2@abc.com"} // Recipient
String[] ccs = { "3@abc.com", "4@abc.com"} // CC
String[] bccs = {"5@abc.com", "6@abc.com"} // Bcc
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "제목");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);

//6. 지도 표시:
//Google 지도 열기 중국 베이징 위치 ( 북위 39.9, 동경 116.3)
Uri uri = Uri.parse("geo:39.9,116.3");
의도 의도 = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//7. 경로 계획
// 경로 계획: 베이징(북위 39.9도, 동경 116.3) 어딘가에서 상하이 어딘가로 (북위 31.2, 경도 121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent 인텐트 = new Intent(Intent .ACTION_VIEW, uri);
startActivity(intent);

//8. 멀티미디어 재생:
Intentintent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo .mp3" );
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);

//SD 카드의 모든 오디오 파일을 가져온 다음 첫 번째 파일을 재생합니다 =-=
Uri uri = Uri.withAppendedPath( MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intentintent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//9. 사진 찍기:
//카메라 애플리케이션 열기
Intentintent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0)
//사진 데이터 가져오기
Bundle extras =intent.getExtras(); = (비트맵) extras.get("data") ;

//Another:
//시스템 카메라 애플리케이션 호출 및 촬영한 사진 저장
Intentintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
time = Calendar.getInstance ().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

//10. 사진 가져오기 및 잘라내기
// 사진 가져오기 및 잘라내기
Intentintent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent .putExtra("crop" , "true"); // 클리핑 켜기
intent.putExtra("aspectX", 1) // 클리핑의 가로 세로 비율은 1:2
intent.putExtra("aspectY", 2 );
intent.putExtra("outputX", 20); // 이미지의 너비와 높이를 저장합니다.
intent.putExtra("outputY", 40)
intent.putExtra("output", Uri.fromFile(new) File("/mnt/sdcard /temp"))); // 경로 저장
intent.putExtra("outputFormat", "JPEG"); // 형식 반환
startActivityForResult(intent, 0)// 특정 사진 잘라내기
인텐트 인텐트 = 새 인텐트("com.android.camera.action.CROP");intent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp"))); putExtra("outputX", 1); // 컷의 가로 세로 비율은 1:2입니다.
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20) // 이미지 저장 너비 및 높이
intent.putExtra("aspectY", 40);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true); parse("file:///mnt/sdcard/temp"));
startActivityForResult(intent, 0);

//11. Google Market을 엽니다.
//Google Market을 열어 프로그램 세부 페이지를 직접 입력합니다.
Uri = Uri.parse("market://details?id=" + "com.demo.app");
Intent 인텐트 = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//12 .휴대폰 설정 인터페이스에 들어갑니다.
//무선 네트워크 설정 인터페이스에 들어갑니다(다른 사람도 한 예에서 추론할 수 있음)
Intentintent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)
startActivityForResult(intent, 0);

//13. 설치 apk:
Uri installUri = Uri.fromParts("package", "xxx", null)
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//14.
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it)//15 첨부 파일 보내기: new Intent(Intent.ACTION_SEND) ;  ");
startActivity(Intent.createChooser(it, "이메일 클라이언트 선택"));

//16. 연락처 페이지를 입력하세요:
Intentintent = new Intent();
intent .setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);

//17. 지정된 연락처 보기:
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id );//info.id 연락처 개인 ID
Intent 의도 = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);


이 섹션 요약:

글쎄요, 그냥 적는 것은 입문 튜토리얼처럼 보이지 않습니다. 하하. 하지만 이 섹션을 먼저 살펴보려면 여기에서 멈추세요~ 계속해서 공부하겠습니다. 데이터 전송, 시작 모드 등의 활동은 다음 섹션에서~ 계속 지켜봐주세요~