https://github.com/lnjky/fashion_people
GitHub - lnjky/fashion_people: 패션 추천 어플
패션 추천 어플. Contribute to lnjky/fashion_people development by creating an account on GitHub.
github.com
코드 전체를 보려면 위에 링크를 통해 확인할 수 있습니다.
안드로이드 어플을 만들다 보면 화면을 전환하거나 다른 화면으로 정보를 전달하거나 하는 기능이 필요할 때가 있다.
그 때 사용하는 것이 바로 Intent이다.
Intent는 2가지 유형으로 나뉜다.
1) 명시적 인텐트
- 인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다. 이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공합니다. 명시적 인텐트는 일반적으로 앱 안에서 구성 요소를 시작할 때 씁니다. 시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문입니다. 예를 들어, 사용자 작업에 응답하여 새로운 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등이 여기에 해당됩니다.
2) 암시적 인텐트
- 특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해줍니다. 예를 들어 사용자에게 지도에 있는 한 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용하여 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있습니다.
간단히 이야기 하자면 이렇다.
명시적 인텐트란 실행하고자하는 컴포넌트(액티비티, 서비스 등) 클래스명을 Intent에 담는 방법으로 주로 같은 앱이나
다른 컴포넌트(액티비티)를 실행시킬때 사용한다.
즉 해당 어플리케이션 내에서 데이터를 전송하거나 화면을 전환할 때 사용한다.
그렇기 때문에 명시적 인텐트를 자주 사용하게 된다.
암시적 인텐트는 실행중인 어플리케이션 이외의 다른 응용 프로그램이나 어플리케이션을 호출할 때 사용한다.
이메일을 전송하거나 특정 어플리케이션을 열거나 전화를 거는 등 현재 어플리케이션 이외의 프로그램을 작동할 때 사용한다.
글로만 보면 이해가 잘 안될 수 있어 직접 작성했던 코드를 보면서 설명하겠다.
Intent를 사용할 때 컴포넌트에 따라 사용법이 달라 이를 정리해보려 한다.
먼저 명시적 인텐트이다.
첫번째 상황은 Activity -> Activity 상황이다.

btn_save가 클릭될 경우 데이터를 전달한다.
Intent intent = new Intent(getApplicationContext(), SaveActivity.class);
intent.putExtra("uri", uri);
startActivity(intent);
Intent 경로를 아래와 같이 작성해 주면 된다.
Intent intent = new Intent(getApplicationContext(), SaveActivity.class);
이 후 다른 코드작성 없이 startActivity(intent)를 사용하면 화면 전환의 기능만 한다.
그 외에 전송할 데이터가 있다면 아래의 형식으로 추가로 코드를 작성하면 된다.
intent.putExtra("uri", uri);
여기까지 데이터 전송을 위한 준비이고 이 데이터를 받을 때는 데이터를 받을 액티비티에서 코드를 작성해서 데이터를 받아야 한다. 그 코드는 아래와 같다.

Intent를 선언해주고 원하는 변수에 해당 형식에 맞게 입력해 주면 된다.
해당 코드는 Glide라이브러리를 통해 이미지를 받아온 것을 전송해주는 예시이기 때문에 .getParcelableExrea()를 사용했지만 대부분 string형식을 사용하기 때문에 .getStringExtra()를 사용한다.
getStringExtra()를 사용하는 것은 Adapter -> Activity 예시에서 확인하도록 하자.
두번째는 Fragment -> Activity 상황이다.

Intent intent = new Intent(getActivity(), PostActivity.class);
위의 코드에서 (getActivity().this, PostActivity.class)를 작성하여 현재 Fragment -> PostActivity로 데이터를 전달한다.
Activity -> Activity와 다소 다른 것을 확인할 수 있다.
해당 코드는 따로 데이터를 전달하지 않고 액티비티 전환의 기능만 하기 때문에 PostActivity에서 따로 작성해야 하는 코드는 없다. 그러나 데이터를 전송해야 할 경우에는 Activity -> Activity에서 처럼 putExtra를 사용해서 데이터를 전송하고 받으면 된다.
또한 아래의 코드를 사용하면 화면이 전환될 때 애니메이션 기능을 끌 수 있다.
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
세번째는 Adapter -> Activity 상황이다.

리사이클러뷰의 Adapter를 사용할 때 작성한 코드이다.
tv_ratingbar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), PopupActivity.class);
intent.putExtra("upload_documentID", documentid.getText().toString());
intent.putExtra("upload_collectionID", collectionid.getText().toString());
intent.putExtra("upload_rating", upload_ratingbar.getRating());
view.getContext().startActivity(intent);
}
});
Fragment -> Activity와 다르게 Intent 객체의 위치에 다른 코드가 들어가있는 것을 확인할 수 있다.
intent.putExtra("upload_documentID", documentid.getText().toString());
intent.putExtra("upload_collectionID", collectionid.getText().toString());
intent.putExtra("upload_rating", upload_ratingbar.getRating());
Adapter -> Activity에서도 다음의 형식으로 데이터를 입력해서 전달하면 된다.
.getText()나 .getRating()은 전송될 데이터의 형식을 지정해 준 것이다.
intent.putExtra("키 값", 전송할 데이터);
이렇게 전송된 데이터를 활용하기 위해서는 여기서도 마찬가지로 데이터를 받을 액티비티에서도 준비를 해줘야 한다.

intent = getIntent();// 인텐트 받아오기
documentid = intent.getStringExtra("upload_documentID"); //Adapter에서 받은 키값 연결
collectionid = intent.getStringExtra("upload_collectionID");
이런식으로 전송할 때 입력한 "키 값"을 통해 데이터를 구분하고 해당 값을 원하는 변수에 입력해 줄 수 있다.
위의 과정을 거친다면 adapter의 documentid.getText().toString()의 값을 Intent를 통해 PopupActivity에서 받아 documentid라는 이름의 변수를 통해 사용할 수 있다.
다음은 암시적 인텐트이다.

Intent intent = new Intent();
그렇기 때문에 Intent의 발생 위치, 도착위치에 대해 작성하지 않았고 setResult()를 사용한다.
예시를 하나 더 보자면 아래의 코드이다.

intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
여기서 ACTION_GET_CONTENT를 사용하기 위해서는 onActivityResult()를 따로 정해줘야 한다.
내가 사용했던 코드는 다음과 같다.
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if ( result.getResultCode() == RESULT_OK && result.getData() != null) {
imageUri = result.getData().getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
iv_upload_image.setImageBitmap(bitmap);
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
});
이상으로 인텐트에 대해 정리를 해 보았다.다소 부족한 내용일 수도 있지만 실제 어플을 만들기 위해서는 사용 방법만 간단히 알고 넘어갔었는데 글을 작성하며 이전보다는 더 많은 것을 알게 된 것 같다.
Intent에 대한 내용은 아래의 Android Developer에서도 확인할 수 있다.
https://developer.android.com/guide/components/intents-filters?hl=ko
인텐트 및 인텐트 필터 | Android 개발자 | Android Developers
An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…
developer.android.com
'안드로이드' 카테고리의 다른 글
[안드로이드] 파이어베이스 / 로그인 만들기 (1) | 2023.01.03 |
---|---|
[안드로이드] 파이어베이스 / 회원가입 만들기 (0) | 2023.01.03 |
[안드로이드] Fragment에서의 findViewById() (0) | 2022.12.22 |
[안드로이드] 파이어베이스 - 안드로이드 스튜디오 연결 (0) | 2022.12.22 |
[안드로이드] Logcat 사용법 (1) | 2022.12.21 |