[Android] 프로바이더, 프래그먼트

업데이트:

이 게시글은 안드로이드를 공부하면서 생소한 것들을 정리해두었다.

프로바이더

프로바이더는 앱이 가지고 있는 데이터베이스를 외부에 공개하는 기능을 제공합니다.

//모든 사진 정보 가져오기
val cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//이미지를 가져올 경로(외부 저장소)
	null,       // 가져올 데이터 항목 배열
	null,        // 조건
	null,    // 조건
	MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC")  // 찍은 날짜 순으로 내림차순

위의 코드로 안드로이드의 외부 저장소에 저장된 이미지 데이터를 가지고 온다

하지만 안드로이드에선 외부 저장소를 읽기 위해선 파일 권한이 필요하다.

<!--외부 저장소 읽기 권한 추가-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

코드를 매니페스트 파일에 추가하면 된다.

private val REQUEST_READ_EXTERNAL_STORAGE = 1000

override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_main)

	//권한이 부여됬는지 확인
	if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
		//권한이 허용되지 않음

		if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)){
			//이전에 이미 권한이거부되었을 때
			//이전에 거부가 되었으면 왜 권한이 필요한지 메시지를 띄우고 권한을 다시 요청한다.
			alert("사진 정보를 얻으려면 외부 저장소 권한이 필수로 필요합니다","권한이 필요한 이유"){
				yesButton {
					//권한 요청
					ActivityCompat.requestPermissions(this@MainActivity,
						arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
						REQUEST_READ_EXTERNAL_STORAGE)
				}
				noButton {  }
			}.show()
		}else{
			//권한 요청
			ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),REQUEST_READ_EXTERNAL_STORAGE)
		}
	}else{
		getAllPhotos()
	}

}

위의 코드는 사용자에게 권한을 요청하고 거부하면 다시 권한을 요청 하는 코드이다.

프래그먼트

  • 프래그먼트란 사용자 인터페이스의 모음이다.
    프래그먼트 여러 개를 조합하여 액티비티 하나를 구성할 수 있고 한 번 작성한 프래그먼트는 재사용할 수 있다.

  • 프래그먼트 생명주기
    프래그먼트생명주기

  • 생명주기 설명

    • onAttach() : 액티비티에 붙을 때 호출된다. 이때 부터 액티비티의 참조를 사용할 수 있다.
    • onCreate() : 프래그먼트가 생성될 때 호출된다. 아직 레이아웃은 완성 전이다.
    • onCreateView() : 레이아웃을 생성하기 전에 호출된다. 완성된 뷰를 반환, 아직 레이아웃 완성전이다
    • onActivityCreated() : 액티비티의 onCreate() 매서드가 수행된 직후에 호출됨
    • onStart() : 프래그먼트가 사용자에게 보여질 때 호출된다.
    • onResume() : 사용자와 상호작용 시작
    • onPause() : 프래그먼트가 일시 중지이거나 더 이상 사용자와 상호작용하지 않는다.
    • onStop() : 프래그먼트가 중지됨
    • onDestroyView() : 프래그먼트가 해당 자원을 정리할 수 있도록 한다.
    • onDestroy() : 프래그먼트가 파괴될 때 호출함
    • onDetach() : 프래그먼트가 액티비티에서 완전히 제거될 때 호출됨

viewPager

뷰페이저는 여러 프래그먼트들을 좌우로 슬라이드하는 뷰이다. 여기엔 세 가지 개념이 있다.

  • 데이터 : 프래그먼트(화면)
  • 어댑터 : 프래그먼트를 어느 화면에 표시할 것인지 관리하는 객체
  • 뷰 : 뷰페이저는

PagerAdapter

ViewPager에 표시할 내용을 정의하려면 어댑터가 필요하다.
어댑터는 아이템의 목록 정보를 가진 객체이다. 종류로는

  • FragmentPagerAdapter : 페이지 내용이 영구적이고 페이지 갯수가 많지 않을때 적합하다.
  • FragmentStatePagerAdapter : 많은 수의 페이지가 있을때 적합하고, 적은 메모리를 차지한다.

Glide 라이브러리

Glide는 사진 로딩에 특화된 라이브러리이다.
기존 이미지 표시하는 메서드 setImageURI()보다 이 라이브러리를 쓴 이유는

  • 미사용 리소스를 자동으로 해제
  • 메모리를 효율적으로 관리해준다.
  • 이미지를 비동기로 로딩하여 UI의 끊김이 없다.

나머지 자세한 소스코드는 여기에서 확인가능하다.

댓글남기기