본문 바로가기
Android

[Android] 안드로이드 : 서비스

by 꿈나무 김땡땡 2019. 12. 10.

1. 서비스란?

  • 화면이 없어도 기능이 계속 동작할 수 있게 해줌
  • 비정상 종료 되어도 시스템이 자동으로 재시작 시켜줌
  • 수명주기 메소드는 onCreate, onDestroy만 있음

2. 서비스 만드는 법

  • app > 오른쪽 버튼 클릭 > New > Service
  • Service는 애플리케이션 구성요소 : AndroidManifest.xml에 등록해줘야 함 (자동으로 등록됨)
<service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>

 

  • 서비스를 사용하기 위해서는 시스템에 요청 해야 함 : 인텐트로 전달

 

3. 예시 코드

(1) activity_main.xml 

  • 버튼 만들기
  • 입력상자 만들기

(2) MainActivity.java

public class MainActivity extends AppCompatActivity {
    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editText.getText().toString();

                // 서비스 실행
                Intent intent = new Intent(getApplicationContext(), MyService.class);
                intent.putExtra("command", "show");
                intent.putExtra("name", name);
                startService(intent);
            }
        });
    }
}

 

(3) MyService.java

public class MyService extends Service {
    private static final String TAG = "MyService";

    public MyService() {
    }

    // Generate > Override Methods

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "onCreate() 호출됨");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand() 호출됨");
        if (intent == null) {
            // 서비스 종료 되어도 자동으로 실행해달라
            return Service.START_STICKY;
        } else {
            processCommand(intent);
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void processCommand(Intent intent) {
        String command = intent.getStringExtra("command");
        String name = intent.getStringExtra("name");

        Log.d(TAG, "전달받은 데이터 : " + command + ", " + name);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy() 호출됨");
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

 

 

4. 서비스 -> 시스템 -> 액티비티로 정보 보내주기

(2) MainActivity.java

public class MainActivity extends AppCompatActivity {
    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editText.getText().toString();

                // 서비스 실행
                Intent intent = new Intent(getApplicationContext(), MyService.class);
                intent.putExtra("command", "show");
                intent.putExtra("name", name);
                startService(intent);
            }
        });

        Intent passedIntent = getIntent();
        processCommand(passedIntent);

    }

    // Generate > Override Methods
    @Override
    protected void onNewIntent(Intent intent) {
        processCommand(intent);
        super.onNewIntent(intent);

    }

    private void processCommand(Intent intent) {
        if (intent != null) {
            String command = intent.getStringExtra("command");
            String name = intent.getStringExtra("name");

            Toast.makeText(this, "서비스로부터 전달 받은 데이터 : "+ command +", " + name, Toast.LENGTH_LONG).show();
        }

    }
}

 

(3) MyService.java

public class MyService extends Service {
    private static final String TAG = "MyService";

    public MyService() {
    }

    // Generate > Override Methods

    @Override
    public void onCreate() {
        super.onCreate();

        Log.d(TAG, "onCreate() 호출됨");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand() 호출됨");
        if (intent == null) {
            // 서비스 종료 되어도 자동으로 실행해달라
            return Service.START_STICKY;
        } else {
            processCommand(intent);
        }

        return super.onStartCommand(intent, flags, startId);
    }

    private void processCommand(Intent intent) {
        String command = intent.getStringExtra("command");
        String name = intent.getStringExtra("name");

        Log.d(TAG, "전달받은 데이터 : " + command + ", " + name);

        try {
            Thread.sleep(5000);
        } catch(Exception e) { }

        // 서비스에서 액티비티로 정보 보내줌
        Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
        showIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|
                            Intent.FLAG_ACTIVITY_SINGLE_TOP|
                            Intent.FLAG_ACTIVITY_CLEAR_TOP);
        showIntent.putExtra("command", "show");
        showIntent.putExtra("name", name + "from service.");
        startActivity(showIntent);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy() 호출됨");
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

댓글