일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 급속충전기
- IOT Core
- Android
- 플라스크
- flask
- YMODEM
- 서버리스
- 에버온
- homeassistant
- thread
- 홈어시스턴트
- 펌웨어
- 파이썬
- 전기차
- 라즈베리파이
- STM32
- AWS
- raspberry
- 충전기
- everon
- 전기차충전
- OCPP
- 완속충전기
- 보안
- dynamodb
- 전기차충전기
- 안드로이드
- esp8266
- lambda
- 디자인패턴
- Today
- Total
Louie NRT Story
[안드로이드] Service 만들기 본문
작성일: 21년 12월 12일
PS. 전기차 충전기의 충전어플의 업그레이드 또는 관리 기능으로 서비스 기능을 구현하고자 함
Index
1. 소스코드
2. 동작 확인하기
3. 어플 종료시키기
4. 주저리 주저리
1. 소스코드
1) myService 코드
- 다음과 같이 추가를 해야 androidManifest에 등록됨
- 참고로 안드로이드 4대 컴포넌트(Activity, Service, BroadCast Receiver, contentProvider)는 Manifest에 등록되어야함
- Service를 수행 시켰을때 onStartCommand()가 수행됨
- Service를 종료 시켰을때 onDestroy()가 수행됨
- START_STICKY의 경우에는 서비스가 문제가 생겨 중단되더라도 스스로 다시 동작시킴(무기한 동작해야 할때 적합함)
public class MyService extends Service {
private static final String LOG_TAG = MyService.class.getSimpleName();
private Thread mThread;
private int mCount = 0;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (mThread == null){
mThread = new Thread("My Service"){
@Override
public void run(){
for (int i = 0; i < 20; i++){
mCount++;
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
Log.d(LOG_TAG, "Service 동작 중 " + mCount);
}
}
};
mThread.start();
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy() -> Start");
if (mThread != null){
mThread.interrupt();
mThread = null;
mCount = 0;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
2) MainActivity 코드
- startService()를 통하여 Service를 동작 할 수 있음
- stopService()를 통하여 Service를 중지 할 수 있음
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void startServiceThread(View view) {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
public void stopServiceThread(View view) {
Intent intent = new Intent(this, MyService.class);
stopService(intent);
}
}
3) main_activity.xml 코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startServiceThread"
android:text="ServiceThread Start"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stopServiceThread"
android:text="ServiceThread Stop"/>
</LinearLayout>
2. 동작 확인하기
- ServiceThread Start를 누르면 Thread가 실행됨
- ServiceThread Stop을 누르면 Thread가 종료됨
3. 어플 종료시키기
- "Back"버튼을 누르고 다시 어플을 실행시키고 ServiceThread Stop 버튼을 누르면 Service가 정상 종료됨
4. 주저리 주저리
- Service는 Application과 같은 Process에서 동작하기 때문에 Service의 동작이 무거울 경우 UI가 버벅일 수 있음
- App에 영향을 미치지 않기 위해서는 Thread로 동작해야함
- Start를 하였을때 Thread가 여러개 생성되지 않도록 하기 위해 해야함.
- 작업을 수행후 Service가 자동으로 종료되지 않기 때문에 Service를 따로 Destroy() 해주어야함
- Thread를 사용할지 Service를 사용할지 고민되는데 어플이 사용되는 도중에 동작해야 한다면 Thread, 어플을 Background로 하더라도 동작되게 하려면 Service.
- 현재 내가 개발하고 있는 것에는 Thread가 맞는 것으로 보임
Referece:
'전기차충전기' 카테고리의 다른 글
[전기차 충전기] OCPP 1.6 Python 예제 (3) | 2022.01.11 |
---|---|
[안드로이드] IntentService 만들기 (0) | 2021.12.12 |
[안드로이드] 잘못된 Thread 사용법 (0) | 2021.12.12 |
[안드로이드] DataBinding (0) | 2021.12.09 |
[안드로이드] View Binding (0) | 2021.12.09 |