짱짱해커가 되고 싶은 나

14-2. 브로드캐스트 리시버 본문

모바일

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

동로시 2021. 2. 27. 21:20

* 브로드캐스트 리시버(BR)

BR을 활용하면 안드로이드에서 발생하는 많은 이벤트를 감지하고 이를 처리하는 앱을 작성할 수 있다.

ex) 문자 메시지, 배터리 방전, 날짜 변경 등

안드로이드는 문자 메시지 도착, 배터리 방전, SD 카드 탈부착, 네트워크 환경 변화 등이 발생하면 broadcast 신호를 보낸다. 이런 신호를 받아서 처리하는 것이 브로드캐스트 리시버다.

 

프로젝트1: 배터리 상태 표시 앱

배터리의 상태가 변할 때마다 충전 상태 이미지와 배터리 상태 출력

+ 명령 프롬프트에서 AVD 의 배터리 상태 강제 변경 가능 (Q에서는 잘 작동 안해서 9.0 AVD 사용)

 

package com.example.project14;

import androidx.appcompat.app.AppCompatActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    EditText editText;
    BroadcastReceiver br;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("배터리 상태 체크");

        imageView = (ImageView)findViewById(R.id.imageView);
        editText = (EditText) findViewById(R.id.textView);

        br = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();

                if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
                    int remain = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                    editText.setText("현재 충전량 : " + remain + "%\n");

                    if (remain >= 90) imageView.setImageResource(R.drawable.battery5);
                    else if(remain >= 70) imageView.setImageResource(R.drawable.battery4);
                    else if(remain >= 50) imageView.setImageResource(R.drawable.battery3);
                    else if(remain >= 10) imageView.setImageResource(R.drawable.battery2);
                    else imageView.setImageResource(R.drawable.battery1);

                    int plug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
                    switch(plug){
                        case 0:
                            editText.append("전원 연걸 : 안됨");
                            break;
                        case BatteryManager.BATTERY_PLUGGED_AC:
                            editText.append("전원 연결 : 어댑터 연결됨");
                            break;
                        case BatteryManager.BATTERY_PLUGGED_USB:
                            editText.append("전원 연결 : USB 연결됨");
                            break;
                    }
                }
            }
        };
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(br);
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter iFilter = new IntentFilter();
        iFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(br, iFilter);
    }
}

BroadcastReceiver 객체를 만든다.

배터리가 변화면 onReceive() 메소드가 자동으로 호출된다.

그리고 onResume()메소드를 호출한 액션을 갖고 온다.

BatteryManger.EXTRA_LEVEL은 배터리 잔량을 표시한다.

BatterManger.EXTRA_PLUGGED는 외부 전원 연결 상태를 표시한다.

onResume()인텐트 필터를 생성하고 ACTION_BATTERY_CHANGED에 액션을 추가한 뒤 BR에 등록한다.

onPause() 는 등록된 BR을 해제한다.

 

배터리를 바꾸기 위해서는 우선 telnet을 사용해야한다.

telnet localhost 5554 //AVD에 연결

auth 인증번호

 

인증번호는 emulator_console_auth_token 파일에 있고 nano ~/.emulator_console_auth_token 이렇게 치면된다.

 

이제 그 다음부터는 명령어를 치면 된다.

어댑터 연결을 빼면 배터리 부족 경고가 나온다.

 

'모바일' 카테고리의 다른 글

[안드로이드 취약점 진단] 1-1. 안드로이드 아키텍처  (0) 2022.06.07
14-3. 콘텐트 프로바이더  (0) 2021.02.27
14-1. 서비스  (0) 2021.02.27
13-3. 구글 지도  (0) 2021.02.27
13-2. 스레드  (0) 2021.02.27
Comments