박상권의 삽질블로그

[안드로이드/Android]URL로 액티비티 실행하는 방법(Custom URL Scheme) 본문

IT/Android-TIP (한글)

[안드로이드/Android]URL로 액티비티 실행하는 방법(Custom URL Scheme)

박상권 2015. 7. 6. 09:44

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여



블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


우리는 보통 Activity를 실행시킬때 아래와 같이 코드를 작성합니다.



Intent intent = new Intent(this,AAA.class);
startActivity(intent);





만약 URL을 실행하고싶은 경우, 아래와 같이 해당 URL을 적어주고 ACTION_VIEW를 실행하면 브라우저가 실행되고 지정한 url을 로드하기도 합니다.


String url ="http://gun0912.tistory.com";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);


만약 브라우저를 여러개 사용하고 있다면 url을 실행할때 브라우저를 선택하라는 화면이 나오기도 합니다.





URL을 선택하는 경우 뿐만 아니라 특정 액션을 수행할때 여러 어플리케이션이 중복된다면 하나를 선택하라는 화면이 나옵니다.










URL을 로드하는경우 브라우저를 선택하는 화면이 나오는건 해당 어플리케이션들이 http:// 라는 URL로 시작되는경우를 감지하고 이를 실행하려고 하기 때문입니다.

즉 'http://' 라는 Custom Scheme을 사용하고 있다고도 볼수 있습니다.







아직 이해가 잘 안되실거라 생각해서 좀더 실제적인 예로 설명해보겠습니다.

현재 제가 서비스하고있는 [셀폰]이라는 어플의 알림화면입니다.

(셀폰은 중고폰 개인거래/매입업체거래 중개서비스 입니다) 

셀폰 자세히 보기






여러 중고폰 판매글이 있고 내가 참여한 중고 판매글에 누군가가 댓글을 남긴경우 알림과함께 댓글내용을 알려주는 화면입니다.

(페이스북이나 기타 SNS에서 자주 보이는 패턴의 알림화면입니다.)








알림중 하나를 선택한경우 우리는 해당 판매글로 이동시키는 코드를 작성해야 합니다.

판매글의 id가 10번이고 판매글을 보여주는 Activity이름이 Activity_PostDetail일 경우 일반적으로는 아래와 같이 작성할 수도 있을것입니다.



Intent intent = new Intent(this,Activity_Post_Detail.class);
intent.putExtra(Activity_Post_Detail.STATE_POST_ID,"10");
startActivity(intent);






하지만 Custom URL을 사용한다면 아래와 같은 방법으로도 Activity를 실행시킬수 있습니다.



String url ="selphone://post_detail?post_id=10";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

실행하고자하는 Activity이름을 지정하지 않고 단순히 url만을 입력하고 실행하는데도 같은 결과를 얻을수 있는것입니다.




이러한 방식을 사용하면 앱안에서 뿐만이 아니라 주소창에서도 특정 Activity를 실행시킬수 있습니다.

또한, Activity이름을 몰라도 해당 url을 넘겨주면 해당 url을 담당하는 Activity가 실행됩니다.






Custom URL Scheme작성하기



1. Manifest의 실행시키고 싶은 Activity에 scheme://host 형태의 URL을 정의해줍니다


위의 예시에서는 scheme은 selphone, host는 post_detail이 됩니다.



<!-- 개인거래 판매글 상세정보 -->
<activity
android:name=".post.Activity_Post_Detail"
android:theme="@style/Theme.Selphone.Transparent"

android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="kr.co.selphone.MainActivity" />

<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="post_detail"
android:scheme="selphone" />
</intent-filter>
</activity>




이렇게 선언된경우 selphone://post_detail 이라는 url을 호출하는경우는 무조건 해당 Activity가 실행됩니다.









2. Activity를 실행하면서 parameter를 넘겨주고 싶은경우 쿼리형태로 넘겨줍니다


예시에서는 판매글의 id를 10으로 넘겨주었듯이 host뒤에 ? 를 붙여준뒤 쿼리 스트링을 넘겨줍니다.

"selphone://post_detail?post_id=10"









3. 실행되는 Activity에서 해당 parameter가 있는경우 parameter를 가져올수 있도록 설정합니다


Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String temp_post_id = uri.getQueryParameter(STATE_POST_ID);
}


Activity가 ACTION_VIEW형태로 실행되었는지를 체크하고, uri로부터 parameter를 가져옵니다

(여기서 STATE_POST_ID 는 "post_id" 변수입니다.)









Custom URL Scheme을 사용하면 좀더 효과적으로 액티비티를 실행시키고 서로 상호작용하게 만들수 있습니다.

좀더 자세한 내용은 Android Intent Fileters를 참고하시면 좋습니다.





안드로이드 개발자끼리 소통하기위한 오픈채팅방을 만들었습니다.

안드로이드 관련 Q&A및 팁을 공유하는 곳입니다.

관심있으신분들은 참여해보세요.

https://open.kakao.com/o/g8rSGB

Comments