본문 바로가기

플밍 is 뭔들/안드로이드_인강

14-1. 브로드캐스트 리시버

※ 브로드캐스트 리시버란?
 - BroadCast를 받는 기능
 - 시스템은 여러가지 상황에서 다양한 메세지를 방송한다(BroadCast). 예를 들어 베터리 부족, 전원 공급장치 변화
   , 네트워크 환경 변화 등등.... 이러한 시스템 환경 변화에 따른 방송을 응용프로그램에서는 항상 참고하여 적절히
   대응해야 한다. 응용프로그램에서 시스템의 방송에 귀를 기울이는 것을 BR(BroadCast Receiver)라고 한다.
 - 안드로이드 OS는 자신의 상태를 방송한다. 그때 응용프로그램(APP)에서 자신이 필요한 방송이 나왔을 때 
   그 상태에 맞게 응용프로그램을 변경 시켜줄 수 있다. 그 방송을 듣고 안듣고는 응용프로그램 마음이다.
 - 리시버 구현법은 2가지가 있다. 하지만 보통은 manifest.xml에 리시브를 등록하여 구현한다.

※ 브로드캐스트 리시버 구현

사진출처 : 서울위즈 앱 창업자를 위한 안드로이드 실무 동영상
  1. 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>

  1. 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>


'플밍 is 뭔들 > 안드로이드_인강' 카테고리의 다른 글

16-1. 데이터 베이스  (0) 2016.11.28
15-1. 데이터  (0) 2016.11.28
13-2. 스레드  (0) 2016.11.28
13-1. 스레드  (0) 2016.11.28
12-2. 알람  (0) 2016.11.28