티스토리 뷰

Android

6. 안드로이드의 4가지 구성 요소 & Intent

알 수 없는 사용자 2018. 9. 30. 23:27



이번에는 안드로이드를 구성하는 요소와

이러한 요소 간의 전환이 일어날 때 사용되는 

Intent에 대해 알아보고

데이터의 교환이 일어나는 테스트를

해보도록 하겠습니다~


====================================================


안드로이드 애플리케이션을 구성하는 요소 & Intent



1. 안드로이드를 구성하는 요소는 무엇이 있을까?


 안드로이드를 구성하는 요소가 무엇이 있을지 생각해보면 앞서 살펴본 내용만 보더라도 액티비티는 짐작하실 수 있습니다.

액티비티는 하나의 화면이라고 생각할 수 있고 대부분의 앱이 적어도 하나 이상 포함하고 있다라고 생각할 수 있습니다.

이러한 액티비티는 구성 요소중 하나이며 서비스, 브로드캐스트 수신자, 내용 제공자까지 하여 

총 4가지로 안드로이드 애플리케이션이 구성되어 있습니다.



[출처] http://swalloow.tistory.com/18


   4가지 구성 요소가 어떤 기능인지 짤막하게 설명드리겠습니다. 자세한 내용은 나중에 하나씩 다루면서 살펴보도록 하겠습니다.


  - Activity : 위에서 설명한 것과 같이 사용자 인터페이스 화면을 말하며 특정 작업을 담당하는 컴포넌트입니다.

  - Service : 백그라운드에서 오랫동안 실행되는 작업이나 원격 프로세스를 위한 컴포넌트입니다.

  - Broadcast Receiver : 안드로이드 단말기에서 발생하는 다양한 이벤트/정보를 받고 반응하는 컴포넌트입니다.

  - Content Provider : 데이터를 관리하고 다른 어플리케이션 데이터를 제공하는 컴포넌트입니다.




2. Intent ?


 예로 들자면 A라는 액티비티에서 B라는 액티비티로 이동하면서 Intent를 사용합니다. 여기서 Intent는 액티비티를 띄우거나 기능을 동작시키기 위한 수단으로 사용되고, 무언가 작업을 수행하기 위해 사용되는 일종의 명령 또는 데이터 전달 수단이 되는 것입니다.


 하지만 실제로 복잡한 안드로이드 애플리케이션을 사용하는 경우 액티비티 뿐만 아니라 서비스, 브로드캐스트 수신자, 내용 제공자까지 4가지 구성 요소가 모두 사용되게 되며 서로 독립적으로 작동하는 이 4가지 컴포넌트들 간의 상호 통신을 위한 장치입니다.


인텐트는 액션과 데이터의 구성되어 있는데 액션은 수행할 기능, 데이터는 액션이 수행될 대상 데이터를 의미합니다.

자바 문법과 비교하면 인텐트는 클래스, 액션은 메소드, 데이터는 변수라고 비교가 된다고 생각합니다.


[출처] http://wiki.gurubee.net/pages/viewpage.action?pageId=26743913


이러한 Intent는 암시적 인텐트와 명시적 인테트로 나뉩니다.

명시적 인텐트란 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우를 뜻하고

암시적 인텐트란 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우를 뜻합니다.



3. 액티비티에서 데이터를 전달하고 받는 과정을 살펴보자.


보통 기능의 원리를 살펴보고 테스트를 진행하였지만 이번에는 테스트를 해보고 작동 원리에 대해 생각하는 것이 좋다고 생각합니다.

테스트는 우리가 다룬 구성 요소는 액티비티뿐이니 액티비티의 전환 간에 데이터의 전송을 하는 기능을 테스트하겠습니다.


전체적인 기능은 MainActivity에서 버튼을 눌렀을 경우 Main2Activity를 호출하고 다시 Main2Activity에서 버튼을 눌렀을 시mike란 데이터를 전송하여  

MainActivity에서 띄우는 기능입니다.


MainActiviy 버튼 클릭 -> Main2Activity 호출 -> Main2Activity 버튼 클릭 ->MainActivity 호출 & toast 메시지에 mike 출력




① 다음과 같이 2가지 레이아웃을 디자인합니다.





왼쪽의 초기화면의 Layout과 오른쪽에 데이터를 전달할 Layout의 모양이 살짝 다릅니다.

그 이유는 두번째 레이아웃은 대화상자 형태로 나타낼 것 입니다.




② 두번째 액티비티를 Dialog 형태로 설정합니다.


</activity>
<activity android:name=".Main2Activity"
android:label="메뉴"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>


마지막 속성인 android:theme 속성을 다음과 같이 바꿔주면 Dialog의 형태로 변경할 수 있습니다.




