본문 바로가기

프로그래밍 기초/Android

[Android]Android의 4대 Component

Android 4 Component

4대 Component는 반드시 AndroidMaifest.xml 에 등록을 해야 사용할 수 있다.

  1.Activity

 

  2.BroadcastReceiver

 

  3.Service

    

   Intent객체로 활성화
  4.ContentProvider 

  Content Resolver로 활성화

 


BroadcastReceiver       

단말기 안에서 이루어지는 수많은 일들을 대신해서 알려준다.

블루투스가 켜지고 와이파이가 켜지는 등 폰의 정보를 broadcast한다. 이 때 특정 broadcast가 일어날 때 해야할 작업이 있으면 broadcastReceiver를 이용해서 broadcast 를 받는다. // Intent객체로 활성화

 

 

 [BroadcastReceiver 를 만드는 방법] 

-MainActivity에서 BroadcastReceiver 추상 클래스를 상속 받아서 만든다.
-onReceive()메소드를 오버라이딩 해서 방송이 수신 되었을 때 원하는 작업을 한다.
-AndroidManifest.xm 에 등록을 해야한다.

 

MainActivity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //방송 수신자 객체 생성해서
        MyReceiver mr=new MyReceiver();
        //동작이 가능하도록 등록하기
        registerReceiver(mr,
                new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
    }

 

 MyReceiver

public class MyReceiver extends BroadcastReceiver {
    //특정 방송(비행기 모드가 on 또는 off 되었을 때)이 수신되면 호출되는 메소드
    @Override
    public void onReceive(Context context, Intent intent) {

        boolean isOn=intent.getBooleanExtra("state",false);
        if(isOn){
            Toast.makeText(context,"비행모드가 켜졌네??",
                    Toast.LENGTH_LONG).show();
        }else {
            Toast.makeText(context,"비행모드가 꺼졌네?",
                    Toast.LENGTH_LONG).show();
        }
    }
}

 

AndroidMaifest.xml (airplane모드 수신 시)

        <!--방송 수신자 객체(BroadcastReceiver)등록 하기-->
        <receiver android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <!--언제 수신 할 지-->
            <intent-filter>
                <action android:name="android.intent.action.AIRPLANE_MODE"/>
            </intent-filter>    
        </receiver>

Service    

내 어플이 활성화 되지 않더라도 백그라운드에서 동작하기 위하여 필요하다.

동작을 할 때 반드시 UI가 필요한 것은아니다. UI없이 백그라운드에서 프로그램이 도는게 필요할 때가 있다. 이 때 service를 사용한다. 주로 mp3플레이어(UI없이 음악재생 시)에 사용한다. 몰래 위치정보를 따는 기능도 가능하다.

ex)톰캣서버,오라클 // Intent객체로 활성화

 

 

 


ContentProvider  

앱끼리 서로 다른 컨텐츠를 주고받을 수 있다. contentprovider를 만들 일은 별로 없다. 만들어진 것을 사용하는 입장일 때가 많다. 데이터베이스의 테이블 같은 역활

ex)갤러리(사진),연락처 //Content Resolver로 활성화 ContentResolver는 마치 쿼리문과 비슷하다.

 

 

 

[연락처 정보를 받기]

MainActivity

  //연락처 정보를 가져오는 메소드
    public void getContacts(){
        //ContextResolver 객체의 참조값 얻어오기
        ContentResolver resolver=getContentResolver();
        //연락처 정보의 Uri(상수 객체로 미리 정의되어있음)
        Uri contactUri=
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI; //like 테이블 명
        //원하는 칼럼명 String 배열로 정의 (아이디 PK,전화번호,이름,이메일)
        String[] columns={
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
        };

        //정렬(이름에 대해서 오름차순)
        String order=ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+"ASC";
        //원하는 정보를 SELECT 하고 결과값을 Cursor type 으로 받는다.
        // .query(uri, columns, where, args, order)
        //        테이블명, 칼럼명, 조건, 인자 ,정렬,
        Cursor cursor=resolver.query(contactUri,columns,
                null,null,order);

        //Cursor 객체에서 반복문 돌면서 데이터 추출하기
        while (cursor.moveToNext()){
            long id=cursor.getLong(0);
            String phoneNumber=cursor.getString(1);
            String name=cursor.getString(2);
        }
    @Override
    public void onClick(View v) {
        int permissionCheck=
                ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_CONTACTS);
        if(permissionCheck != PackageManager.PERMISSION_GRANTED){ //권한이 없다면
            //권한을 얻어야하는 퍼미션 목록
            String[] permissions={Manifest.permission.READ_CONTACTS};
            //권한을 얻어내도록 유도한다.
            ActivityCompat.requestPermissions(this,
                    permissions,
                    0);
        }else{//권한이 있다면
            getContacts();
        }
    }

 

 

AndroidMaifest.xml  

    <!--연락처 정보에 접근하겠다는 퍼미션-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>