오늘이라도
[Android] 12. 서비스 본문
반응형
https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- 서비스 -
▼activity_main.xml
package com.example.my13_service;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
//객체 선언
EditText editText;
Button button1, button2;
//로그캣 사용 준비
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//객체 초기화
editText = findViewById(R.id.editText);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
//기능 추가
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//editText의 텍스트를 가져오고 String 타입으로 캐스팅한다.
String name = editText.getText().toString();
Log.d(TAG, "onClick: " + name);
//컨텍스트 보내고, 무엇을 실행할지 지정
Intent intent = new Intent(getApplicationContext(), MyService.class);
//추가적인 정보 전송
intent.putExtra("command", "show");
intent.putExtra("name", name);
//intent 실행
startService(intent);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MyService.class);
//서비스 종료
stopService(intent);
}
});
}
}
▼MainActivity.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="85dp"
android:layout_marginLeft="85dp"
android:layout_marginTop="84dp"
android:ems="10"
android:inputType="textPersonName"
android:text="홍길동" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_centerHorizontal="true"
android:layout_marginStart="101dp"
android:layout_marginLeft="101dp"
android:layout_marginTop="184dp"
android:layout_marginEnd="126dp"
android:text="서비스 시작하기"
android:textSize="24sp" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:layout_marginStart="102dp"
android:layout_marginLeft="102dp"
android:layout_marginTop="332dp"
android:text="서비스 종료하기"
android:textSize="24sp" />
</RelativeLayout>
▼MyService.java
package com.example.my13_service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
//서비스 만들기
//① 패키지 우클릭 - New - Service - Service - 설정 후 Finish
//② AndroidManifest.xml에 서비스 등록 (자동)
// <service
// android:name=".MyService"
// android:enabled="true"
// android:exported="true"></service>
public class MyService extends Service {
//logt 자동 완성
private static final String TAG = "MainMyService";
public MyService() {
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: 호출됨");
}
//onStartCommand() : 서비스가 실행될 때마다 작동하는 메서드
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: 호출됨, flags : " + flags + ", startId : " + startId);
//서비스가 잘못 실행되었다면
if(intent == null) {
return Service.START_STICKY;
//Service.START_STICKY : 서비스를 끄지 않고 다시 시작
} else {
processCommand(intent);
}
return super.onStartCommand(intent, flags, startId);
}
private void processCommand(Intent intent) {
//putExtra로 보낸 정보를 받는다
//보낸 name과 받는 name이 같아야 한다
String command = intent.getStringExtra("command");
String name = intent.getStringExtra("name");
Log.d(TAG, "processCommand: " + command + ", name : " + name);
for (int i = 1; i < 2; i++) {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "Waiting: " + i + " seconds...");
}
}
//서비스 종료될때 호출되는 메서드
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: 호출됨");
}
//onBind는 이제 잘 사용하지 않는다.
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
▼AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my13_service">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
반응형
'취업성공패키지 SW 개발자 교육 > Android' 카테고리의 다른 글
[Android] 14. 터치 좌표 출력(setOnTouchListener), 터치 제스쳐 감지(GestureDetector), 조작키 감지(onKeyDown) (0) | 2020.05.25 |
---|---|
[Android] 13. SMS 메시지 수신 후 내용 출력 (3) | 2020.05.22 |
[Android] 11. Life Cycle : onCreate, onStart, onResume, onPause, onStop, onDestroy, 데이터 저장, 불러오기 (0) | 2020.05.20 |
[Android] 10. intent로 Activity 간에 데이터 주고받기, DTO 활용 / Dialog 띄우기 (0) | 2020.05.19 |
[Android] 9. Layout Inflate (0) | 2020.05.18 |