
Notification (알림) 사용자에게 미리 알림을 보내고 앱에서 보내는 정보를 적절한 시기에 제공하기 위해 안드로이드에 앱 외부에서 표시하는 메시지다. 사용자는 알림을 클릭하여 앱을 열거나 알림 자체에서 바로 특정 작업을 실행할 수 있다. 알림 종류 1. status bar 및 알림 목록 첫 번째 사진 처럼 status bar에 아이콘 형태로 notification이 뜰 수 있다. 또한 status bar를 아래로 내리면 알림 목록에 해당 알림이 뜬다. 2. 헤드업 알림 현재 실행하고 있는 포그라운드 앱 앞에 헤드업 알림이 나타난다. 몇 초 후 사라지고 1번의 경우처럼 status bar와 알림 목록에 표시된다. 헤드업 알림이 나타나는 경우는 아래와 같다. 알림의 intent가 fullScreenI..
기존 방식 - startActivityForResult 먼저 activity간 데이터를 전달하는 기존 방식을 알아보자. 자세히 말하면 새로운 activity로 이동하고, 그 activity가 닫힐 때 결과를 받아오는 것이다. 1. 데이터를 받을 activity에서 새로운 activity 시작 (MainActivity.kt) startActivityForResult(Intent(this, SubActivity::class.java), REQUEST_CODE) 기존 activity의 코드는 위와 같다. 이동하려는 activity를 Intent에 담아서 startActivityForResult()를 호출한다. 결과를 받아오지 않고 그냥 activity를 실행하려면 startActivity()를 사용했지만, 결..
권한 요청 방법 - 기존 방식 먼저 기존에 안드로이드에서 권한을 요청하기 위해 사용한 방법을 알아보자. 1. manifest manifest 파일의 바깥에 을 넣어준다. 2. 권한 요청 fun requestPermissions() { if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { return } ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_CODE) } checkSelfPermission()을 통해 현재 권한이 허용되었는지 거부되었는지 확인한다. 만..
Bundle Bundle은 데이터를 저장하기 위한 객체다. 키-값 쌍으로 데이터를 저장하기 때문에, Bundle 내부에서는 Map을 사용한다. Intent와의 차이점 Intent에서 putExtra()를 통해서도 키-값 쌍으로 저장하는데, 무슨 차이일까? Intent의 putExtra() 내부에서도 데이터를 저장하기 위해 Bundle을 사용한다 예를 들어 putExtra() 내부 코드는 아래와 같을 것이다. fun putExtra(name: String, value: String?): Intent { if (mExtras == null) { mExtras = Bundle() } mExtras.putString(name, value) return this } 두 객체 모두 Map을 사용하여 데이터를 키-값..
Broadcast와 BroadcastReceiver의 개념 안드로이드에서는 특정 이벤트가 발생할 때 Broadcast가 전송된다. 특정 Broadcast를 수신하도록 BroadcastReceiver를 등록할 수 있다. 간단히 말해서 어떤 이벤트를 구독하고, 그 이벤트가 발생할 때마다 구독자들에게 알리는 옵저버 패턴이라고 할 수 있다. 여기서 '알림'이 Broadcast, '구독자'가 BroadcastReceiver가 된다. 예를 들어 사용자가 휴대폰을 재부팅시키면, 부팅 이벤트를 등록한 BroadcastReceiver에게 Broadcast를 보낸다. 브로드캐스트의 종류는 상수로 표현되어 있는데, 어떠한 종류가 있는지는 아래 링크 공식문서에서 확인할 수 있다. https://developer.android..
Intent 다른 컴포넌트 간 통신하는 역할을 한다. 실행하고자 하는 컴포넌트를 담은 인텐트를 생성하면, 안드로이드 시스템에서 인텐트 정보에 맞는 컴포넌트를 실행한다. 액티비티를 시작하거나, 서비스/브로드캐스트를 시작할 때 Intent에 클래스명을 넣어 사용한다. 명시적 인텐트 val intent = Intent(this, NotificationActivity::class.java) startActivity(intent) 앱의 패키지명이나 클래스명을 인텐트의 인자로 넣는다. 일반적으로 앱 안의 구성 요소를 시작하고자 할 때 명시적 인텐트를 사용한다. 암시적 인텐트 val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.E..
PendingIntent PendingIntent를 직역하면, 보류 인텐트다. 말 그대로 Intent를 바로 시작하지 않고 미루어서 특정 시점에 Intent를 시작하게 해주는 클래스다. PendingIntent를 생성할 때 생성자 메서드로 Intent를 넣는다. 사용자가 외부 앱을 사용하고 있을 때, PendingIntent 안에 있는 Intent를 실행하게 해준다. 외부 앱에게 권한을 허가하여, 자신의 앱 자체 프로세스에서 실행하는 것처럼 사용하게 해주는 것이다. 즉, 외부 앱을 사용하고 있을 때 자신의 앱 Intent를 사용해야 할 경우 PendingIntent를 쓴다. PendingIntent 사용 사례 - 앱 Notification 클릭 시 Intent 실행 - 휴대폰 홈 화면에 있는 앱 위젯 클..
fragment에서 Toast 메시지를 띄우거나 부모 액티비티의 함수를 호출할 때, context/activity가 필요한 경우가 있다. 하지만 Fragment 클래스에는 context가 포함되어 있지 않기 때문에 어떻게 해야할지 곤란했다. - context 얻기 class CustomFragment : Fragment() { private lateinit var mContext: Context override fun onAttach(context: Context) { super.onAttach(context) mContext = context } } fragment 생명주기 가장 처음에 호출되는 onAttach의 인자로 context가 들어옴을 발견했다. 이는 부모 액티비티의 context로, 이 co..