티스토리 뷰

Android/정리

인텐트

란텔 2016. 5. 10. 21:11

인텐트는 안드로이드 애플리케이션 구성요소 간에 어떤 작업을 수행하기 위해 정보를 전달하는 역할을 한다.

다른 액티비티를 띄우거나 어떤 기능을 동작하게 하는 것과 같다.


안드로이드 애플리케이션의 구성요소

액티비티

서비스

브로드캐스트 수신자

내용 제공자



다른 안드로이드 애플리케이션에 인텐트를 전달하기 위한 메서드는 다음과 같다.

startActivity()                      //액티비티를 띄울 때 사용

startService(),bindService()      //서비스를 사용할 때

broadcastIntent()                //브로드캐스팅을 수행할 때



인텐트는 액션+데이터로 이루어져 있으며, 액션은 수행할 기능, 데이터는 수행될 대상 데이터를 의미한다.

android.content.Intent 경로에 Intent클래스를 보면 상수로 정의되고 ACTION_으로 시작하는 상수명을 갖는 상수들을 볼 수 있는데 이것들로 액션기능을 수행할 수 있다.

대표적인 액션에는 ACTION_VIEW가 있다.



Intent클래스의 생성자 중

public Intent(String action, Uri uri) {
        throw new RuntimeException("Stub!");
    }

이런 생성자를 볼 수 있는데.

첫번째 매개변수에는 사용할 기능, 두번째 매개변수에는 Uri객체가 오는데 Uri.parse메서드를 사용해서 안드로이드에서 사용하는 의미있는 문자열을 지정하면 된다.


이렇게 지정하면 안드로이드 애플리케이션 실행 시점에 자동으로 해당 액티비티를 찾아 띄워준다.


인텐트에 클래스나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 이를 '명시적인텐트'라 하며, 액션+데이터를 지정하긴 했지만 호출할 대상이 그때 그때 달라질 수 있는 경우에는 '암시적인텐트'라고 한다.




인텐트를 이루는 속성에는 액션과 데이터 뿐만이 아니라..

Category, type(MIME타입), component, 정보데이터(Bundle)

등이 있다.






정보데이터(Bundle)

액티비티간에 데이터를 전달하기 위해 사용하는 번들(Bundle)객체가 있는데 이것은 Intent안에 들어 있기 때문에 getXX메서드나 putXX메서드를 통해서 다른 액티비티의 데이터를 전달 받거나 액티비티에 데이터를 전달할 수 있다.

Intent putExtra(String name, value); //전달하는 메서드
String getStringExtra(String name);  //전달받는 메서드



그리고 putExtra같은 메서드로는 참조형 타입을 전달할 수 없기 때문에 전달하고 싶은 데이터가 기본형 타입이나 문자열이 아닌 사용자 정의 타입인 경우에는 Serializable인터페이스를 구현하는 클래스를 만들어서 직렬화 후 전달할 수 가 있다. 하지만 안드로이드에서는 Parcelable인터페이스를 구현해서 참조형 타입을 전달할 수 있다.




다음은 직접 테스트해본 코드이다. (xml레이아웃 파일은 생략했다.)

- 액티비티를 호출하는 측 (첫 화면)

public class FlagTestActivity extends AppCompatActivity { private final String parcelData = "person"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_flag_test); } public void putExtraDataTest(View v) { Intent intent = new Intent(this, TwoActivity.class); //기본형 및 문자열 타입을 인텐트에 저장하는 방법 intent.putExtra("sender", "보내는사람 센더"); intent.putExtra("numbers", 123); //참조형 타입을 인텐트에 저장하는 방법 Person person = new Person("춘이", 31, 1986); intent.putExtra(parcelData, person); //액티비티를 전환하는 메서드 인텐트 객체와 requestCode를 전달할 수 있다. startActivityForResult(intent, 1000); } //이 메서드는 호출한 액티비티에서 setResult를 통해 결과를 반환하면 진입하게 되는 메서드이다. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK){ Toast.makeText(this, "requestCode : "+requestCode+ " data : "+data.getStringExtra("receiver"), Toast.LENGTH_LONG).show(); } } }


- FlagTestActivity가 호출하는 액티비티(두번째 화면)

public class TwoActivity extends AppCompatActivity {

    Intent inIntent;
    String senderExtra;
    private final String parcelData = "person";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        
        //startActivity에서 보내는 인텐트를 가져온다.
        inIntent = getIntent();
        
        //인텐트에 지정한 부가데이터인 sender를 이름으로 가지는 값을 가져온다
        senderExtra = inIntent.getStringExtra("sender");

        //인텐트에 지정한 parcelable을 구현한 참조형 타입 데이터를 가져온다
        Person person = inIntent.getParcelableExtra(parcelData);

        //토스트 메세지창 띄우기
        Toast.makeText(this, senderExtra + " " + person, Toast.LENGTH_LONG).show();
    }


    public void extraResultTest(View v) {

        Intent intent = new Intent();

        intent.putExtra("receiver", "받는사람이 보낸다 리시버"); //인텐트에 전달할 데이터 저장
        setResult(RESULT_OK, intent);
        //이 메서드를 통해 호출한 액티비티에 다시 데이터를 보낸다.
        //RESULT_OK(성공)는 resultCode이며, RESULT_CANCEL(실패)도 있다.

        finish(); //현재 액티비티를 닫는다.
    }

}


- 인텐트에 저장해서 다른 액티비티에 참조형타입을 전달하기 위해 Parcelable을 구현한 클래스를 작성

public class Person implements Parcelable {

    private String name;
    private int age;
    private int birth;

    public Person(String name, int age, int birth){
        this.name = name;
        this.age = age;
        this.birth = birth;
    }

    protected Person(Parcel parcel) {
        name = parcel.readString();
        age = parcel.readInt();
        birth = parcel.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age);
        parcel.writeInt(birth);
    }

    @Override
    public String toString(){
        return this.name + "," + this.age + "," + this.birth;
    }
}



-결과화면



Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday