Intent로 인스타, 유튜브, 앱리뷰 간단히 실행시키기
앱 개발중
- 리뷰 구걸을 위해 내앱이 등록된 플레이스토어로 이동
- 내 앱 사용 설명을 위해 내가 등록한 유튜브 페이지로 앱을 실행
- 특정인의 인스타그램으로 이동
등 다양하게 Intent를 사용할 경우가 있습니다.
위에 나열한 내용을 어떻게 구현하는지 알아봅시다.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
context.startActivity(intent)
핵심은 이 두줄로 가능합니다. url에다가 알맞은 값만 넣어주면 끝인데요!
결론부터 보여드리자면 코드는 아래와 같습니다.
object LaunchAppsUtil {
fun launchReview(context: Context) {
val appPackageName = context.packageName
launchApp(
context,
"market://details?id=$appPackageName",
"https://play.google.com/store/apps/details?id=$appPackageName"
)
}
fun launchInstagram(context: Context, userName: String) {
launchApp(
context,
"http://instagram.com/_u/$userName",
"http://instagram.com/$userName"
)
}
fun launchYoutube(context: Context, id: String) {
launchApp(
context,
"vnd.youtube:$id",
"http://www.youtube.com/watch?v=$id"
)
}
private fun launchApp(context: Context, firstUrl: String, secondUrl: String) {
val firstIntent = Intent(Intent.ACTION_VIEW, Uri.parse(firstUrl))
val secondIntent = Intent(Intent.ACTION_VIEW, Uri.parse(secondUrl))
try {
context.startActivity(firstIntent)
} catch (e: ActivityNotFoundException) {
context.startActivity(secondIntent)
}
}
}
어떤 원리로 동작하는 것일까요?
아래의 코드를 한번 봅시다
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://soulduse.tistory.com"))
context.startActivity(intent)
이걸 실행하면 어떤 결과가 나올까요?
실행해보면 웹뷰에서 뭔가가 나오는게 아니라, (당연히 설정해준게 없기 때문에) 아래와 같이 연결할 프로그램이 뜨고 브라우저 리스트가 나옵니다.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://soulduse.tistory.com"))
브라우저 리스트가 나온다는 것은, http://는 URL로 시작되는 경우를 감지해서 앱을 실행하려고 하는 것을 알 수 있습니다.
http:// URL scheme가 설정되었다는 뜻입니다.
"http://", "ftp://", "market://"과 같은 문자열을 url scheme이라 부릅니다. url scheme을 통해 앱이 실행되는 방식은 다음과 같습니다.
- 웹페이지에서 하이퍼링크 클릭시 url scheme이 system에 전달됨.
- system에서 전달된 url scheme을 보고 실행 가능한 앱이 있는지 확인.
- 해당 url scheme을 받을 수 있는 앱이 있다면 앱을 실행시키며 이 url을 함께 전달
- 앱이 실행되면서 url에 포함된 내용을 참조해서 특정 기능을 수행함.
※ 웹 페이지에서 url scheme을 이용해 앱을 실행하는 경우, 앱이 미설치된 경우의 예외 처리를 구현해야 합니다.
위의 코드중 아래와 같이 예외처리.
try {
context.startActivity(firstIntent)
} catch (e: ActivityNotFoundException) {
context.startActivity(secondIntent)
}
자세히 이해를 돕기위해 두번째 간단한 프로젝트를 만들었습니다.
기본 메인액티비와 또다른 하나의 추가 액티비티를 만들었습니다.
class CustomUriSchemeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom_uri_scheme)
}
}
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CustomUriSchemeActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Custom Uri Scheme App!"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</RelativeLayout>
<activity android:name=".CustomUriSchemeActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="hello"
android:scheme="soulduse"/>
</intent-filter>
</activity>
여기서 눈여겨야 봐야할 부분인데요, scheme 값은 soulduse, host 값은 hello로 Custom Uri Scheme을 만들었습니다.
자 그럼 다른 프로젝트에서 해당 앱을 실행시키기 위해선 아래와 같이 하면 되겠죠
fun sampleIntent(context: Context) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("soulduse://hello"))
context.startActivity(intent)
}
자 앱을 실행하면 다음과 같이 바로 Custom Uri Scheme App!이 표시되는 것을 확인할 수 있습니다.
메인 액티비티가 있음에도 불구하고 바로 CustomUriSchemeActivity가 실행된 것을 보실 수 있습니다.
※ 참고로 2개의 앱 중 A앱에서 위의 sampleIntent메소드를 실행시켰고, B앱인 CustmSchemeTest 앱이 실행되었습니다.
"vnd.youtube:$id"
"http://instagram.com/_u/$userName"
"market://details?id=$appPackageName"
그럼 위에 내용들을 봤을때 대충 어떤 내용인지 짐작이 가실껍니다.
vnd.youtube는 youtube에서 만든 custom cheme,
market://은 play store용 custom cheme,
http://instagram.com의 경우에는 host 값이 instagram.com/_u/를 가진다고 볼 수 있겠죠.
따라서 위의 값으로 Intent를 실행시키면 해당 앱이 실행되는 것을 알 수 있습니다.
참고한 내용
https://developer.android.com/guide/components/intents-filters
https://developer.android.com/training/basics/intents/sending
'개발 공부 기록하기 > - Android' 카테고리의 다른 글
앱 설치화면 보내기 또는 해당 앱 실행하기 (2) | 2019.08.25 |
---|---|
왜 개발모드일때는 광고가 노출되지 않지? Failed to load ad: 3 (1) | 2019.01.02 |
[Android] KakaoLink Deep하게 사용하기 (4) | 2018.07.16 |
Glide 메모리 줄이고 사이즈는 유지시키기 (0) | 2018.06.10 |
스플래시 화면에서 xml을 사용시 에러해결 (3) | 2018.02.28 |