Intent 는 주로 엑티비티의 시작이나 동작들을 제어하기위해 사용합니다.
Intent로 액티비티를 시작하는 방법은 두가지가 있습니다.
암시적 인텐트
암시적 인텐트는 특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해줍니다. 예를 들어 사용자에게 지도에 있는 한 위치를 표시하고자 하는 경우, 암시적 인텐트를 사용하여 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있습니다.
public class AActivity extends AppCompatActivity {
}
public class BActivity extends AppCompatActivity {
}
위와같이 두개의 액티비티가 존재할 경우
Intent intent = new Intent(AActivity.this, BActivity.class);
startActivity(intent);
이와 같이 암시적으로 두가지 두가지 액티비티에 이름만 적어주면 AActivity 에서 BActivity로 이동할 수 있다.
명시적 인텐트
인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다. 이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성 요소 클래스 이름을 제공합니다. 명시적 인텐트는 일반적으로 앱 안에서 구성 요소를 시작할 때 씁니다. 시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문입니다. 예를 들어, 사용자 작업에 응답하여 새로운 액티비티를 시작하거나 백그라운드에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등이 여기에 해당됩니다.
요약하자만 말그대로 직접 패키지명을 써서 나의앱,외부앱의 액티비티등을 실행하는 방법입니다.
명시적 인텐트는 왜사용하는가 ?
명시적 인텐트는 같은 어플리케이션 내의 컴포넌트 사이에서만 사용이 가능하기 때문에 다른 어플리케이션 내의 컴포넌트를 사용하려면 암시적 인텐트를 사용해야 한다. 또한 홈화면,다이얼러 등의 호출 모두 암시적 인텐트를 통해 이루어지기 때문에 암시적 인텐트를 지원해야 한다.
public static Intent implicitIntent(Context context,String startPackageName){
return new Intent().setComponent(new ComponentName(context,startPackageName));
}
저는 빈 intent 객체에 componentName을 추가해 해당 액티비티를 실행하는 방법을 사용하고있습니다
startPackageName엔 액티비티의 실제 경로 (예 -> "com.your.application.package.yourActivity") 가 string값으로 들어가 ComponentName 클래스에 넣어준뒤 intent에 setComponent해주면 해당 액티비티를 실행할수있는 질의 문을 만들수 있습니다.
//실행 시킬 activity com.your.application.package.yourActivity
startActivity(ActivitiesUtil.implicitIntent(this,"com.your.application.package.yourActivity"));
외부 앱의 액티비티 실제 경로와 암시적 인텐트 실행을 지원한다면 외부앱도 이와 같은 방법으로 실행가능합니다.
출처
https://hyunssssss.tistory.com/46 [현's 블로그]
https://developer.android.com/guide/components/intents-filters?hl=ko
'AOS' 카테고리의 다른 글
(안드로이드) 인앱결제(billingClient v3) (0) | 2020.10.08 |
---|---|
(android)pinch zoom imageview (0) | 2020.09.03 |
(안드로이드)manifest에서 activity list 가저오기 (0) | 2020.05.03 |
(안드로이드) program type already present:BuildConfig (0) | 2020.04.14 |
(안드로이드)오류 - IllegalBlockSizeException DATA_TOO_LARGE_FOR_KEY_SIZE (0) | 2020.03.11 |