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 |
댓글