📌 개요
Service에서 Thread를 활용하여 쓰레드의 활동을 실시간으로 Log를 통해 확인한다.
📌 실행 동영상
📌 기능
- Radio버튼을 4가지 종류를 만들고, 한가지만 선택되도록 한다.
- 기본값은 100ms로 설정한다.
- SERVICE ON/OFF 버튼으로 Service를 시작 종료 하게 한다.
- SERVICE ON 클릭시 서비스 시작하며, 로그창에 "Start Service"라는 문구가 출려되게 한다.
- SERVICE ON 클릭시 입력창에 아무런 값이 없다면 서비스만 시작하고, 입력한 값이 있다면 선택된 인터벌마다 입력된 값을 로그에 출력 (예시: “Content = youngmin, Interval = 100ms”)
- SERVICE OFF를 누르면 로그에 "End Service"를 출력하며 서비스를 종료시킨다.
- COUNT ON/OFF 버튼은 서비스에서 숫자세기 시작/종료시 사용한다. 다만 SERVICE가 켜져 있을시에만 동작한다.
- "COUNT ON" 클릭시 숫자세기를 시작한다. 선택된 인터벌마다 숫자를 로그에 출력한다 (예시: "Count = 0, Interval = 100ms")
- 숫자는 0부터 시작하여 인터벌마다 1씩 증가한다.
- SERVICE에 클릭시 출력되는 인터벌 출력과는 무관하게 동작해야 한다.
- COUNT OFF 클릭시 숫자세기를 종료하지만 SERVICE는 OFF되지 않는다.
- SERVICE 안에서 쓰레드를 이용하여야한다.
📌 중요한 코드 설명
■ RadioGroup 🔑
RadioButton을 RadioGroup으로 감싸주면 RadioGroup안에서 한 버튼만 선택될수 있다. 중복 불가. 또 RadioGroup의 메소드를 이용하여 쉽게 어느것이 현재 체크되었는지 파악할수 있는 장점이 있다.
두가지 메소드중 한가지를 이용하면 된다. 코드길이는 비슷함
라디오그룹.setOnCheckedChangeListener() : 자동으로 들어있는 인자 i는 int값으로 현재 체크된 버튼의 고유 id를 닮고 있다.
라디오그룹.getCheckedRadioButtonId() : 선택된 라디오버튼의 아이디를 리턴한다.
■ Service ❗❗ 중요 ❗❗
developer.android.com/guide/components/services?hl=ko
onCreate() : 서비스가 시작될 때 1번 실행됨.
onStartCommand() : 다른 액티비티(구성요소)가 서비스에게 Intent 사용을 요청할 때 사용한다. 서비스가 만약에 실행되어있는데 서비스를 생성하라하면 onCreate함수를 실행시키는 것이 아닌 이것이 실행됨. 따라서 무한히 사용 가능.
onDestory() : 서비스가 종료될 때 실행됨
■ Thread ❗❗ 중요 ❗❗
<참고>
서비스 vs 쓰레드
서비스는 메인스레드에서 동작하지만 스레드는 별도의 스레드에서 동작한다.
서비스는 안드로이드의 4대 구성요소로 강제 종료되어도 시스템이 자동시작시켜주나 스레드는 그렇지 않음.
안드로이드를 실행시키면 메인쓰레드가 자동생성되어 이벤트 처리를 스레드에서 하는것임.
서비스도 메인쓰레드에서 돌아감.
서비스는 사용자와 상효작용과 관련이 없는 백그라운드 작업 ( 음악재생, 다운로드)에 적합하며, 스레드는 포그라운드에서 앱이 사용자와 상호작용하는 과정에 적합하다.
그렇다고 모든 상호작용에서 쓰레드를 쓰는것이 아니라 시간이 오래걸리는것에 주로 사용한다.
만약 서비스에서 쓰레드를 생성했을때, 서비스를 종료한다 하더라도 스레드는 자동종료되지 않음 . 직접 종료시켜야함. 만약 종료 시키지 않고 서비스만 종료시키면 생기는 것이 좀비 프로세스! 주로 destory에서 종료시켜줌.
액티비티에서 쓰레드를 생성하더라도 Ondestory에서 종료시켜줘야됨.
이번 앱에서는 서비스안에다가 쓰레드를 생성하였다. 그렇다면 언제 서비스 안에 쓰레드를 생성해야 될까? 상호작용과 관련이 없으며 오래걸리거나 무한루프를 돌아야하는 것들은 서비스 안에 쓰레드를 생성해야 한다. 그리고 반드시 서비스의 Ondestory에서 종료시켜야한다.
위와 같은 원리로 이번 앱에서 Log를 찍는것은 사용자와 상호작용이 필요없으므로 서비스를 생성하였고, 무한루프를 돌아야하기때문에 서비스 안에다가 쓰레드를 생성하여 구현하여야 한다.
■ Broadcast & BroadcastReceiver
intent를 Broadcast로 보내고 받는사람이 BroadcastReceiver로 선택적으로 받는다.
Intent intent = new Intent(); //보내는 액티비티에서 쏘는 문
if(조건식){
intent.setAction(IntervalService.ACTION_START_COUNTING);
}
else{
intent.setAction(IntervalService.ACTION_STOP_COUNTING);
}
sendBroadcast(intent);
BroadcastReceiver br = new BroadcastReceiver(){ //서비스에서 받는 문
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
if(action.equals(ACTION_START_COUNTING)){
thread.start();
}
else if (action.equals(ACTION_STOP_COUNTING)){
thread.stop();
}
}
}
받기위해선 우선적으로 registerReceiver(br, intentFilter)함수로 등록해주어야함.
아래 참고 주로 oncreate에 넣어줌.
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_START_COUNTING);
intentFilter.addAction(ACTION_STOP_COUNTING);
registerReceiver(broadcastReceiver, intentFilter);
브로드캐스트 쓰지 않고 구현햇는데 2가지 경우라 복잡하지 않았지만 더 많은 경우를 위해서 브로드 캐스트와 브로드캐스트리시버 쓰는 법을 알아두어야 할 것 같다.
'🎈 안드로이드' 카테고리의 다른 글
[Java] 배우들의 영화정보 API로 가져오는 앱 with 안드로이드 스튜디오(미완성) (1) | 2020.12.03 |
---|---|
[Java] 네트워킹 in 안드로이드 스튜디오 (0) | 2020.11.19 |
[Java] 연락처 저장 앱 with 안드로이드 스튜디오 (2) | 2020.11.09 |
[Java] Navigation 이용한 Photos SlideShow App with 안드로이드 (3) | 2020.11.09 |
[Java] 안드로이드 스튜디오 기초 함수모음 (0) | 2020.10.12 |