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