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"); } }
'Android' 카테고리의 다른 글
[Android] 안드로이드 : 위험권한 부여하기 (0) | 2019.12.11 |
---|---|
[Android] 안드로이드 : 브로드캐스트 수신자 (0) | 2019.12.10 |
[Android] 안드로이드 : 액티비티 수명주기 (0) | 2019.12.10 |
[Android] 안드로이드 : 부가데이터 (0) | 2019.12.09 |
[Android] 안드로이드 : 인텐트(Intent) (0) | 2019.12.05 |
댓글