티스토리 뷰
- 브로드 캐스트 수신자는 애플리케이션 구성요소 이다.
- 화면이 없는 서비스
- 브로드 캐스팅되는 메시지를 받는것이 브로드 캐스트 수신자 라고 한다.
과연 브로드 캐스트는 뭘 하는것일까?
1 2 3 4 5 6 | 1. 애플리 케이션이 글로벌 이벤트를 받아서 처리하려면 브로드 케스트 수신자로 등록 2. 글로벌 이벤트란? "전화가 왔습니다", "문자 메시지가 도착했습니다" 와 같이 안드로이드 시스템 전체에 보내지는 이벤트 3. 브로드 캐스트 수신자는 인텐트 필터를 포함하며, 매니페스트 파일에 등록함으로써 인텐트를 받을 준비를 함. 4. 수신자가 매니페스트 파일에 등록되었다면 따로 동작하지 않는다. 5. 서비스 처럼 브로드 캐스트 수신자도 UI가 없다. 6. 브로드 캐스트란? 여러 사람들에게 한꺼번에 데이터를 뿌려주는것이다. | cs |
인텐트와 브로드 캐스트
1 2 | 1. 인텐트를 이용해서 액티비티를 실행하면 포 그라운드로 실행 되어 사용자에게 보여지지만, 브로드 캐스트를 이용해서 처리하면 백그라운드로 작동하므로 사용자가 모름 2. 인텐트를 받으면 onReceive() 메소드가 자동으로 호출 된다. | cs |
브로드 캐스트의 구분(브로드 캐스트는 크게 두가지 클래스로 구분됨)
1 2 3 | 1. 일반 브로드 캐스트(sendBoradcase() 메소드로 호출) 비동기적으로 실행되며 모든 수신자는 순서없이 실행 된다.(때로는 동시에 실행) 효율적이나, 한수신자의 처리 결과를 다른 수신자가 이용할 수 없고 중간에 취소 불가 | cs |
순서 브로드 캐스트(sendOrderedBradcase() 메소드로 호출)
1 | 1. 한번에 하나의 수신자에만 전달 되므로 순서대로 실행됨. 중간에 취소하면 그다음 수신자는 받지못함. 수신자가 실행되는 순서는 인텐트 필터의 속성으로 정할 수 있음. 순서가 같으면 임의로 실행된다. | cs |
- SMS 데이터를 받아서 처리 하는 기능 예제)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 1. Example_SMSReceiver 프로젝트 생성 2. App -> new -> other -> broadcastReceiver(SmsReceiver) 3. 메니페스트에서 SmsReceiver 확인 4. SmsReceiver.java 파일 - BroadcastReceiver 상속 - onReceive() 함수 에서는 Callback 메소드 sms 문자를 받겠다 하면 자동으로 onReceive 함수가 실행된다. 여기다가 실행 처리 하는 기능을 넣으면 될것이다. 5. broadcast 수신자라고하는것은 알아서 시스템에서 시작하므로 , 따로 할 시작할 필요가 없다. 그런데, 이것은 메니페스트에서 등록안하면, 코드에서 직접 리시버를 등록하는 경우가 있는데 같은 효과이다. 결국 두가지방법 6. 이제 SmsReceiver에서 로그를 찍어 볼 것이다. | cs |
1234567891011121314151617181920212223 package com.example.example_smsreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class SmsReceiver extends BroadcastReceiver {private static final String TAG = "SmsReceiver";@Overridepublic void onReceive(Context context, Intent intent) {// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.Log.d(TAG,"onReceive() 호출됨");// SmsReceiver를 만들어 놓고 이렇게 하면 끝이 아니다. 어떤것을 받을건지를 등록할 수 있다.throw new UnsupportedOperationException("Not yet implemented");}}cs
7. 메니페스트 파일 확인(intent-filter를 추가 한다 속성)
1234567891011121314151617181920212223242526272829303132333435363738 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.example_smsreceiver"><uses-permission android:name="android.permission.RECEIVE_SMS" /> // 권한을 허가 받아야함// 마쉬멜로 이후버전부터는 몇가지의 특정한 권한들이 위험 권한이 되어서 메니페스트만으로 등록하면안된다// 실행시 사용자들에게 권한을 받아야한다. 이것을 마쉬멜로우에서 할 수 있게되어있는데,// bulid gradle 에서 targetSdkVersion을 22로 바꾸어 주면 가능해 진다.<applicationandroid: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"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiverandroid:name=".SmsReceiver"android:enabled="true"android:exported="true">// 걸러서 SMS정보를 받기위한 코드<intent-filter><action android:name = "android.provider.Telephony.SMS_RECEIVED" />// 이렇게 되어있는것만 받겠따 -> 이제 권한을 추가 해야 하므로 SMS를 받을수 있음 위에코드로</intent-filter></receiver></application></manifest>cs
8. 이제 실제로 SMS를 받게되면 SMSRECEIVER 가 구동되는지 알아보자(실제 단말에서는 SMS 실제로 보내면 되겠지만, 가상 에뮬레이터에서는 가상으로 SMS를 보내는 방법이 있다)땡땡땡 버튼 클릭 -> Extended controls 클릭 -> Phone -> SMS 메시지를 보내보자.9. bulid.gradle 수정
12345678 defaultConfig {applicationId "com.example.example_smsreceiver"minSdkVersion 15targetSdkVersion 22versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}cs
실행 결과
이때 SmsReceiver 파일을 수정해보자.
1 2 3 | 1. SMS 리시버에서 인텐트 안에 SMS 데이터가 들어 있다. 2. intent안에 getExtra()안에 bundle 이라는 객체가 있는데 여기 bundle은 Hash Table형태인데, bundle안에 SMS 정보가 들어가 있다. | cs |
<실행 결과 >
SMS 받았을 때 화면을 띄워주고 싶은 경우에는?
1 2 | 화면 (ACTIVITY를 따로 만들어서 화면에 띄워주는것이 가능하다. 인텐트 객체를 만들어 스타트액티비티로 던져서 그것을 화면에 뿌려줄 수 있다. | cs |
화면 띄우는 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 1. app -> new -> activity ->empty activity (name: SmsActivity) 파일 생성 2. 이제부터 화면 구성을 해볼 것이다. 3. LinearLayout or RelativeLayout으로 레이아웃 구성. 4. 발신번호를 표시를 해볼것이다. 수신시각,내용,발신번호를 표시하기위한 Plain Text 3개와 버튼클릭시 창닫히게 하기 위한 button 총 4개를 레이아웃에다가 붙인다. 5. SmActivity.java로 파일로 이동 6. editText id값을 사용하기 위한 선언하기 7. finish()입력시 닫아준다. 8. Sms리시버에서 데이터보낼때? 인텐트에 넣어서 보낸다 그 기능 구현 9. SmsReceiver.java로 이동 | cs |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 package com.example.example_smsreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Build;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import java.text.SimpleDateFormat;import java.util.Date;public class SmsReceiver extends BroadcastReceiver {private static final String TAG = "SmsReceiver";private static SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm");@Overridepublic void onReceive(Context context, Intent intent) {// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.Log.d(TAG,"onReceive() 호출됨");// SmsReceiver를 만들어 놓고 이렇게 하면 끝이 아니다. 어떤것을 받을건지를 등록할 수 있다.Bundle bundle = intent.getExtras();SmsMessage[] messages = parseSmsMessage(bundle);// SMS 데이터 뽑기if(messages.length > 0){String sender = messages[0].getOriginatingAddress(); // 메시지 발신번호 (상대방 번호 받아옴)Log.d(TAG,"sender : " + sender);//String contents = messages[0].getMessageBody().toString(); // 메시지 내용을 가져옴Log.d(TAG,"contents : " + contents);Date receivedDate = new Date(messages[0].getTimestampMillis());// 발신 시각이 들어 있는것을 Date 객체로 변환 시킬 수 있다.// Date 값도 찍어 보자.Log.d(TAG,"received date" + receivedDate);sendToActivity(context , sender, contents, receivedDate);}}// 인텐트 전달시 context 객체를 넘겨주게 된다.private void sendToActivity(Context context , String sender, String contents, Date receivedDate) {Intent intent = new Intent(context,SmsActivity.class);// 브로드 캐스트 수신자는 화면에 없으므로 New Task 플래그 필요하다intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);// 수신자쪽에서 activity쪽으로 띄워준다.intent.putExtra("sender",sender);intent.putExtra("contents",contents);intent.putExtra("receivedate",format.format(receivedDate));//Date값을 문자열로 바꾸기 위해서는 위에다가 정의를 하나해야함.context.startActivity(intent);}private SmsMessage[] parseSmsMessage(Bundle bundle) {// 번들을 전달해서 뽑아도되고, 인텐트 전달해서 뽑아도된다.Object[] objs = (Object[])bundle.get("pdus");// pdus 라고 하는것은 SMS 데이터를 처리하는 SMBP 프로토콜안에 이런이름으로 들어가있다.SmsMessage[] messages = new SmsMessage[objs.length]; // message에 초기화 시킨다.for(int i=0; i< objs.length; i++){ //objs 메시지 안에 있는것들을 반복한다.// 마쉬멜로우 버전일 경우 int는 버전 넘버, M은 마쉬멜로우 버젼if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){String format = bundle.getString("format");SmsMessage.createFromPdu((byte[])objs[i],format);// pdu라는 데이터를 던져주라는것이다.}else{messages[i]= SmsMessage.createFromPdu((byte[]) objs[i]);}SmsMessage.createFromPdu((byte[])objs[i]);// pdu라는 데이터를 던져주라는것이다.// byte Array형식이다.}return messages;// bundle 객체 안에 부가데이터 이용하여 SMS 메시지 객체로 변환해서 던져준다.}// SMS 받았을때 화면을 띄워주고싶을 경우에는 ?//화면(Activty를 )따로 만들어서 화면을 띄워주는것이 가능하다 . 인텐트 객체를 만들어 스타트액티비티로 던져서// 그것을 화면에 뿌려 줄 수 있다.}cs
5. SmsAcitivity로 이동
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 package com.example.example_smsreceiver;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;public class SmsActivity extends AppCompatActivity {EditText editText;EditText editText2;EditText editText3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sms);editText = (EditText) findViewById(R.id.editText);editText2 = (EditText) findViewById(R.id.editText2);editText3 = (EditText) findViewById(R.id.editText3);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {finish();}});Intent passedIntent = getIntent();// 액티비티쪽에서 인텐트에 있는 부가데이터 처리 하기 위함. getIntent()전달인텐트확인 가능processCommand(passedIntent);}// 화면이 먼저 만들어져 있는경우에는 onNewIntent쪽으로 전달 된다.@Overrideprotected void onNewIntent(Intent intent) {processCommand(intent);super.onNewIntent(intent);}// 인텐트 처리하는 메소드private void processCommand(Intent intent) {if(intent != null){String sender = intent.getStringExtra("sender");String contents = intent.getStringExtra("contents");String receiveDate = intent.getStringExtra("receivedDate");editText.setText(sender);editText3.setText(contents);editText2.setText(receiveDate);}}}cs
실행 결과
'Android' 카테고리의 다른 글
[Android] 다양한 위젯과 이벤트 활용하기(터치이벤트) (0) | 2017.09.24 |
---|---|
[Android] 위험 권한 부여 하기 (0) | 2017.09.24 |
[Android] 서비스(Service) (0) | 2017.09.22 |
[Android] 수명주기에 따른 상태 변화 (0) | 2017.09.22 |
[Android] 액티비티의 생명주기 (0) | 2017.09.22 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 감자개발자
- 코드엔진
- 알고리즘
- 프로그래밍
- TensorFlow
- 복습
- node
- 텐서플로우
- 학교
- 리버싱
- 노드
- BFS
- Controller
- MVC
- 백준알고리즘
- C언어
- 안드로이드
- Android
- 초보자를 위한 C언어 300제
- Spring
- 개발하는 관광이
- C langauge
- 머신러닝
- 스프링
- programming
- db
- node.js
- 백준
- 감자코딩
- Algorigm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함