[개요]
Application 차원에서 신호를! 송수신하는 Component
system or Application 에서도 Intent Fillter를 통해 메시지 송수신 가능.
※ when to use?
시스템의 화면 꺼짐, 화면 캡쳐, SMS 문자 수신, , 배터리 부족, 충전 등
앱단이 아닌 시스템상에 일어나는 작업들의 송/수신에 사용한다.
[특징]
API Level 26부터 background 수신 불가능 (Exception. 일부 앱)
∵ system 메시지 수신을 위해 background 메모리 리소스 소모가 커져서 막아둠. (배터리 사용량 大)
앱이 실행되는 동안에만 (foreground) 수신 가능.
[사용]
등록(registerReceiver) 및 해제(unregisterReceiver) 위치
- onCreate & onDestroy
- onResume & onPause
// 브로드캐스트 수신 객체 생성
val broadCastReceiver = BroadCastReceiver()
val filter = IntentFilter()
// 필터 설정
filter.addAction(Intent.ACTION_POWER_CONNECTED)
filter.priority = IntentFilter.SYSTEM_HIGH_PRIORITY
브로드캐스트 리시버 , 필터 등록
registerReceiver(broadCastReceiver, filter)
abortBroadcast() : 브로드캐스트 사용 중단
보통 하나의 앱에서 브로드캐스트 수신 시 다른 앱들은 해당 원인에 의한 브로드캐스트 수신 X
[예제]
<customviewbattery_toast_messsage.xml>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:gravity="center"
android:background="@drawable/custom_battery_toast"
android:layout_marginHorizontal="80dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_battery_charging_full_24"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="@color/white"
android:textSize="20sp"
android:text="battery is charging!"/>
</LinearLayout>
<MainActivity.kt>
package com.example.broadcastreceiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.widget.Toast
class MainActivity : AppCompatActivity() {
lateinit var broadcastReceiver: BroadcastReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
fun showCustomToast() {
val inflater = layoutInflater
val targetView = inflater.inflate(R.layout.battery_toast_messsage, null)
val toast = Toast(this)
toast.apply {
view = targetView
duration = Toast.LENGTH_SHORT
setGravity(Gravity.CENTER_VERTICAL, 0, 0)
setMargin(0.0f, 15.0f)
show()
}
}
private fun init() {
broadcastReceiver = object : BroadcastReceiver() {
// broadCast 신호를 수신시점에 호출될 callback Method
override fun onReceive(context: Context?, intent: Intent?) {
if (intent != null) {
if(intent.action.equals(Intent.ACTION_POWER_CONNECTED))
showCustomToast()
}
}
}
}
// broadCastReceiver 등록
override fun onResume() {
super.onResume()
val filter = IntentFilter()
// 파워 연결에 대한 액션을 IntentFilter에 등록
filter.addAction(Intent.ACTION_POWER_CONNECTED)
filter.priority = IntentFilter.SYSTEM_HIGH_PRIORITY
registerReceiver(broadcastReceiver, filter)
}
// broadCastReceiver 해제
override fun onPause() {
super.onPause()
unregisterReceiver(broadcastReceiver)
}
}
'Android' 카테고리의 다른 글
[Android] Service (feat. Thread) (0) | 2020.06.20 |
---|---|
[Android] drawable resize, customizing (0) | 2020.06.20 |
[Android] AsyncTask (0) | 2020.05.19 |
[Android] Setting Export/Import (0) | 2020.05.04 |
[Android] Android Studio 자주쓰는 단축키 정리 (0) | 2020.05.04 |