티스토리 뷰

Android

서비스 예시

varyeun 2020. 4. 1. 22:42

서비스 : 애플리케이션 구성요소로 화면 없이 백그라운드에서 실행되는 하나의 단위

- startService 메소드를 호출할 때도 인텐트 객체를 파라미터로 전달해야 하며 이 인텐트 객체는 시스템으로 전달된 후 시스템에서 지정한 서비스를 만들고 실행하는 과정을 거치게 된다.

- onStartCommand 메소드가 호출되면 인텐트 객체를 파라미터로 전달받을 수 ㅇ, 따라서 인텐트 안에 들어있는 명령이나 데이터를 확인하여 필요한 기능을 수행할 수 ㅇ

- 서비스에서 액티비티로 인텐트를 보낼 때 액티비티에서 onNewIntent 메소드가 자동으로 호출된다.

 

로그로 액티비티에서 서비스로 데이터 온거 확인 가능

MainActivity.java

package com.example.myservice;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText);
        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);
            }
        });
        //밑의 onNewIntent 방법 아니면~
        //Intent passedIntent = getIntent();
        //processCommand(passedIntent);
    }

    //서비스에서 onCreat()는 한 번만 호출되고 나중에 onStartCommand()가 호출되는거랑 같은 식
    @Override
    protected void onNewIntent(Intent intent) {
        //processCommand(intent);
        if(intent != null){
            String command = intent.getStringExtra("command");
            String name = intent.getStringExtra("name");
            Toast.makeText(this,"서비스로부터 전달받은 데이터 : "+command+", "+name,Toast.LENGTH_LONG).show();
        }
        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();
        }
    }
}

MyService.java

package com.example.myservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

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

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //서비스는 한번 만들어지면 계속 실행되기 때문에 intent는 onStartCommand에서 처리됨
        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() {
        super.onDestroy();
        Log.d(TAG, "onDestroy() 호출됨");
    }

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