AlarmManager AlarmManager는 특정한 시간과 주기로 Intent를 실행하는 기능을 제공한다. 예를 들어, 정해진 시간에 사용자에게 Notification을 보내려고 할 때 AlarmManager를 활용할 수 있다. 원하는 시간에 AlarmManager를 통해 broadcast를 전송하도록 구현하고, 그 broadcast를 받은 receiver는 Notification을 발행하도록 구현하면 된다. 자세한 방법은 다음 포스팅으로 업로드할 예정이다. 이 포스팅에서는 AlarmManager의 특징과 장단점, 구현 방법 등에 대해서 알아보자. 특징 지정된 시간과 간격으로 Intent를 실행한다. 애플리케이션 외부에서 작동한다. 따라서 앱을 실행하고 있지 않을 때나 Doze 모드인 경우(Doze ..
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 실행 - 휴대폰 홈 화면에 있는 앱 위젯 클..