※ 브로드캐스트 리시버란?
- BroadCast를 받는 기능
- 시스템은 여러가지 상황에서 다양한 메세지를 방송한다(BroadCast). 예를 들어 베터리 부족, 전원 공급장치 변화
, 네트워크 환경 변화 등등.... 이러한 시스템 환경 변화에 따른 방송을 응용프로그램에서는 항상 참고하여 적절히
대응해야 한다. 응용프로그램에서 시스템의 방송에 귀를 기울이는 것을 BR(BroadCast Receiver)라고 한다.
- 안드로이드 OS는 자신의 상태를 방송한다. 그때 응용프로그램(APP)에서 자신이 필요한 방송이 나왔을 때
그 상태에 맞게 응용프로그램을 변경 시켜줄 수 있다. 그 방송을 듣고 안듣고는 응용프로그램 마음이다.
- 리시버 구현법은 2가지가 있다. 하지만 보통은 manifest.xml에 리시브를 등록하여 구현한다.
※ 브로드캐스트 리시버 구현
사진출처 : 서울위즈 앱 창업자를 위한 안드로이드 실무 동영상
- manifest.xml 에 receiver 등록
MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
BR
//브로드 캐스트 구현 -> 리시버를 상속받는다.
public class BR extends BroadcastReceiver {
//액션의 내용을 간단하게 쓸 수 있도록 정리한 것.
final static String STRING_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
final static String STRING_POWER_DISCNNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
@Override
public void onReceive(Context c, Intent i) {
Intent intent = new Intent(c , WorkActivity.class);
//onReceive 는 모든 브로드캐스트를 받는다. 그렇기 때문에 if문을 통하여 구분해주어야 한다.
if(i.getAction().equals(STRING_POWER_CONNECTED)){
intent.putExtra("powerStatus", "power is connected");
}else if(i.getAction().equals(STRING_POWER_DISCNNECTED)){
intent.putExtra("powerStatus", "power is disconnected");
}
//새로운 task를 만든다고 보면된다
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//WorkActivity로 값을 인텐트 정보를 보낸다
c.startActivity(intent);
}
}
WorkActivity
public class WorkActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work);
//브로드캐스트 리시버에서 받은 인텐트를 처리하는 곳
Intent intent = getIntent();
String s = intent.getStringExtra("powerStatus");
TextView textView = (TextView) findViewById(R.id.tv_result);
textView.setText(s);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidex"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".WorkActivity"
android:label="브로드캐스트 리시버 테스트">
</activity>
<!-- 리시버 등록, 내가 사용할 액션들을 등록한다. 액션들은 document에 정의 되어있는 내용들이다. -->
<receiver
android:name="com.example.androidex_br.BR">
<intent-filter >
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
<activity
android:name="com.example.androidex.SecondActivity"
android:screenOrientation="landscape"
android:label="@string/activity_name">
</activity>
</application>
</manifest>
activity_work
<?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:orientation="vertical" >
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.androidex.MainActivity" >
<TextView
android:id="@+id/tv_01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
</LinearLayout>
- java 파일에 리시버 등록
BR
//브로드 캐스트 구현 -> 리시버를 상속받는다.
public class BR extends BroadcastReceiver {
TextView tv;
public BR(TextView tv) {
// TODO Auto-generated constructor stub
this.tv = tv;
}
@Override
public void onReceive(Context c, Intent i) {
//onReceive 는 모든 브로드캐스트를 받는다. 그렇기 때문에 if문을 통하여 구분해주어야 한다.
if(i.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
tv.setText("power is connected");
}else if(i.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
tv.setText("power is disconnected");
}
}
}
MainActivity
public class MainActivity extends Activity {
TextView tv;
BR br;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv_01);
br = new BR(tv);
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
//필터에 세팅
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
//BR에 필터등록
registerReceiver(br, filter);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
//시스템이 백단으로 넘어갔을 때 필터를 꺼줌
super.onPause();
unregisterReceiver(br);
}
}
※ sendBroadCast
- BroadCast를 보내는 기능
- 응용프로그램단에서 브로드캐스트를 할 수 있다.
MainActivity
public class MainActivity extends Activity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(onclick);
}
OnClickListener onclick = new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
//나의 브로드캐스트 생성
intent.setAction("com.example.androidex_br.MYBROADCAST");
//브로드캐스트 보내기
sendBroadcast(intent);
}
};
}
AndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidex"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".WorkActivity"
android:label="브로드캐스트 테스트"></activity>
<!-- 리시버 등록, 내가 사용할 액션들을 등록한다. -->
<receiver
android:name="com.example.androidex_br.BR">
<intent-filter >
<action android:name="com.example.androidex_br.MYBROADCAST"/>
</intent-filter>
</receiver>
<activity
android:name="com.example.androidex.SecondActivity"
android:screenOrientation="landscape"
android:label="@string/activity_name">
</activity>
</application>
</manifest>
BR
//브로드 캐스트 구현 -> 리시버를 상속받는다.
public class BR extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent i) {
Intent intent = new Intent(c, WorkActivity.class);
intent.putExtra("myBroadcast", "myBroadcast");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
c.startActivity(intent);
}
}
WorkActivity
public class WorkActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work);
//브로드캐스트 리시버에서 받은 인텐트를 처리하는 곳
Intent intent = getIntent();
String s = intent.getStringExtra("myBroadcast");
Toast.makeText(WorkActivity.this, s, Toast.LENGTH_LONG).show();
}
}
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.androidex.MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
activity_work
<?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:orientation="vertical" >
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>