12. 서비스와 방송수신자
Download
Report
Transcript 12. 서비스와 방송수신자
CHAP 12. 서비스와 방송 수신자
서비스
사용자 인터페이스 없이 백그라운드에서 실행되는
컴포넌트
배경 음악을 재생
웹 사이트에서 주기적으로 데이터를 읽는다.
주기적으로 폰의 사용량을 계산
애플리케이션의 업데이트를 주기적으로 검사
© 2012 생능출판사 All rights reserved
실제 실행중인 서비스
© 2012 생능출판사 All rights reserved
서비스의 종류
시작 타입의 서비스(started service)
액티비티가 startService()를 호출하여서 서비스를 시작
연결 타입의 서비스(bound service)
액티비티가 bindService()를 호출하여서 서비스를 시작
© 2012 생능출판사 All rights reserved
서비스 예제
배경에서 음악을 연주하는 서비스를 작성하여 보자.
© 2012 생능출판사 All rights reserved
리소스 준비
mp3 형식의 음악 파일을 하나 다운로드받아서
/res/raw 디렉토리에 old_pop.mp3와 같은 이름으
로 저장한다.
© 2012 생능출판사 All rights reserved
음악을 연주하는 서비스
public class MusicService extends Service {
private static final String TAG = "MusicService";
MediaPlayer player;
public IBinder onBind(Intent intent) {
return null;
}
public void onCreate() {
Log.d(TAG, "onCreate()");
player = MediaPlayer.create(this, R.raw.old_pop);
player.setLooping(false); // Set looping
}
© 2012 생능출판사 All rights reserved
음악을 연주하는 서비스
public void onDestroy() {
Toast.makeText(this, "Music Service가 중지되었습니다.",
Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy()");
player.stop();
}
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Music Service가 시작되었습니다.",
Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart()");
player.start();
return super.onStartCommand(intent, flags, startId);
}
}
© 2012 생능출판사 All rights reserved
매니페스트 파일
<manifest
...
<application
<activity
<service
...
</activity>
android:enabled="true"
android:name=".MusicService“
/>
</application>
</manifest>
© 2012 생능출판사 All rights reserved
서비스 사용 예제
앞의 서비스를 사용하는 예제를 작성
먼저 다음과 같은 인터페이스를 XML로 작성
© 2012 생능출판사 All rights reserved
사용자 인터페이스
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top|center"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="20dp"
android:text="음악 서비스 테스트"
android:textSize="20sp" />
<Button
android:id="@+id/start"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="시작" >
</Button>
<Button
android:id="@+id/stop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="중지" >
</Button>
</LinearLayout>
© 2012 생능출판사 All rights reserved
MUSICSERVICETEST.JAVA
...
public class MusicServiceTest extends Activity implements
OnClickListener {
private static final String TAG = "MusicServiceTest";
Button start, stop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
start.setOnClickListener(this);
stop.setOnClickListener(this);
}
© 2012 생능출판사 All rights reserved
MUSICSERVICETEST.JAVA
public void onClick(View src) {
switch (src.getId()) {
case R.id.start:
Log.d(TAG, "onClick() start ");
startService(new Intent(this, MusicService.class));
break;
case R.id.stop:
Log.d(TAG, "onClick() stop");
stopService(new Intent(this, MusicService.class));
break;
}
}
}
© 2012 생능출판사 All rights reserved
실행 결과
© 2012 생능출판사 All rights reserved
서비스의 생애주기
© 2012 생능출판사 All rights reserved
IntentService 클래스
Service 클래스 : 만약 서비스에서 하는 작업이 상당
히 시간을 많이 요구하는 작업이라면 서비스 안에서
새로운 스레드를 생성하는 것이 좋다.
IntentService 클래스:이 클래스는 시작 요청이 들
어올 때마다 이것을 처리하는 작업 스레드를 별도로
생성한다.
© 2012 생능출판사 All rights reserved
연결 타입의 서비스
© 2012 생능출판사 All rights reserved
서비스 인터페이스를 정의하는 3가지의 방
법
Binder 클래스 확장하기
Messenger 클래스 사용하기
Using AIDL
© 2012 생능출판사 All rights reserved
방송 수신자
안드로이드 장치에서는 많은 이벤트들이 발생한다.
이벤트를 받는 컴포넌트가 방송 수신자이다.
© 2012 생능출판사 All rights reserved
방송 수신자의 구조
© 2012 생능출판사 All rights reserved
방송 수신자의 인텐트 필터
© 2012 생능출판사 All rights reserved
예제: 문자 메시지를 받는 방송 수신자
문자가 수신되면 이것을 화면에 표시한다.
가계부 프로그램에 필수
© 2012 생능출판사 All rights reserved
방송 수신자 작성
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n" ;
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}
}
© 2012 생능출판사 All rights reserved
매니페스트 파일 수정
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kr.co.company.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
…
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
…
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
© 2012 생능출판사 All rights reserved
문자 메시지를 보내는 방법
© 2012 생능출판사 All rights reserved
실행 결과
© 2012 생능출판사 All rights reserved
애플리케이션이 방송하기
sendBroadcast(Intent intent)
sendBroadcast(Intent intent, String
receiverPermission)
sendOrderedBroadcast(Intent intent, String
receiverPermission)
매개 변수 intent는 방송할 액션이다. 매개 변수
receiverPermission은 지정된 권한을 가진 수신자에게만
방송을 보내고 싶을 때 사용한다.
© 2012 생능출판사 All rights reserved
예제
간단하게 두 개의 애플리케이션을 작성하여서 한쪽
에서는 방송을 보내고 다른 쪽에서는 방송을 수신하
여 보자.
© 2012 생능출판사 All rights reserved
방송 수신자
© 2012 생능출판사 All rights reserved
매니페스트 파일
© 2012 생능출판사 All rights reserved
테스트 애플리케이션
© 2012 생능출판사 All rights reserved
방송 수신자 예제 실행 결과
© 2012 생능출판사 All rights reserved
중요한 방송
© 2012 생능출판사 All rights reserved
예제: 배터리 변경 사항 출력
© 2012 생능출판사 All rights reserved
© 2012 생능출판사 All rights reserved
매니페스트 파일
© 2012 생능출판사 All rights reserved
실행 결과
© 2012 생능출판사 All rights reserved