Louie NRT Story

[안드로이드] Service 만들기 본문

전기차충전기

[안드로이드] Service 만들기

hyeok0724.kim@gmail.com 2021. 12. 12. 14:20
반응형

작성일: 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:

https://youtu.be/8PJ12A1C35M

 

반응형
Comments