③ 이제 MainActivity에서 Main2Activity를 호출해 보겠습니다.


public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(),Main2Activity.class);
startActivityForResult(intent,101)
}
});
}
}


MainActivity에서 Intent 객체를 생성하여 startActivityForResult() 메소드를 인텐트 객체와 함께 호출합니다.

startActivityForResult() 메소드가 intent객체를 참조하여 어떤 액티비티로 넘어갈 것인지 결정하는 것입니다.



[Reference] startActivityForResult(Intent intent , int requestCode) { }


여기서 다른 액티비티를 호출하는 메소드는 startActivityForResult() 뿐만 아니라 startActivity()도 존재합니다.

startActivity()는 단순히 액티비티를 띄워 화면에 보이도록 하는 것입니다.

하지만 startActivityForResult()는 액티비티를 호출하고 호출한 액티비티에서 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리하는 기능을 가지고 있는 것입니다.

그렇기 때문에 이때 startActivityForResult() 메소드가 두번째 인자로 가지는 파라미터가 requestCode입니다. 액티비티를 구분하여 다시 받아온 응답을 구분하기 위한 것이죠. 


[출처] Do it! 안드로이드 앱 프로그래밍


돌아온 응답을 처리하기 위한 처리는 마지막 단계에서 하겠습니다.



 다시 Main2Activity에서 MainActivity를 호출하고 이 때 데이터를 포함시킵니다. 


public class Main2Activity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);


Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.putExtra("name", "mike");

setResult(Activity.RESULT_OK, intent);

finish();

}
});
}
}


intent에 넣을 데이터는 putExtra(), 꺼낼 데이터는 getStringExtra()로 처리하시면 됩니다.

putExtra()의 첫번째 인자는 데이터를 구분할 name값, 두번째 인자는 실제 데이터 값을 의미합니다.


또한 setResult() 메소드를 통해 응답을 보내고 있습니다.

setResult() 메소드는 새로 띄운 액티비티에서 이전 액티비티로 인텐트를 전달하고 싶을 때 사용되는 메소드입니다.

첫번째 인자는 구분하고자 하는 응답코드, 두번째 인자는 보내고자하는 intent입니다.


이렇게 한다면 intent에 mike라는 문자열의 value값을 name이라는 값으로 intent에 저장하여 이전 액티비티에 전달하고

finish() 메소드에 의해 현재 액티비티는 사라지게 됩니다.

그렇다면 스택구조의 안드로이드는 이전 액티비티인 MainActivity를 띄우게 됩니다.



⑤ 마지막으로 MainActivity에서 응답코드에 따른 처리할 기능을 구현합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode == 101){
String name = data.getStringExtra("name");
Toast.makeText(getApplicationContext(),"응답받은 데이터는 : " + name, Toast.LENGTH_LONG).show();
}
}


MainActivity 아래 다음과 같은 메소드를 추가해줍니다.

onActivityResult() 메소드는 새로 띄웠던 메뉴 액티비티가 응답을 보내오면 그 응답을 처리하는 역할을 합니다.


[Reference] protected void onActivityResult(int requestCode, int resultCode, Intent intent) { }


첫 번째 파라미터는 액티비티를 띄울 때 전달했던 요청코드로 어떤 액티비티로부터 응답 받은 것인지 구분할 때 사용됩니다.

두 번째 파라미터는 응답을 보내온 액티비티로부터 전달된 응답 코드입니다.

응답코드로 우리가 Activity.Result_OK 상수를 전달했는데 보통 정상 처리됬다는 코드로 사용합니다.


또한 getStringExtra() 메소드를 이용해 우리가 intent에 담았던 데이터를 뽑으면 toast 메시지로 출력할 수 있습니다.




4. 액티비티 추가와 응답 과정을 정리하면


[출처] Do it! 안드로이드 앱 프로그래밍


이 그림이 제일 깔끔하게 잘 설명되고 한눈에 들어오는 것 같습니다.

앱에 새로운 액티비티를 추가하기 위해 필요한 것이므로 실제 앱을 만들 때도 잘 이해하고 있어야 합니다.

실제 앱을 구성할 때에는 여러 개의 화면이 사용되고 복잡한 앱의 경우에는 수십 개의 화면이 사용되기도 하므로 액티비티 간의 요청과 구조에 대해 명확하게 알고 있어야 코드를 쉽게 이해할 수 있습니다.

'Android' 카테고리의 다른 글

8. 브로드캐스트 수신자 : Broadcast Receiver  (0) 2018.10.06
7 . 서비스 : Service  (1) 2018.10.03
5. Page Sliding  (0) 2018.09.30
4. Tween Animation  (0) 2018.09.29
3. 액티비티의 수명주기 : Life Cycle  (0) 2018.09.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함