1. 서비스
1) 사용자 인터페이스 없이 백그라운드에서 실행되는 컴포넌트
- 배경 음악을 재생
- 웹 사이트에서 주기적으로 데이터를 읽어오는 경우
- 주기적으로 폰의 사용량을 계산
2) 시작 타입의 서비스
- 액티비티가 startService()를 호출하여서 서비스를 시작
3) 서비스의 생명 주기
- 서비스 요청
startService()를 호출
2. 브로드캐스트 리시버(Broadcast Receiver, BR)
0) 안드로이드 장치에서는 많은 이벤트들이 발생하는데,
이벤트를 받는 컴포넌트가 방송 수신자임.
- 예) 안드로이드 시스템에서 배터리가 부족합니다 (ON AIR)
=> 방송 수신자 (앱), 방송 수신자 (앱) ....
1) 문자 메시지 도착, 배터리 방전, SD 카드 탈부착, 네트워크 환경 변화 등이 발생하면
방송(Broadcast) 신호를 보냄
2) 이러한 신호를 받아서 처리하는 것이 브로드캐스트 리시버임.
3) 예) 배터리 상태 확인
액션
ACTION_BATTERY_CHANGED : 배터리 상태가 변경되었을 때
ACTION_BATTERY_LOW : 배터리가 거의 방전되었을 때
ACTION_BATTERY_OKAY : 배터리가 방전 상태에서 정상 수준으로 돌아왔을 때
4) 방송 수신자의 등록 방법 변경
- 매니페스트 파일에서 선언 => 최신 버전에서는 동작하지 않음.(배터리 소모가 많음)
- 자바 코드에서 동적으로 등록함
- API 26(Android 8.0)부터 대부분의 암시적 방송 수신자의 경우
registerReceiver()을 사용하여 코드에 등록.
3. 콘텐트 프로바이더 (Content Provider, CP)
1) 다른 앱에 데이터를 공급하는 역할을 하는 컴포넌트임.
2) 안드로이드는 보안상 앱에서 사용하는 데이터를 외부에서 접근할수 없음.
3) 파일이나 데이터베이스를 외부 앱에서 사용하도록 하려면 CP를 만들어서 외부로 제공.
4) 데이터 공급을 데이터 계층과 앱 계층을 분리하는 역할을 함.
5) 앱간에 데이터를 공유하는 가장 바람직한 수단
6) 콘텐트 제공자
- Browser (북마크, 검색 기록 등)
- CallLog (착발신 기록, 부재중 전화 등)
- CantactsContract (주소록 기록)
- MediaStore (오디오, 비디오, 이미지 데이터)
- Calendar (일정,이벤트 등)
- Setting (장치 환경 설정 데이터)
7) 콘텐트 제공자로부터 데이터 읽기
- CP를 통하여 데이터를 읽을 수 있는 권한을 매니페스트 파일에 표시함
- 권한을 동적으로 요청하고, 쿼리를 작성하여 실행함
- 쿼리의 결과로 반환된 레코드들을 커서 객체를 통하여 순회하면서 처리함.
- CP는 RDBMS의 테이블 형태로 데이터를 외부 앱에 제공함.
8) MediaStore 사용하여 파일 열기
- 쿼리 작성하기 (DB SELECT 쿼리문과 유사)
- query() 인수
- Uri (From table_name)
- projection (col,col,col,....)
- selection (WHERE col = value)
- sortOrdedr (ORDER BY col,col...)
- 콘텐트 URI (Uniform Resource Identifier)
- 콘텐트 제공자 안의 데이터를 식별하는 URI임.
- 안드로이드에 내장되어 있는 콘텐트 제공자들은 URI 객체를 상수로 제공함.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
package kr.co.batterystatus;
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.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.ic_launcher);
textView = findViewById(R.id.textView);
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, action, Toast.LENGTH_LONG).show();
textView.setText(action);
// 방송이 수신되면 방송 내용을 화면에 출력함
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
int maxvalue = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 0);
int value = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int level = value * 100 / maxvalue;
textView.setText(action + "\n 현재 배터리 레벨=" + level);
}
else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
textView.setText(action + "\n 배터리 부족" );
}
else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
textView.setText(action + "\n SD 카드 장착");
}
else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) {
textView.setText(action + "\n SD 카드 장착 해제");
}
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
registerReceiver(receiver, filter); //방송 수신자를 동적으로 등록함
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
}
'App > Android Java' 카테고리의 다른 글
Android_Java(36) - UsingMediaStore (0) | 2022.02.23 |
---|---|
Android_Java(34) - ServiceLifeCycle (0) | 2022.02.23 |
Android_Java(33) - MusicService (0) | 2022.02.23 |
Android_Java(32) - ImageDownload (0) | 2022.02.15 |
Android_Java(31) - AsyncTask (0) | 2022.02.15 |
댓글