목록Programming/Kotlin - Android (39)
외로운 Nova의 작업실
- 백그라운드 제약 액티비티를 제외한 나머지 컴포넌트는 화면을 구현하는 용도가 아니라 백그라운드에서 작업을 처리할 목적으로 사용합니다. 그런데 예전에는 앱을 실행해 화면이 출력된적이 없는 상황에서도 백그라운드에서 작업을 처리할 수있었지만 안드로이드 8버전부터는 제약을 받습니다. 따라서 브로드캐스트 리시버나 서비스를 이용할때는 백그라운드 제약에 관해 잘 정리해둬야합니다. - 리시버의 백그라운드 제약 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없습니다. 위처럼 매니페스트 파일에 등록하고 아래처럼 다른 클라이언트 앱에서 코드를 실행하면 리시버는 받지못합니다. val intent = Intent("ACTION_RECEIVER") sendBroadcast(intent) 암시적 인텐트는 registerRece..
- IBinder 객체 바인딩 앞 장에서 살펴본것 처럼 서비스를 실행하는 함수를 2개 제공하는 이유는 서비스를 이용하는 상황을 2가지로 구분하기 위해서입니다. 다음 그림처럼 액티비티에서 startService()함수로 서비스를 실행했다고 가정해봅시다. 이처럼 백그라운드 작업은 필요하지만 액티비티와 데이터를 주고받을 일이없는 등 서로 관련이 없다면 startService()함수로 서비스를 실행하면 됩니다. 그런데 어떤 경우에는 서비스와 액티비티가 상호작용 해야할때가 있습니다. bindeService()는 이러한 목적으로 호출하는 함수입니다. - 실습 메인 액티비티.xml에 service라는 텍스트뷰를두고 원래는 service return 이라는 문자열이 이였다가 서비스쪽에 의해 문자열이 바뀌는 코드를 짜보..
- 서비스 서비스는 오래 걸리는 작업을 백그라운드에서 처리할 수 있게 해주는 컴포넌트입니다. 따라서 화면을 구현하지않고 서비스 역시 안드로이드의 컴포넌트이므로 생명주기를 시스템에서 관리합니다. - 서비스 생성과 실행 서비스 컴포넌트는 Service 클래스를 상속받아서 작성합니다. 다양한 생명주기 함수를 재정의할 수 있지만 onBind()는 필수 입니다. 아래는 생성 예시입니다. class Myservice: Service(){ override fun onBind(intent: Intent?): IBinder? { return null } } 서비스도 컴포넌트이므로 매니페스트에 등록해야합니다. 만일 암시적 인텐트로 하려면 intent-filter 태그를 등록해줍니다. 서비스를 실행할떄는 2가지 함수가 있는..
- 화면 켬/끔 브로드캐스트 리시버로 유저가 화면을 켰는지 껏는지를 알 수 있습니다. 아래는 화면을 켰는지 껏는지에 따라 실행하는것이 다른 리시버를 만든 코드입니다. 먼저 메인 액티비티.kt 파일입니다. class MainActivity : AppCompatActivity() { lateinit var receiver: BroadcastReceiver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var Binding = ActivityMainBinding.inflate(layoutInflater) setContentView(Binding.root) //리시버 생성 receiver = objec..
- 브로드캐스트 리시버 브로드캐스트 리시버는 흔히 이벤트 모델로 실행되는 컴포넌트라고 정의합니다. 시스템에 어떤 이벤트가 발생하면 브로드캐스트 리시버를 실행해 앱이 해당상황에 맞게 동작할 수 있습니다. - 브로드캐스트 만들기 브로드캐스트 리시버는 BroadcastReciever를 상속받는 클래스를 선언해야합니다. 또한 브로드캐스트 리시버의 생명주기는 onRecevie() 하나뿐입니다. 따라서 이 함수를 override 해줍니다. class MyReceiver : BroadcastReceiver(){ override fun onRecevie(context: Context, intent: Intet){ } } 특히 onRecevie는 10초이내에 완료할 것을 권장함으로 오래걸리는 작업을 담기에는 부적절합니다..
- ANR 문제 ANR(activity not response)는 액티비티가 응답하지 않는 오류 상황을 의미합니다. 액티비티를 작성할때 ANR을 고려하지않으면 앱이 수시로 종료될 수 있습니다. 액티비티가 사용자 이벤트에 5초이내에 반응하지않으면 ANR 오류가 발생합니다. 즉, 시스템의 수행 흐름에서 시간이 오래 걸리는 작업이 끝나지 않으면 사용자 이벤트에 반응하지 못합니다. 오래 걸리는 작업이 있다면 사용자가 기다려주면 되지만 사용자가 언제 터치할지 모르기때문에 항상 ANR 오류를 고려해야합니다. 특히 액티비티에서 시간이 오래 걸리는 대표적인 작업은 네트워크입니다. 물론 앱은 대부분 네트워크 통신을 지원하는 전문 라이브러리(Volley 또는 Retrofit2)를 사용해서 만들며 이 라이브러리를 사용할때는..
- 태스크 액티비티 태스크란 앱이 실행될때 시스템에서 액티비티의 각종 정보를 저장하는 공간입니다. 시스템의 stack처럼 뒤돌아가기 버튼을 눌렀을때 어떤 액티비티로 돌아가야하는지를 저장하는 공간입니다. 예를 들어 A_OneActivity와 A_TwoActivity가 한 앱에 있을때 순서대로 A_OneActivity -> A_TwoActivity를 실행한다면 태스크에는 아래와 같이 저장됩니다. 그렇다면 실행하는 앱마다 태스크는 하나만 존재할까요? 그렇지는 않습니다. 이번에는 앱과 앱이 연동되어 실행되는 구조를 알아보겠습니다. 아래와 같은 실행 구조가 있다고 가정해보겠습니다. 그러면 아래와 같이 태스크가 구성됩니다. 그렇다면 아래와 같은 경우는 어떨까요? 아래와 같이 태스크가 구성됩니다. - 태스크 제어 원..
- 액티비티 상태 액티비티를 다룰때는 생명주기를 이해하고 각 상황에 맞게 대처해야합니다. 여기서 생명주기란 액티비티가 생성되어 소멸하기까지의 과정을 말하며 액티비티 클래스는 액티비티가 상태변화를 알아차릴 수 있는 여러가지 콜백 함수를 제공합니다. 이 콜백 함수에 액티비티 상태가 바뀔때마다 앱이 어떻게 동작해야하는지를 구현합니다. 액티비티의 상태는 다음처럼 크게 3가지로 구분할 수 있습니다. 활성 : 액티비티 화면이 출력되고있고 사용자가 이벤트를 발생시킬 수 있는 상태 일시 정지 : 액티비티의 화면이 출력되고 있지만 사용자가 이벤트를 발생시킬 수 없는 상태 비활성 : 액티비티의 화면이 출력되고 있지 않은 상태 - 활성 상태 활성 상태는 액티비티가 실행되어 화면에 나오고 사용자 이벤트를 처리할 수 있는 상태..
- 인텐트 인텐트란 한마디로 컴포넌트를 실행하려고 시스템에 전달하는 메시지라고 정의할 수 있습니다. 즉, 기능을 수행하는 함수를 제공하는 클래스가 아니라 데이터를 담는 클래스입니다. 이 인텐트 데이터는 컴포넌트를 실행하는 정보이며 이 정보가 담긴 인텐트 객체를 시스템에 전달하며 컴포넌트가 실행됩니다. 인텐트가 무엇인지 알아보고자 한 앱에 MainActivity와 DetailActivity거 있다고 가정해봅시다. MainActivity가 실행되고나서 DetailActivity로 화면을 전환한다면 DetailActivity 클래스의 객체를 생성해서 실행하면 되지만 만약 DetailActivity가 안드로이드의 컴포넌트 클래스라면 개발자가 코드에서 직접 생성해서 실행할 수 없습니다. 이때는 시스템에게 Deta..
- 플로팅 액션 버튼 확장된 플로팅 액션버튼은 화면에 떠 있는 듯한 버튼을 제공하는 뷰입니다. 대체로 아래와 같이 사용합니다. icon 속성으로 이미지를 지정하고 text 속성으로 문자열을 지정할 수 있습니다. 19장까지 만들었던 앱위에 플로팅 액션버튼을 올려보겠습니다. - 메인 xml 플래그 부분에 constrain 레이아웃을 설정해주고 그 위에 플로팅 액션버튼을 놓아줍니다. - 메인 액티비티 버튼 클릭시 동작을 설정해줍니다. 버튼이 눌리면 글씨가 보였다가 안보였다가 반복하는 코드를 써줍니다. //확장된 플로팅 액션버튼 조절 binding.extendedFAB.setOnClickListener{ when(binding.extendedFAB.isExtended){ //글씨가 보이거나 안보인다면 true ..