브로드 캐스트 리시버
브로드캐스트는 말그대로 방송을 하는것, 방송의 특징을 생각해보면, 방송국은 불특정 다수에게 송신을하고, 필요한 사람은 수신을 하는 구조이다. 경우에 따라서 특정사람에게만 송신되는 경우도 있다. 안드로이드도 이와 별반 다를 것이 없다. 네트워크분야에도 유니캐스트, 멀티캐스트, 브로드캐스트가 존재하는데, 개념자체는 매우 흡사하다.
단말기의 상태 변화나 다른앱이 송신하는 방송에 귀를 기울이고 있으면 , 여러 현상에 대한 처리가 가능하다. 예를 들면 배터리의 상태가 15%이하가 되면 절전모드에 들어가도록 할 수 있다.
이때 방송에 귀 기울이고 있는 수신자가 바로 브로드캐스트 리시버이다. 브로드캐스트 리시버는 4대 컴포넌트 중에 하나이다.
출처: https://brunch.co.kr/@mystoryg/48
1. manifest에 권한주기
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
브로드캐스트리시버라고 해서 무조건 네트워크 상태값을 가져오는것이 아님. 활용도는 무궁무진함
와이파이나 3g,4g네트워크 상태, 배터리상태 등 다양하게 받아옴
Intent내가 지금 이 기능을 쓸거야
IntentFilter는 내가 이 기능(receiver)을 만들었으니까 와서 써
쓰레드처럼 백그라운드에서 도는 기능이기 때문에
register와 unregister신경써야
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverexample">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BroadcastReceiverExample">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Receive.js
package com.example.broadcastreceiverexample;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.widget.TextView;
public class networkreceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 네트워크 상태값 받아오기
if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction()));{
NetworkInfo info = (NetworkInfo)intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
NetworkInfo.DetailedState state = info.getDetailedState();
if(state == NetworkInfo.DetailedState.CONNECTED) {
MainActivity.tv_state.setText("네트워크연결완료");
//네트워크 연결 상태이면..
}
else if(state == NetworkInfo.DetailedState.DISCONNECTED){
//네트워크가 연결 해제이면
MainActivity.tv_state.setText("네트워크연결해제");
}
}
}
}
Main.js
package com.example.broadcastreceiverexample;
import androidx.appcompat.app.AppCompatActivity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
public static TextView tv_state; //static해서 다른클래스 사용가능 + public도 했음
private networkreceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_state = findViewById(R.id.tv_state);
//브로드 캐스트 리시버 등록!
IntentFilter filter = new IntentFilter(); //거름망으로 걸러서 네트워크 체인지 액션을 하는기능으로 네트워크 리시버를 사용했음
receiver = new networkreceiver();
//사용가능해짐
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//네트워크 변화되는 상태값을 intent에 추가, 액션시작
registerReceiver(receiver,filter);
//리시브 작동 시작!, unreister를 하지 않는이상 계쏙 네트워크를 체크할것임
}
@Override
protected void onDestroy() {
super.onDestroy();
//브로드캐스트 리시버해제
//를 해줘야 앱을 종료하고도 돌지않음. 안끄면 스마트폰 과부하!
unregisterReceiver(receiver);
}
}
결과
'✍2021,2022 > app(android studio)' 카테고리의 다른 글
앱만들기.32(VideoView) (0) | 2021.08.04 |
---|---|
앱만들기 (캘린더) - 진행 中 (0) | 2021.08.03 |
앱만들기.28(Login&Register)[하다말았음] (0) | 2021.08.03 |
앱만들기29.(RelativeLayout) (0) | 2021.08.03 |
앱만들기.27(LinearLayout) (0) | 2021.08.02 |