안드로이드 앱은 안드로이드 시스템 혹은 다른 안드로이드 앱 간에 메시지를 주고 받을 수 있다.
앱에서 특정 브로드캐스트를 받기 위해서
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest >
<application ... >
<!-- 생략 -->
<receiver
android:name=".SystemBroadcastReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
SystemBroadcastReceiver.java
public class SystemBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "SystemBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sb = new StringBuilder();
sb.append("Action: " + intent.getAction() + "\n");
sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
String log = sb.toString();
Log.d(TAG, log);
Toast.makeText(context, log, Toast.LENGTH_LONG).show();
}
}
실행 결과: 에어플래인 모드를 켜고 끌때마다 토스트 메시지와 로그가 출력됨
SystemBroadcastReceiver 객체 생성
BroadcastReceiver br = new SystemBroadcastReceiver();
IntentFilter생성하고 registerReceiver()로 등록
IntentFilter filter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);
등록을 취소하려면 unregisterReceiver() 호출
public class MainActivity extends AppCompatActivity {
BroadcastReceiver mSystemBR;
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSystemBR = registSystemBR();
//...
}
private BroadcastReceiver registSystemBR() {
SystemBroadcastReceiver my_br = new SystemBroadcastReceiver();
IntentFilter intentFilter_br = new IntentFilter();
intentFilter_br.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intentFilter_br.addAction(Intent.ACTION_BOOT_COMPLETED);
registerReceiver(my_br, intentFilter_br);
return my_br;
}
@Override
protected void onDestroy() {
unregisterReceiver(mSystemBR);
super.onDestroy();
}
}
배터리와 관련된 방송
액션 | 설명 |
---|---|
ACTION_BATTERY_CHANGED | 배터리의 충전 상태 변경 (매니페스트에 등록해서 받을 수 없음) |
ACTION_BATTERY_LOW | 배터리 상태가 위험 수준으로 낮아졌음 |
ACTION_BATTERY_OKAY | 배터리 상태가 위험 수준에서 양호한 상태로 전환되었음 |
ACTION_POWER_CONNECTED | 외부 전원이 연결되었음 |
ACTION_POWER_DISCONNECTED | 외부 전원이 분리되었음 |
주요한 배터리 상태변화 모터링을 위한 브로드캐스트 리시버 등록 예
mBatteryBR = new BatteryWatchBR(status_output);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(mBatteryBR, filter);
배터리의 현재상태를 확인하기 위해서는 BroadcastReceiver를 등록할 필요가 없습니다. 다음 스니펫에서와 같이 registerReceiver를 호출하여 null을 수신기로 전달하면 현재 배터리 상태 인텐트가 반환됩니다. [https://developer.android.com/training/monitoring-device-state/battery-monitoring.html]
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
배터리 상태에 대한 상세한 정보는 인텐트의 Extras에 실려 전달됨
상태 | 설명 |
---|---|
EXTRA_PLUGGED | 외부 전원에 연결되어 있는지 조사 |
EXTRA_STATUS | 배터리의 현재 상태 |
EXTRA_LEVEL | 배터리 현재 충전 레벨 |
EXTRA_HEALTH | 배터리의 성능상태 조사 |
public class BatteryWatchBR extends BroadcastReceiver {
TextView mStatus;
public BatteryWatchBR(TextView status) {
mStatus = status;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, action, Toast.LENGTH_SHORT).show();
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
* printBatteryStatus(batteryStatus);
}
private void printBatteryStatus(Intent intent) {
* int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
* int plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);
* int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);
* int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN);
String sPlug, sStatus, sHealth;
switch(plug) {
case BatteryManager.BATTERY_PLUGGED_AC:
sPlug = "AC";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
sPlug = "USB";
break;
default:
sPlug = "Battery";
break;
}
// ....
mStatus.setText(String.format("Remain: %d \nConnection: %s\n Health: %s \n Status: %s\n ",
level, sPlug, sHealth, sStatus));
}
}
권한 부여 필요
AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_SMS">
안드로이드 6.0부터는 권한 확인/요청 코드 추가 필요
예제
public class SMSBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "SMSBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
if (messages != null) {
if (messages.length == 0)
return;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < messages.length; i++) {
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
Log.i("SMSBroadcastReceiver","From " + sender + " : "+message);
Toast.makeText(context, "From" + sender + " : "+message, Toast.LENGTH_SHORT).show();
}
}
}
}