안드로이드 프로그래밍 서비스와 방송 수신자 장 원 영 실습파일 : http://goo.gl/Nans04.

Slides:



Advertisements
Similar presentations
Services. Application component No user interface Two main uses Performing background processing Supporting remote method execution.
Advertisements

Cosc 5/4730 Android Services. What is a service? From android developer web pages: Most confusion about the Service class actually revolves around what.
Monitoring battery use. New app, BatteryMonitor Add permission: BATTERY_STATS The battery is monitored by receiving broadcasts of battery state information.
안드로이드 세미나 김동민.
1 Working with the Android Services Nilanjan Banerjee Mobile Systems Programming University of Arkansas Fayetteville, AR
Cosc 5/4730 Android SMS. A note first Depending on the API level, an import changes because of a deprecated API 3 uses – import android.telephony.gsm.SmsManager;
System broadcasts and services. System broadcast events. EventDescription Intent.ACTION_BOOT_COMPLETEDBoot completed. Requires the android.permission.RECE.
SMS Read received SMS Read sent SMS Send SMS New app, SMSFun Button – Text: Send SMS – Id: sendSMSButton Permissions – send_sms – read_sms – receive_sms.
@2011 Mihail L. Sichitiu1 Android Introduction Hello World.
Mobile Programming Lecture 9 Bound Service, Location, Sensors, IntentFilter.
Mobile Computing Lecture#08 IntentFilters & BroadcastReceivers.
8. Notification과 Alarm.
Package org.androidtown.database.query; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase;
Android Services Mobile Application Development Selected Topics – CPIT Oct-15.
COMP 365 Android Development.  Perform operations in the background  Services do not have a user interface (UI)  Can run without appearing on screen.
Mobile Programming Lecture 6
로봇 모니터링 2/2 UNIT 21 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 Broadcasting Service 2.
1 Announcements Homework #2 due Feb 7 at 1:30pm Submit the entire Eclipse project in Blackboard Please fill out the when2meets when your Project Manager.
Android Programming-Activity Lecture 4. Activity Inside java folder Public class MainActivity extends ActionBarActivity(Ctrl + Click will give you the.
Threads and Services. Background Processes One of the key differences between Android and iPhone is the ability to run things in the background on Android.
Android - Broadcast Receivers
로봇을 조종하자 3/4 UNIT 17 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 스마트 폰의 센서를 사용할 수 있다. 2.
Mobile Programming Lecture 5 Composite Views, Activities, Intents and Filters.
Import import android.graphics.Bitmap; import android.widget.ImageView;
Android 13: Services and Content Providers Kirk Scott 1.
Services A Service is an application component that can perform long-running operations in the background and does not provide a user interface. An application.
로봇 모니터링 1/2 UNIT 20 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 Message Queue Handler 2.
Activity 생명주기 UNIT 13 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 Logcat 액티비티 생명주기를 설명할 수 있다. 현재 상태를 저장할 수 있다. 2.
1 Introducing Activity and Intent. 2 Memory LinearLayout, weight=2 LinearLayout, weight=1 TextView ListView.
데이터 저장 & Fragment UNIT 28 로봇 SW 콘텐츠 교육원 조용수. 데이터 저장 & Fragment SharedPreference 로 데이터 저장 Fragment 의 이해 2.
Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按 home 鍵畫面離 開之後,音樂還是照播 – 如果再執行一次程式,新撥放的音樂會跟先前撥放的一起撥,
CHAP 11. 액티비티와 인텐트.
네트워크 전송 1/2 UNIT 29 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 Android Network 통신 2.
Android Application Lifecycle and Menus
로봇을 조종하자 4/4 UNIT 18 로봇 SW 콘텐츠 교육원 조용수. 학습 목표 Intent Activity 호출 2.
목차 한국기술교육대학교 강사: 김 영 준 ㈜헬로앱스 1일차 아두이노 제어 실습
Services Background operating component without a visual interface Running in the background indefinitely Differently from Activity, Service in Android.
Android and s Ken Nguyen Clayton state University 2012.
아주대학교 LifecareScienceLAB Android Seminar 3 rd class Android Software Development 2011/05/04 – p.m. 06:00 – 팔달관 409 호 아주대학교.
CHAP 14. 프로세스와 스레드. © 2012 생능출판사 All rights reserved 다중 스레딩 하나의 애플리케이션이 동시에 여러 가지 작업을 하 는 것 이들 작업은 스레드 (thread) 라고 불린다.
Speech Service & client(Activity) 오지영.
Android 基本 I/O. 基本 I/O 介面元件 在此節中主要介紹常見的 I/O 使用者介 面元件 – Button, TextView, 以及 EditText , 學習者可以學會: – Android 的視窗表單設計 res/layout/main.xml – Android SDK –
CMPE419 Mobile Application Development Asst.Prof.Dr.Ahmet Ünveren SPRING Computer Engineering Department Asst.Prof.Dr.Ahmet Ünveren
Developing Android Services. Objectives Creating a service that runs in background Performing long-running tasks in a separate thread Performing repeated.
Android Introduction Hello World
CS499 – Mobile Application Development
GUI Programming Fundamentals
Android Introduction Hello World.
Android Notifications
Cleveland State University
Communication between Activities
CS499 – Mobile Application Development
CIS 470 Mobile App Development
Developing Android Services
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CIS 470 Mobile App Development
CMPE419 Mobile Application Development
UNIT 08 그림책 만들기 2/2 로봇 SW 콘텐츠 교육원 조용수.
CIS 470 Mobile App Development
CIS 470 Mobile App Development
Service Services.
CIS 470 Mobile App Development
Notifying from the Background
BLP 4216 MOBİL UYGULAMA GELİŞTİRME-2
CMPE419 Mobile Application Development
CIS 470 Mobile App Development
Mobile Programming Broadcast Receivers.
Android Sensor Programming
CIS 694/EEC 693 Android Sensor Programming
Presentation transcript:

안드로이드 프로그래밍 서비스와 방송 수신자 장 원 영 실습파일 : http://goo.gl/Nans04

목차 서비스 서비스 기초 IntentService 클래스 연결 타입의 서비스 방송 수신자란? 애플리케이션이 방송하기 중요한 방송

이 장의 주요 개념 2가지 관점을 토대로 이해 서비스 -- 클라이언트 방송수신자 -- 방송송신자

서비스 특징 액티비티, 방송 수신자, 콘텐츠 제공자와 함께 주요 컴포넌트 사용자 인터페이스를 가지지 않음 메니페스트 선언 사용자 인터페이스를 가지지 않음 서비스를 호출한 메인 스레드 안에서 실행됨 큰 작업의 경우 별도의 스레드 생성 가능 백그라운드 작업, 프로세스간 통신 배경 음악 재생 폰의 사용량을 계산 업데이트 검사

서비스 종류 시작 타입 서비스 연결 타입 서비스 startService() stopService() 백그라운드에서 무한정 실행 가능 / 일방 (UDP ?) 연결 타입 서비스 bindService() unbindService() 연결되어 있는 동안만 실행 / 상호작용 (TCP ?)

서비스 기초 서비스 준비 서비스 생성 public class MusicService extends Service { public void onStartCommand(Intent intent, int flags, int startid) { // 시작타입의 서비스 // 클라이언트가 startService() 메서드 호출해서 서비스가 시작되면.. } public IBinder onBind(Intent intent) { // 연결타입의 서비스 // 클라이언트가 binService() 메서드 호출해서 연결을 시도하면.. public void onCreate() { // 서비스 초기화 작업 public void onDestroy() { 서비스 기초 서비스 준비

src/MusicService.java public class MusicService extends Service { private static final String TAG = "MusicService"; MediaPlayer player; @Override 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 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) { Log.d(TAG, "onStartCommand()"); Toast.makeText(this, "Music Service가 시작되었습니다.", Toast.LENGTH_LONG).show(); player.start(); return super.onStartCommand(intent, flags, startId); 시작 타입의 서비스의 경우 extends Service extends IntentService

src/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); } 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));

AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MusicServiceTest" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:enabled="true" android:name=".MusicService" /> </application> <uses-sdk android:minSdkVersion="16" /> </manifest>

서비스 생애주기

IntentService 클래스 특징 시작 요청이 들어오면 작업 스레드를 별도 생성 작업 스레드는 1개만 생성됨 다중 작업 불가능 콜백 메서드 구현할 필요 없음 onHandleIntent() 메서드만 구현하면 끝

src/MyIntentService.java public class MyIntentService extends IntentService { public MyIntentService() { super("MyIntentService"); } @Override protected void onHandleIntent(Intent intent) { long endTime = System.currentTimeMillis() + 5 * 1000; Log.i("SERVICE", "onHandleIntent() "); while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) {

src/IntentServiceTest.java public class IntentServiceTest extends Activity { Intent i; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button start = (Button) findViewById(R.id.start); start.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { i = new Intent(IntentServiceTest.this, MyIntentService.class); startService(i); } }); Button stop = (Button) findViewById(R.id.stop); stop.setOnClickListener(new View.OnClickListener() { stopService(i);

연결 타입의 서비스 연결 타입의 서비스 인터페이스 생성 서비스와 클라이언트 간의 연결 매개 Binder 클래스 확장하기 Service 클래스 내부에서 정의하고 클라이언트에서 생성하여 연결함 Binder 클래스 확장하기 Messenger 클래스 사용하기 AIDL 사용하기 인터페이스를 정의하는 .aidl 파일 생성

연결 타입의 서비스 연결 타입의 서비스 인터페이스 생성 서비스와 클라이언트 간의 연결 매개 (클래스 내부에서 생성) Binder 클래스 확장하기 class LocalService extends Service - class LocalBinder extends Binder getSerivce() 구현 - 서비스에서 해야할 메서드 선언구현 (서비스가 해야할 일을 정의) 클라이언트에서 bindService() 호출 LocalService.class를 이용한 Intent + ServiceConnection 인터페이스 객체 LocalService 객체를 통해 메서드 호출 public void onServiceConnected() 메서드에서 LocalService 객체 생성

src/LocalService.java public class LocalService extends Service { // 클라이언트에게 반환되는 바인더 private final IBinder mBinder = new LocalBinder(); // 난수 발생기 private final Random mGenerator = new Random(); // 클라이언트 바인더를 위한 클래스 public class LocalBinder extends Binder { LocalService getService() { return LocalService.this; } @Override public IBinder onBind(Intent intent) { return mBinder; // 클라이언트를 위한 메소드 public int getRandomNumber() { return mGenerator.nextInt(100);

src/BoundServiceTest.java public class BoundServiceTest extends Activity { LocalService mService; boolean mBound = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } protected void onStart() { super.onStart(); Intent intent = new Intent(this, LocalService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); protected void onStop() { super.onStop(); if (mBound) { unbindService(mConnection); mBound = false; // 버튼이 클릭되면 호출된다. public void onButtonClick(View v) { int num = mService.getRandomNumber(); Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); private ServiceConnection mConnection = new ServiceConnection() { //@Override public void onServiceConnected(ComponentName className, IBinder service) { LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; public void onServiceDisconnected(ComponentName arg0) { };

연결 타입의 서비스 연결 타입의 서비스 인터페이스 생성 서비스와 클라이언트 간의 연결 매개 (클래스 내부에서 생성) Messenger 클래스 사용하기 class MessengerService extends Serivce - class IncomingHandler extends Handler public void handleMessage(Message) 구현 (서비스가 해야할 일을 정의) - new Messenger(new IncomingHandler()).getBinder()로 연결 클라이언트에서 bindService() 호출 - MessengerService.class를 이용한 Intent + ServiceConnection 인터페이스 객체 - Messenger 객체.send(매개변수) 메서드 호출을 통해 서비스 이용 매개변수 : handleMessage(Message)의 Message 값 Message 값 : Message.obtain() 메서드로 가져옴 public void onServiceConnected() 메서드에서 new Messenger(service) 객체 생성

res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/Button01" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="서비스에 메시지 보내기" android:onClick="sayHello"></Button> </LinearLayout>

src/MessengerService.java public class MessengerService extends Service { static final int MSG_SAY_HELLO = 1; class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } final Messenger mMessenger = new Messenger(new IncomingHandler()); public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder();

src/BoundServiceTest.java public class MessengerServiceTest extends Activity { /// 서비스와 통신하는데 사용되는 메신저 객체 Messenger mService = null; // 바운드 여부를 표시한다. boolean mBound; // 서비스의 인터페이스와 상호작용하는 클래스 private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mService = new Messenger(service); mBound = true; } public void onServiceDisconnected(ComponentName className) { mService = null; mBound = false; }; // 버튼이 눌려지면 실행된다. public void sayHello(View v) { if (!mBound) return; Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); protected void onStart() { super.onStart(); bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); protected void onStop() { super.onStop(); if (mBound) { unbindService(mConnection);

방송 수신자란? 방송 안드로이드 장치가 애플리케이션에게 통지 방송 내용 수신측 네트워크 연결 여부 SD 카드 삽입 여부 Intent 매개변수를 통해 전달 수신측 인텐트 필터를 통해 어떤 방송을 수신할지 지정 Manifest.xml 에서 지정 소스코드에서 지정

src/BroadcastReceiverTest.java public class BroadcastReceiverTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }

src/MyBroadcastReceiver.java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub 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();

AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kr.co.infinity.BroadcastReceiverTest" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadcastReceiverTest" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:enabled="true" android:name=".MyBroadcastReceiver"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </receiver> </application> <uses-sdk android:minSdkVersion="16" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> </manifest>

방송 수신자란? 방송 수신자의 동적 생성 Context.registerReceiver() 등록 Context.unregisterReceiver() 해제 onResume() 에서 등록 / onPause() 에서 해제 액티비티가 화면에 보이는 동안에만 방송 수신이 가능

src/DynamicBRTest.java public class DynamicBRTest extends Activity { BroadcastReceiver receiver = new BroadcastReceiver() { // 내부 무명 클래스 @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(context, "SMS가 수신되었습니다.", Toast.LENGTH_LONG).show(); } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver, filter); public void onPause() { super.onPause(); unregisterReceiver(receiver);

애플리케이션이 방송하기 방송하기 메서드 방송의 분류 sendBroadcast(Intent intent) sendBroadcast(Intent intent, String receiverPermmision) sendOrderedBroadcast(Intent intent, String receiverPermmision) 방송의 분류 일반 방송 수신자의 순서 없음 이전 수신자의 결과를 이용할 수 없음 정렬된 방송 수신자의 순서는 android:priority 로 설정. 이전 수신자의 결과를 이용할 수 있음 방송할 액션 지정된 권한을 가진 수신자에게만 방송을 보내고 싶을 때

애플리케이션이 방송하기 하나의 앱에서 다른 앱으로 방송하기 수신 ‘앱’ 방송 ‘앱'

src/MainActivity.java public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true;

src/MyBroadcastReceiver.java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Uri uri = Uri.parse("http://www.google.com"); Intent intent1 = new Intent(Intent.ACTION_VIEW, uri); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); }

src/MyBroadcastReceiver.java <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kr.co.company.mybroadcastreceiver"> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyBroadcastReceiver" > <action android:name="kr.co.company.START_WEB" /> </receiver> </application> </manifest>

src/MyBroadcastSender.java public class MyBroadcastSender extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button click = (Button) findViewById(R.id.click); click.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(); intent.setAction("kr.co.company.START_WEB"); sendBroadcast(intent); } });

중요한 방송 안드로이드 시스템의 주요 방송 메시지 http://developer.android.com/reference/android/content/Intent.html

src/BatterSDCardTes.java public class BatterySDCardTest extends Activity { TextView textfield; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textfield = (TextView) findViewById(R.id.textfield); } public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_BATTERY_LOW); filter.addAction(Intent.ACTION_POWER_DISCONNECTED); filter.addAction(Intent.ACTION_POWER_CONNECTED); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(receiver, filter);

src/BatterSDCardTes.java @Override public void onPause() { super.onPause(); unregisterReceiver(receiver); } BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Toast.makeText(context, action, Toast.LENGTH_LONG).show(); textfield.setText(action); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { int maxvalue = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0); int value = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); int level = value * 100 / maxvalue; textfield.setText(action + "\n현재 배터리 레벨=" + level); } else if (action.equals(Intent.ACTION_BATTERY_LOW)) { textfield.setText(action + "\n배터리 부족"); } else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { textfield.setText(action + "\nSD카드 장착"); textfield.setText(action + "\nSD카드 장착 해제"); };

중요한 방송 AVD 실습 Telnet localhost 5554 help power capacity 70 기본은 50으로 설정

감사합니다