본문 바로가기
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");
}
}

댓글