=================================
=================================
=================================
다른 앱 실행시킬때 다른앱이 매니패스트에 아이콘이 안보이는 android:name="android.intent.category.LAUNCHER" 가 없는 앱일때 액티브가 붙는 실행이 아닌 따로 앱으로 실행 시키는 방법 그리고 값전달
다른앱 애니패스트
다른앱의 아이콘이 없는 매니패스트 설정
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
package="com.home.myapp"
android:versionName="1.0.1"
android:versionCode="6">
<!-- ...... 이것저것 코드들 -->
<activity
android:name=".CMyapp"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboard"
android:debuggable="false">
<!-- ...... 이것저것 코드들 -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
<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:scheme="oro" android:host="com.cyberoro.orolecture"/>
<!-- url 앱 실행 orohd://app -->
</intent-filter>
이렇게 main을 <intent-filter> </intent-filter> 또 해주는 경우도 있는데 특수한 경우이다
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="app"/> <!-- url 앱 실행 myapp://app -->
</intent-filter>
<!-- ...... 이것저것 코드들 -->
</activity>
실행시킬앱 코드 (URI 방식)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String url ="myapp://app";
Intent intent = new Intent(Intent.ACTION_MAIN, Uri.parse(url));
intent.putExtra("psj_test", "this is test"); //값전달
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP
//이방식으로 플러그를 설정해주면 다른앱 실행시 처음 루트 ACTIVITY 빼곤 모두 사라집니다.
startActivity(intent);
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
URI 방식은 'myapp://app?psj_test=hey_test' 이런식으로 값을 전달해도 된다.
String url ="myapp://app?psj_test=hey_test";
Intent intent = new Intent(Intent.ACTION_MAIN, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP
//이방식으로 플러그를 설정해주면 다른앱 실행시 처음 루트 ACTIVITY 빼곤 모두 사라집니다.
startActivity(intent);
또는
실행시킬앱 코드 (패키지,실행시킬 액티브 방식)
ComponentName compName = new ComponentName("com.home.myapp","com.home.myapp.CMyapp");
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP
//이방식으로 플러그를 설정해주면 다른앱 실행시 처음 루트 ACTIVITY 빼곤 모두 사라집니다.
<!-- intent.addCategory(Intent.CATEGORY_LAUNCHER); --> <!-- 이부분은 상황에 따라 설정해도되고 안해도 된다. -->
intent.setComponent(compName);
intent.putExtra("psj_test", "this is test"); //값전달
startActivity(intent);
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
또다른 방식으로
intent에 값을 넣을때 아래돠 같이 넣을수도 있습니다.
intent.setData(Uri.parse("data=abc"));
그럼 getIntent().getData();
다른앱에서 값을 받아서 쓰면 됩니다.
다른앱 class CMyapp.java
값가져 올떄
intent.putExtra("psj_test", "this is test"); // 값전달 할때
@Override protected void onResume() 또는 nCreate(..) 또는 onStart() 또는 그외 설정한 코드 {
// TODO Auto-generated method stub
super.onResume();
// 코드들.....
if(intent.hasExtra("psj_test")) {
String sharedText = intent.getStringExtra("psj_test");
// sharedText 값을 뿌려주면 된다.
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
URI 방식은 'myapp://app?psj_test=hey_test' 이런식으로 값 전달할때
@Override
protected void onResume() 또는 onCreate(..) 또는 onStart() 또는 그외 설정한 코드 {
// TODO Auto-generated method stub
super.onResume();
if(getIntent()!=null) {
Uri uri = getIntent().getData();
if(uri != null) {
Log.d("MainAtv-receivedata", uri.toString());
Log.d("MainAtv-receivedata", uri.getQueryParameter("psj_test"));
}
}
}
=================================
=================================
=================================
출처: http://devbible.tistory.com/155
기존 포스팅중 PackageName (패캐지네임)으로 타 어플을 실행 시키는것이 있었다.
하지만 이것은 해당 해키지로 등록된 Launcher를 찾아 실행시켜주는것이였다.
이번 포스팅 할것은 런처없이 action으로 타 어플을 실행시키는 방법이다.
A어플 Intent intent = new Intent(); intent.setPackage("B어플 패키지명"); intent.setAction("custom.APPSTART"); //사용자 임의의 action명 startActivity(intent); B어플 Manifest의 해당mainActivity부분 <intent-filter> <action android:name="custom.APPSTART" /> //사용자 임의의 action명 <category android:name="android.intent.category.DEFAULT"/> // 사용자action의 경우 DEFAULT를 붙여여야함. </intent-filter> |
위와같이 설정 후 실행하게 되면 B어플안에 사용자 Action 명으로 등록된 Activity가 실행되게 된다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
필자는 혼용해서 이런식으로 했다.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.home.myapp" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<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:scheme="myapp" android:hos="app"/> <!-- url 앱 실행 myapp://app -->
</intent-filter>
=================================
=================================
=================================
출처: http://www.androidpub.com/2068035
intent로 다른 앱 실행시 기존 앱으로의 복귀 문제
휘렌
개발중인 앱에서 이미 설치되어있는 앱을 실행 후 해당 앱 종료시에 원래 화면으로 돌아오게 하고 싶습니다.
Intent intent = getPackageManager().getLaunchIntentForPackage("패키지명");
startActivity(intent);
위와 같은 방법을 이용하여 다른 앱의 메인을 띄우는 것은 별 문제 없이 가능하였습니다만
문제는 실행된 앱 종료 후에 그 앱을 실행한 제가 만든 앱으로 돌아오질 않더군요
실행
A앱 (개발중인 앱) -> B앱 (기존앱)
<-
종료
위와 같은 식으로 B앱의 종료시에 실행되어있던 A앱으로 돌아오고 싶습니다 방법이 없을까요?
내용 추가
대상 앱에서 finish()로 종료할 경우에는 원하는 대로 동작하게 됩니다.
위와 같은 경우가 아닐 경우의 해결책을 알고 싶습니다.
---------------------------------------------------------------------------------------------------
getPackageManager().getLaunchIntentForPackage() API는 항상 new task로 새로운 액티비티를 실행시키도록 구현되어 있습니다.
따라서, 이 API를 사용하지 마시고,
Intent intent = new Intent();
intent.setClassName(패키지명, 액티비티클래스명);
startActivity(intent);
형태로 사용하시면 됩니다.
메인 액티비티를 얻기 힘든 경우라면
Intent intent = getPackageManager().getLaunchIntentForPackage(~) ;
intent.setFlags(0); // New Task 플래그를 날림
startActivity(intent);
형태로 getPackageManager().getLaunchIntentForPackage API를 이용하시면 됩니다.
그리고, 일부앱들은 자신이 종료할 때, 강제로 moveTaskToBack를 호출해서 강제로 모두 백그라운드로 내려버리기도 합니다.. 이 경우에는 어쩔 수 없습니다.
2012.04.04 13:09:02
휘렌
다른 앱들 실행 후에 그 앱을 실행 및 종료를 할 경우 다른 앱들이 백그라운드로 가는 것으로 봐서
안타깝게 제가 실행하고자 하는 앱이 후자에 말씀하신 경우인 것 같아 적용은 불가능한 것 같지만,
답변 내용이 많은 도움이 되었습니다. 감사합니다 ^^
=================================
=================================
=================================
출처: http://comxp.tistory.com/109
휴휴님의 블로그 참조 : http://huewu.blog.me/110087045138
전체 FLAG의 정보는 android 사이트 참조 : http://developer.android.com/reference/android/content/Intent.html
주로 사용되는 4가지 FLAG
FLAG_ACTIVITY_SINGLE_TOP
Activity가 스택의 맨 위에 존재 하는 경우에 기존 Activity를 재활용 한다.
(Activity호출순서) 0->1->2->3 이렇게 스택이 쌓인 경우(스택의 맨 위는 3)
intent = new Intent(this, Activity3.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
0->1->2->3 그래도 유지 된다. 대신 Activity3는 onPause()->onNewIntent() -> onResume() 호출된다.
3번 액티비티가 존재하지 않거나 스택의 맨 위가 아닌 경우 그냥 스택에 쌓이게 되며 onNewIntent() 도 호출된다.
FLAG_ACTIVITY_NO_HISTORY
해당 플래그를 주고 액티비티를 호출하면 호출된 액티비티는 스택에 남지 않는다.
0->1->2->3 호출할때 Activity1 에서 Activity 2를 호출할때
intent = new Intent(this, ActivityTest3.class); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent);
하면 스택에는 0->1->3 만 남게 된다. 하지만 Activity 2의 Destory()의 시점은 Activity 3이 종료 된 이후에 호출된다라는것을 주의한다.
FLAG_ACTIVITY_REORDER_TO_FRONT
스택의 순서를 변경해 준다.
0->1->2->3 일때 Activity 3에서 Activity 1을 호출 할때 이 플래그를 설정하면
0->2->3->1 로 변경된다. (안드로이드 문서에서 FLAG_ACTIVITY_CLEAR_TOP플래그를 무시한다고 되어 있다.)
FLAG_ACTIVITY_CLEAR_TOP
스택에 기존에 사용하던 Activity가 있다면 그 위의 스택을 전부 제거해 주고 호출한다.
0->1->2->3 일때 Activity 3에서 Activity 1을 호출할때 이 플래그를 설정하면
0->1 만 남게 된다. (2, 3은 제거) 이때 Activity 1은 onDestory() -> onCreate()가 호출된다. 삭제하고 다시 만들게 된다.
그래서~~ FLAG_ACTIVITY_SINGLE_TOP와 같이 써준다. 그러면 onNewIntent()-> onResume() 가 호출된다.
만약 스택에 없다면~~ 당연히 아무것도 지우지 못하고 맨 위에 올라가게 된다.
intent = new Intent(this, ActivityTest1.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);
=================================
=================================
=================================
출처: http://jinsemin119.tistory.com/206
호출하고자하는 APP의 패키지명이 com.common.mypackage이고 실행하고자 하는 액티비티명이 AtvName일경우
setClassName 메소드를 이용하여 다음과같이 App을 실행시킨다.
Intent intent = new Intent(); intent.setClassName("com.common.mypackage", "com.common.mypackage.AtvName"); intent.putExtra("putData", "UserData"); startActivityForResult(intent, 0); |
com.common.mypackage.AtvName 에서는 getIntent()를 이용하여 데이터를 받아 사용한다.
intent = new Intent(getIntent()); if(intent==null){ String strPKName= intent.getStringExtra("UserData"); intent.putExtra("Result", msg.getData().getString("Result")); this.setResult(RESULT_OK, intent); this.finish(); } |
퍼가실때는 따듯한 뎃글정도는 센스 입니다^^ CCL언제어디서나 CCL
자료출처 : Development Bakery
작성자 : 모노블럭
=================================
=================================
=================================
출처: http://theeye.pe.kr/archives/1298
[Android] Activity 생성시에 사용되는 Intent Flag 정리
안드로이드 엑티비티에 대해 이해하기 위해 필요한 지식은 3가지 정도가 아닐까 생각합니다. 바로 Activity Lifecycle, Task, Intent 입니다. 모두 어느정도 이해를 하시고 계신 상태라고 생각하고 글을 적어보겠습니다.
인텐트를 이용하여 새로운 엑티비티를 띄우기 위해서는 일반적으로 다음과 같은 방법으로 새로운 엑티비티를 실행하게 됩니다.
Intent intent = new Intent(this, MyActivity.class); startActivity(intent); |
위의 코드는 다음과 같은 순서로 실행이 됩니다.
1. 새로운 MyActivity 인스턴스가 생성됩니다.
2. 이 인스턴스가 현재 태스크 스택의 최상단에 푸시가 됩니다.
3. 엑티비티가 시작되며(onStart) 포그라운드로 가져옵니다.
하지만 위와 같은 인텐트 생성에 관련된 기본적인 실행 방법을 인텐트 플래그를 사용하여 임의로 조정할 수 있습니다.
intent.addFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); |
위와 같은 방법을 통해 특정한 플래그 옵션값을 startActivity(intent)가 수행될때 같이 넘겨줄 수 있습니다. 지금부터 이러한 플래그 옵션값들을 좀더 상세기 적어보도록 하겠습니다.
FLAG_ACTIVITY_BROUGHT_TO_FRONT
이 플래그는 사용자가 설정하는것이 아닌 시스템에 의해 설정되는 값입니다. 엑티비티의 실행모드가 singleTask이고 이미 엑티비티스택에 존재하고 있는 상태라고 가정을 할 때 다시 그 엑티비티가 호출되고 재활용 되었을 경우 자동으로 설정이 됩니다.
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
이 플래그를 사용하면 태스크가 리셋될때 플래그가 사용된 엑티비티부터 최상단의 엑티비티까지 모두를 삭제합니다. 리셋은 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 플래그에 의해 실행이 되는데 시스템에 의해 홈스크린에서 사용자에 의해 백그라운드에 있던 태스크가 포그라운드로 전환될때에 항상 붙게 됩니다.
위의 그림에서 볼 수 있듯이 백그라운드와 포그라운드 전환관계에서 CLEAR_WHEN_TASK_RESET 플래그가 설정된 엑티비티와 이후의 엑티비티 모두가 삭제되는것을 알 수 있습니다. 백그라운드로 넘어갔을때 유지를 안해도 될 일회성 엑티비티들은 해당 플래그를 사용하면 도움이 될것이라 봅니다.
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
이 플래그는 인텐트를 이용하여 새로운 태스크를 생성하거나 존재하고 있는 태스크를 포그라운드로 가져오는 경우가 아닌경우에는 사용하여도 아무런 효과가 없습니다. 적절한 경우라면 태스크를 리셋 합니다. 이때에 태스크의 affinity 설정에 맞추어 리셋이 일어나게 되며FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET과 같은 플래그 설정에 맞추어진 특정 처리가 일어나게 됩니다.
FLAG_ACTIVITY_CLEAR_TOP
만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.
예를 들면 현재 ABCDE순서로 엑티비티가 스택에 들어있다고 할때 엑티비티E에서 C를 호출하게 되면 D와 E는 스택에서 삭제되고 ABC만이 남아있게 됩니다. 여기서 AB 역시 남는다는 것을 이해하셔야 합니다.
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
엑티비티가 새로운 태스크안에서 실행될때에 일반적으로 타겟 엑티비티는 ‘최근 실행된 엑티비티’ 목록에 표시가 됩니다. (이 목록은 홈버튼을 꾹 누르고 있으면 뜹니다) 이 플래그를 사용하여 실행된 엑티비티는 최근실행된엑티비티 목록에서 나타나지 않습니다.
FLAG_ACTIVITY_FORWARD_RESULT
기본적으로 엑티비티A가 엑티비티B를 호출하였다고 할 경우 startActivity(intent) 대신에startActivityForResult(intent) 메서드를 이용하여 호출을 함으로써 엑티비티B의 결과값을 엑티비티A로 전달할 수 있습니다.
엑티비티B에서는 setResult(int resultCode)를 정의한 뒤에 종료를 하게 되며 엑티비티B를 호출하였던 엑티비티A는 콜백메서드인 onActivityResult()를 통해 결과값을 전달받게 됩니다.
이제 엑티비티B가 또다른 엑티비티C를 호출하였다고 가정해 봅시다. 그리고 이렇게 호출된 엑티비티C에서 엑티비티A까지 전달할 결과값을 정의하였습니다. 이 결과값을 B에서 A로 또다른 코드를 통해서 프로그래머의 코드를 통해서 값을 전달하는 번거로움을 피하기 위해 안드로이드에서는 이 인텐트 플래그값을 제공합니다.
위에 나와있는 그림의 예를 통해 보면 엑티비티B가 엑티비티C를 호출하기위해 단순히startActivity()를 이용하는 것을 알 수 있습니다. 그리고 지금 설명중인 플래그를 붙이도록 합니다. 이후에 엑티비티C에서는 setResult()를 통해 결과값을 정의를 한후에 finish()를 통해 엑티비티를 종료하도록 합니다.
엑티비티B에서는 단순히 마찬가지로 finish()를 통해 엑티비티를 종료하시기만 하면 됩니다. 이후에startActivityForResult()를 통해 엑티비티B를 호출했던 엑티비티A는 onActivityResult() 콜백 메서드로 결과값을 받아보시면 엑티비티C에서 정의한 값을 받을 수 있다는것을 알 수 있습니다.
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
이 엑티비티 플래그는 시스템에 의하여 자동으로 설정되는 플래그입니다. 홈스크린화면에서 홈버튼을 롱클릭함으로써 뜨게 되는 “최근실행목록”을 통해 실행되었을 경우 자동으로 설정됩니다.
FLAG_ACTIVITY_MULTIPLE_TASK
이 엑티비티 플래그는 FLAG_ACTIVITY_NEW_TASK와 함께 사용하지 않으면 아무런 효과가 없는 플래그입니다. 두개의 플래그를 동시에 사용할 경우 새로운 태스크는 재활용되지 않고 무조건 새로 생성되며 피호출되는 엑티비티는 이 새로운 태스트의 최상위 엑티비티가 됩니다. (당연히 하나밖에 없을테니-_-a)
FLAG_ACTIVITY_NEW_TASK
이 엑티비티 플래그를 사용하여 엑티비티를 호출하게 되면 새로운 태스크를 생성하여 그 태스크안에 엑티비티를 추가하게 됩니다. 단, 기존에 존재하는 태스크들중에 생성하려는 엑티비티와 동일한affinity를 가지고 있는 태스크가 있다면 그곳으로 새 엑티비티가 들어가게됩니다.
하나의 어플리케이션안에서는 모든 엑티비티가 기본 affinity를 가지고 같은 태스크안에서 동작하는것이 기본적(물론 변경이 가능합니다)이지만 FLAG_ACTIVITY_MULTIPLE_TASK 플래그와 함께 사용하지 않을경우 무조건적으로 태스크가 새로 생성되는것은 아님을 주의하셔야 합니다.
FLAG_ACTIVITY_NO_ANIMATION
안드로이드 OS가 2.0으로 올라오면서 새로 추가된 엑티비티 플래그입니다. 이 플래그를 사용할 경우 엑티비티가 스크린에 등장할시에 사용될 수 있는 다양한 애니메이션 효과를 사용하지 않습니다.
FLAG_ACTIVITY_NO_HISTORY
이 플래그를 사용할 경우 새로 생성되는 엑티비티는 어떤 태스크에도 보존되지 않게 됩니다. 예를 들면 로딩화면과 같이 다시 돌아오는것이 의미가 없는 화면이라면 이 플래그를 사용하여 태스크에 남기지 않고 자동적으로 화면이 넘어감과 동시에 제거할 수 있습니다.
FLAG_ACTIVITY_NO_USER_ACTION
이 플래그가 설정되면 자동적으로 엑티비티가 호출될 경우에 자동 호출되는 onUserLeaveHint()가 실행되는것을 차단합니다. onUserLeaveHint() 콜백 메서드는 어플리케이션 사용중에 전화가 온다거나 하는등의 사용자의 액션없이 엑티비티가 실행/전환되는 경우에 호출되는 메서드입니다.
FLAG_ACTIVITY_REORDER_TO_FRONT
호출하려던 엑티비티가 이미 엑티비티 스택에 존재하고 있다면 이 플래그를 사용하여 스택에 존재하는 엑티비티를 최상위로 끌어올려줍니다. 결과적으로 엑티비티 스택의 순서가 재정렬되는 효과를 가집니다. 위의 예를 볼 경우에 엑티비티E가 C를 호출하게 됨으로써 엑티비티C가 최상단으로 이동하는 결과를 확인하실 수 있습니다.
FLAG_ACTIVITY_SINGLE_TOP
이 플래그는 말그대로 하나의 탑(?)을 의미하는 설정입니다. 엑티비티를 호출할 경우 호출된 엑티비티가 현재 태스크의 최상단에 존재하고 있었다면 새로운 인스턴스를 생성하지 않습니다. 예를 들어 ABC가 엑티비티 스택에 존재하는 상태에서 C를 호출하였다면 여전히 ABC가 존재하게 됩니다.
참고 :
http://blog.akquinet.de/2010/04/15/android-activites-and-tasks-series-intent-flags/
http://developer.android.com/reference/android/content/Intent.html
=================================
=================================
=================================
출처: http://devian7.tistory.com/168
안드로이드 프로그래밍에서 중요한 개념 'Intent'
보고있는 책보다도 잘 정리를 해 놓았다.....
[원문] http://gtko.springnote.com/pages/5254593?edit=1
인텐트를 통한 액티비티를 명시적으로 시작하는 방법, 암시적인 인텐트로 데이터의 한 부분에 대해 수행되는 액션을 요청하는 방법, 안드로이드가 그 요청을 서비스할 수 있는 애플리케이션 콤포넌트를 결정하도록 하는 방법을 설명한다.
브로드캐스트 인텐트는 시스템 전역에 이벤트를 알린다. 즉, 브로드캐스트로 전송하고 브로드캐스트 수신자로 이를 받아 처리한다.
어댑터는 데이터 소스와 프리젠테이션(view 들)과 연결하는 방법.
인텐트 소개
어 떤 액션이 수행되는데 특정 데이터의 특정 부분을 가지고 수행하라는 선언으로 메시지를 전달하는 메커니즘이다. 즉, activity, native 장치 등 상호간의 작용을 지원한다. 독립적인 콤포넌트들의 컬렉션을 서로 연결된 단일 시스템으로 변경하는 역할이기도 하다.
인텐트 역할
액티비티를 명시적( 클래스 지정) 혹은 암시적(데이터의 어느 한 부분에 대해 수행되는 액션을 요청)으로 시작하는 것.
브로드캐스트 인텐트로 이벤트 중심 애플리케이션을 구성할 수 있다
인테트로 activity 시작
인텐트는 애플리케이션 내에 있는 activity 간의 시작, 중지, 전이에 사용된다.
현재 activity에서 다른 activity 화면을 열려면, startActivity() 를 사용한다. 이 액티비티는 부모 액티비티와 독립적이다.
- startActivty(a_intent)
- Intent a_intent 는 대상 클래스를 명시적으로 지정하거나, 수행할 액션일 수 있다. 액션을 지정하면 런타임은 intent resolution 이라는 과정을 거쳐 acitivity를 선택한다.
명시적 activity start
AndroidMenifest에 선언된 activity 를 명시적으로 지정해 시작할 수 있다.
- Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
- sgtartActivity(intent);
- startActivity()가 수행되면 현재 MyActivity는 onPause() 상태로 가고, MyOtherAcitivity 가 활성상태로 스택의 맨 위로 갈 것이다.
- 새로운 acitivity에서 finish()를 호출하면 MyActivity는 종료되어 스택에서 제거된다.
- 그렇지 않다면 MyOtherActivity에서 back button을 누르면 MyActivity로 돌아 올 수 있다.
- Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setClassName(this, MyActivity.class.getName());
startActivity(intent);
암시적 activity start
수행할 액션과 요구되는 데이터로 acitvity를 시작할 수 있다.
예를 들어 dialer를 통해 전화걸기를 하려며 새로운 dialer를 구현하기 보다 기존 dialer와 전화목록을 이용하면 될 것이다.
- Intent new_intent = new Intent( Intent.ACTION_DIAL, Uri.parse("tel:555-2368")
- startAcitivity(new_intent)
- runtime은 new_intent를 분석해 전화번호에 대한 전화걸기 action을 제공하는 acitivity를 시작한다.
- 여러 native application은 이런 액션에 대한 콤포넌트를 제공하고, 사용자도 새로운 액션을 지원하거나
- 네이티브 액션의 대체 공극바를 제공하기 위해 등록될 수 있다.
Linkity 로 시작
정 규식 패턴 매칭을 통해 TextView 에 하이퍼링크를 자동으로 생성해 주는 helper class잉다. 즉 패턴에 일치하는 텍스트는 그것을 대상 URI로 사용해 암시적으로 startAcitivity( new Intent(Intent.ACTION_VIEW, uri)) 를 호출하는 하이퍼 링크로 변환된다.
- 프리셋 문자열 패턴 : 이메일, 전화번호, http: 웹 주소 등 ...
- http://developer.android.com/reference/android/text/util/Linkify.html
Linkify 클래스는 대표적으로 TextView와 Spinnerable UI 를 사용할 수 있다.
코드에서 Likify 사용
- 텍스트에 있는 http url, email 주소를 likify 한다.
- TextView myTextView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(myTextView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
- url 을 클릭하면 웹브라우저가 열리고, email 주소를 클릭하면 email client가 호출된다.
view 선언에서 linkify 사용
android:autoLink 속성에 none, web, email, phone, all 에 self-describing-values로 '|'로 구분해 사용할 수 있다.
- <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/linkify_me"
android:autoLink="phone|email"
/>
사용자 정의 linkify 문자열 만들기
사용자 RegExp 를 만들어 linkify 문자열로 사용할 수 있다.
- int flags = Pattern.CASE_INSENSITIVE;
Pattern pattern = Pattern.compile("\\bquake[0-9]*\\b", flags);
Linkify.addLinks(myTextView, pattern, "content://com.pad.earthquake/earthquakes/");
- quake로 시작하고 그 뒤에 숫자가 나오는 모든 문자열 찾아 content://.. URI에 붙여준다.
TransformFilter, MatchFilter 인터페이스 이용한 문자열 사용
RegExp 패턴 매치에 추가적인 조건을 더할 수 있다.
- MatchFilter matchfilter = new MatchFilter() {
public boolean acceptMatch(CharSequence s, int start, int end) {
return (start == 0 || s.charAt(start-1) != '!'); }
};
TransformFilter transformfilter = new TransformFilter() {
public String transformUrl(Matcher match, String url) {
return url.toLowerCase(); }
}; - String prefixWith = "http://www.";
pattern = Pattern.compile("\\bTEST.COM\\b");
Linkify.addLinks(myTextView, pattern, prefixWith, matchfilter, transformfilter );
- 문자열 앞에 !가 있는 것은 취소하는 필터 구현.
액티비티 결과
서 브액티비티를 시작하면 서브 액티비티가 종료할 때 부모의 이벤트 핸들러(onActivityResult())를 호출한다. startActivityForResult() 는 시작할 intent 와 request code 를 사용해서 activity의 결과를 request code로 식별한다.
명시적으로 서브 액티비티 시작
- private static final int SHOW_SUBACTIVITY = 1;
- Intent intent = new Intent(getApplicationContext(), MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);
암시적 서브 액티비티 시작
- private static final int PICK_CONTACT_SUBACTIVITY = 2;
- Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
// Result resturned in onActivityResult
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
서브액티비티에 데이터 전달하기
Intent intent = new Intent();
Bundle bun = new Bundle();bun.putString(”param_string”, “the actual string”); // add two parameters: a string and a boolean
bun.putBoolean(”param_bool”, true);intent.setClass(this, SecondaryActivity.class);
intent.putExtras(bun);
startActivity(intent);
서브액티비티에서 전달된 데이터 처리...
Bundle bun = getIntent().getExtras();
String param1 = bun.getString(”param_string”);
boolean param2 = bun.getBoolean(”param_bool”);
서브 액티비티 / 인텐트 필터 호출에 응답
암시적으로 호출된 서브액티비티에서 수행할 액션, 데이터를 통해 요청된 작업을 진행한다.
@Override
public void onCreate(Bundle bundle) {
...
Intent intent = getIntent(); // 수행할 action, date 를 얻기 위해.
String action = intent.getAction();
Uri data = intent.getData();
...
}
또한 다음과 같이 startNextMatchingActivity() 메서드로 액션의 처리 책임을 가장 잘 일치하는 컴포넌트로 넘길수 있다.
즉, 야밤에 다른 intent 로 처리를 넘겨버리는 예이다.
Intent intent = getIntent(); // 수행할 action, date 를 얻기 위해.
if( isAfterMidnight)
startNextMatchingActivity(intent);
서브 액티비티 / 결과 돌려주기
finish()를 호출하기 전에 setResult() 로 결과를 저장한다. 결과 코드와 Intent로 표현된 result payload 로 제공된다.
Activity.RESULT_OK, Activity.RESULT_CANCELED 를 결과로 많이 사용하고, 사용자 정의 결과값을 줄 수 있다. 결과 인텐트에 연락처, 전화번호, 미디어 파일에 대한 URI 정보를 가질 수 도 있다.
Uri data = Uri.parse("content://horses/" + selected_horse_id);
Intent result = new Intent(null, data);
result.putExtra(IS_INPUT_CORRECT, inputCorrect);
result.putExtra(SELECTED_PISTOL, selectedPistol);
setResult(RESULT_OK, result);
finish();
결과 받기
부모 액티비티에서 onActivityresult() 메소드는 서브액티비티의 결과를 받는다.
- Request code: 서브 액티비티를 시작하는데 사용되었던 요청 코드
- Result code: 서브 액티비티가 자신의 결과를 나타내기 위해 설정한 코드 예) Activity.RESULT_OK, Activity.RESULT_CANCELED
- 서브 액티비티가 비정상 종료되거나 결과코드가 지정 안되면 Activity.RESULT_CANCELED 이 결과 코드이다.
- data: 모든 결과를 담은 인텐트.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (SHOW_SUBACTIVITY) :
if (resultCode == Activity.RESULT_OK) {
Uri horse = data.getData();
boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
Toast.makeText(this, "Pistol Selected: " + selectedPistol, Toast.LENGTH_SHORT).show();
}
break;
case (PICK_CONTACT_SUBACTIVITY) :
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(this, "CONTACT SELECTED", Toast.LENGTH_SHORT).show();
// TODO Handle contact selection.
}
break;
}
Native android action
네이티브 안드로이드 애플리케이션도 역시 인텐트를 사용해 액티비티와 서브 액티비티를 시작한다. Intent 에서 제공하는 네이티브 액션을 살펴보자. 아래 static 문자열은 암시적으로 인테트를 사용할 때 유용하다.
상수타겟 컴포넌트액션
ACTION_CALL | activity | 전화를 걸어라. |
ACTION_EDIT | activity | 사용자에게 편집할 데이터를 표시하라. |
ACTION_MAIN | activity | 데이터 입력과 반환 결과 없이 태스크의 최초의 액티비티로써 액티비티를 실행하라. |
ACTION_SYNC | activity | 모바일 디바이스의 데이터와 서버의 데이터를 동기화하라. |
ACTION_BATTERY_LOW | broadcast receiver | 배터리가 부족하다는 경고. |
ACTION_HEADSET_PLUG | broadcast receiver | 헤드셋이 디바이스에 연결 또는 분리되었다는 것. |
ACTION_SCREEN_ON | broadcast receiver | 스크린이 켜졌다는 것. |
ACTION_TIMEZONE_CHANGED | broadcast receiver | 타임존 설정이 바뀌었다는 것. |
ACTION_INSERT : 지정된 커서로 새로운 항목을 삽입할 수 있는 액티비티를 연다. 서브 액티비티느 새로 삽입된 항목에 대한 URI를 리턴해야 한다.
ACTION_PICK: URI 로 부터 데이터 항목 하나를 고를 수 있는 서브 액티비티를 듸운다. 예) content://contacts/people 전달되면 네이티브 연락처 목록이 뜬다.
ACTION_SEARCH; 검색, SearchManager.QUERY 키를 사용하는 인텐트의 엑스트라 문자열 형태.
ACTION_SENDTO: uri에 지정된 사람에게 보내는 액티비티.
ACTION_SEND: 지정된 데이터를 전송하는 액티비티 시작. 인텐트 타입은 setType을 사용해 전송되는 데이터의mime타입으로 설정
ACTION_VIEW: URI가 합리적으로 보여지게 요청. http: 는 브라우져, tel: 다이얼러, geo: 구글맵
ACTION_WEB_SEARCH: uri에 웹검색을 수행하는 액티비티를 연다
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, “검색어”);
startActivity(intent);
참조
http://www.itwizard.ro/how-to-create-a-new-android-activity-82.html
인텐트 필터를 이용한 암시적 인텐트 서비스
인텐트가 데이터 집합에 대해 수행되는 액션을 위한 요청으로 보면 인텐트 필터는 액티비티, 서비스, 브로드캐스트 수신자를 특정한 종류의 데이터에 대한 액션을 수행하는 존재로 등록하는데 사용.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<activity android:name=".EarthquakeDamageViewer" android:label="View Damage">
<intent-filter>
<action android:name="com.paad.earthquake.intent.action.SHOW_DAMAGE"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.ALTERNATIVE_SELECTED"/>
<data android:mimeType="vnd.earthquake.cursor.item/*"/>
</intent-filter>
</activity>
- action: 서비스 되는 액션의 이름. 액션은 유일한 문자열이어야 하므로 자바 패키지 이름 규약을 사용한다.
- category: 액션이 서비스 되어야 하는 상황을 지정. 여러개의 category 가능.
- 안드로이드 기본 cagegory
- android.intent.category.ALTERNATIVE: 기본 액션에 대한 대안 액션임을 선언.
- android.intent.category.SELECTED_ALTERNATIVE: 대안으로 선택 가능한 것들에 대한 선언.
- android.intent.category.BROWSABLE: 브라우져 안에서 사용 가능한 액션 지정.
- android.intent.category.DEFAULT : 데이터 값에 대한 기본 액션으로 지정.
- android.intent.category.GARGET : 이 액티비티가 다른 액티비티 내부에 포함되어 동작 할 수 있도록 지정.
- android.intent.category.HOME: 네이티브 홈 스크린의 대안.
- android.intent.category.LAUNCHER: 애플리케이션 런처.
- 안드로이드 기본 cagegory
- data: 실행 할 수 있는 데이터에 대한 명세. 여러개 지정 가능.
- android:host: 유효한 호스트 이름
- android:mimetype: 데이터 형식. 예) <data android:mimeType="vnd.moonbase.cursor.item/*"/> 는 ㅁ든 안드로이드 커서
- android:path: URI에 대한 유효한 경로 값 예) /transport/boarts/
- android:port 지정된 호스트에 대한 유효한 포트
- android:scheme 특정한 스킴. 예) contnet, http
안드로이드가 인텐트 필터를 찾는 방법
인테트 URI 실행시 실행 할 수 있는 액티비티가 여러개 존재하면 그중 가장 좋은 것이 시작될 것이다. 이런 과정을 Intent resolution 이라 한다.
- 설치된 패키지로 부터 사용 가능한 모든 인텐트 필터들의 리스트를 구성
- action이나 cagegory에 맞지 않는 필터는 제외
- 필터가 지정된 액션을 포함하거나 아무런 액션도 지정되지 않은 경우 action matches 가 이루어 진다.
정의된 action이 있지만 지정된 액션과 일치않으면 실패 - category matching: 인텐트 필터는 인텐트에 정의된 모든 category 를 반드시 포함해야 한다. catregory가 지정되지 않은 인텐트 필터는 category가 없는 인텐트하고만 일치된다.
- 필터가 지정된 액션을 포함하거나 아무런 액션도 지정되지 않은 경우 action matches 가 이루어 진다.
- 인텐트에 있는 data uril 의 각 부분이, scheme, permissionk path, mime 등 정의하고 있다면, 인텐트 필터의 data 태그와 비교 된다.
- MIME: 와일드카드를 이용해 하위 타입을 일치할 수 있다.
- scheme: URI의 프로토코 부분. http, ftp...
- host name, URI에서 경로 사이에 있는 부분 www.google.com
- 경로
- 이 과정에서 하나 이상의 컴포넌트가 확인되면 인턴트 필터 노드에 추가될 수 있는 선택적 태그와 함께 우선순위에 따라 순서가 매겨진다. 그런다음 가장 높은 순위의 컴포넌트가 리턴된다.
=================================
=================================
=================================
안드로이드 인텐트란? (Android Intent)
- 안드로이드 시스템에서 커뮤니케이션을 담당하는 역할로 컴포넌트간의 호출과 메시지 전달에 이용한다
- 런처에 나타나지 않는(루트 액티비티가 아닌) 액티비티를 실행시킬 때 사용한다
- Activity, Service, Broadcast Receiver 컴포넌트를 활성화 시킬 수 있다
- startActivity(), startActivityForResult()에 포함되어 Activity를 호출하며, 호출된 액티비티는 getIntent()를
이용해 메시지를 전달받고, 이후 전달받은 메시지는 onNewIntent()를 override하여 전달받을 수 있다
- startActivityForResult()를 이용해 호출된 액티비티는 인텐트에 반환값을 넣어 다시 자신을 호출한
액티비티에게 되돌려 줄 수 있으며 이때에는 setResult()에 인텐트를 포함시켜 반환한다
- startService(), bindService()에 포함되어 Service를 호출하며, 호출된 서비스는 onStart(), onBind()를
override하여 메시지를 전달받을 수 있다
- sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcase()등에 포함되어 Broadcast를 호출하며
호출된 브로드캐스트는 onReceive()를 override하여 메시지를 전달받을 수 있다
- 이외에도 PendingIntent 라는 권한을 위임하는 인텐트가 있다
- 메시지를 전달할때 putExtra()를 사용하며 전달받을때에는 getExtras().get변수타입() 또는
get변수타입Extra()을 사용한다
ACTION_SEND를 이용한 암시적 인텐트 적용시 나오는 Chooser
명시적 인텐트와 암시적(묵시적) 인텐트 (Explicit intent & intent)
- 인텐트를 사용할때에는 명시적으로 하나의 컴포넌트를 선택하여 메시지를 전달하는 방법과
암시적으로 여러 컴포넌트중 지정한 특성을 가진 컴포넌트중 하나를 선택하여 사용하는 방법이 있다
- 암시적 인텐트는 명시적으로 알지 못하는 컴포넌트 중 자신이 활용 가능한 컴포넌트를 다른
어플리케이션으로부터 불러서 사용할 수 있게 해주어 여러 어플리케이션의 컴포넌트를 활용가능하게 한다
이로인해 어플리케이션의 경계없이 서로다른 어플리케이션을 하나처럼 사용 가능하게 해준다
- 명시적 인텐트는 실행할 컴포넌트의 클래스명을 지정하여 활성화 시킨다
- 암시적 인텐트는 Action, Category, Data를 사용해 인텐트 필터에(intent filter) 걸러내고 남는
컴포넌트를 찾아(인텐트해석:intent resolving) 이중 한가지를 createChooser()로 선택하여 실행시킨다
- 인텐트 필터는 하나뿐이 아닌 여러개를 지정하여 일치하는 필터가 있을경우 통과할 수 있다
- Action은 AndroidManifest에 정의해놓은 각각의 컴포넌트가 처리할 행동을(Action) 참조하여 사용자가
지정한 Action과 일치하는 컴포넌트를 찾아내며 지정된 Action이 없을경우 일치한 것으로 간주한다
- Category는 AndroidManifest에 정의해놓은 각각의 컴포넌트 분류를(Category) 참조하여 사용자가
지정한 Category와 일치하는 컴포넌트는 찾아내며 지정된 Category가 없을경우 Category가 지정되지
않은 컴포넌트만 일치한 것으로 간주한다
- Data는 AndroidManifest에 정의해놓은 각각의 컴포넌트 URI를 참조하여 사용자가 지정한 type 또는
schema등 과 일치하는 컴포넌트는 찾아낸다
- 인텐트를 이용한 브라우저에 웹페이지 띄우기 예제
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
Intent-Filter 값
Intent 클래스의 정의 | AndroidManifest 일치값 | 설명 |
ACTION_MAIN | android.intent.action.MAIN | 시작(루트) 액티비티 |
ACTION_VIEW | android.intent.action.VIEW | 해당 자원을 보여주는 액션 |
ACTION_CALL | android.intent.action.CALL | 전화를 거는 액션 |
ACTION_DIAL | android.intent.action.DIAL | 전화 다이얼이 나오는 액션 |
ACTION_SEND | android.intent.action.SEND | 문자,메일등 데이터를 보내는 액션 |
ACTION_SCREEN_ON | android.intent.action.SCREEN_ON | 화면이 켜지는 액션 |
ACTION_BATTERY_LOW | android.intent.action.BATTERY_LOW | 배터리 부족 액션 |
Intent 클래스의 정의 | AndroidManifest 일치값 | 설명 |
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 기본 카테고리 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | 어플리케이션 런쳐로 실행되는 분류 |
CATEGORY_HOME | android.intent.category.HOME | 홈스크린에 표시되는 액티비티 |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 인터넷 브라우저 사용분류 |
http://developer.android.com/guide/topics/intents/intents-filters.html#iobjs
=================================
=================================
=================================
출처: http://codedragon.tistory.com/338
인텐트
인텐트란 애플리케이션의 컴포넌트, 구체적으로 말하자면 액티비티, 서비스, 브로드캐스트리시버에게 작업을 요청하기 위해 필요한 데이터를 전달해주는 메시지에 해당하는 '전달 객체'로 보통 '인텐트 객체'라고 합니다.
인텐트 생성
명시적 인텐트 (Explicit Intent) |
호출 대상 컴포넌트의 이름이 명시되어 있는 인텐트 즉, 어떤 것을 호출해야 할지 명시되어 있는 인텐트 new Intent(Context packageContext, class cls); ex) new Intent(this,SampleActivity.class) |
암시적 인텐트 (Implicit Intent) |
호출 대상 컴포넌트가 정확히 정해진 것이 아니라, 호출 대상 컴포넌트의 특성만 나열되어 있는 인텐트 new Intent(String action, Uri uri); ex) Uri tel=Uri.parse("tel:01056781234"); new Intent(Intent.ACTION_DIAL,tel); |
인텐트 호출
startActivity() | startActivity(new Intent(Intent.Action_DIAL,tel)); |
startActivityForResult() | //호출 private Static final int PICK_REQUEST=1337; .... String str=Uri.parse(type.getText().toString()); Intent intent=new Intent(Intent.ACTION_PICK,str); startActivityForResult(intent,PICK_REQUEST); //실행된 액티비티가 종료되면 onActivityResult() 메소드가 호출 protected void onActivityResult(int requestCode,int resultCode,Intent data){ if(requestCode==PICK_REQUEST){ if(resultCode==RESULT_OK){ startActivity(new Intent(Intent.ACTION_VIEW,data.getData())); } } } |
인텐트로 데이터 전달
인텐트로 호출할 액티비티에 전송할 데이터 셋팅 Intent intent=new Intent(this,IntentCallee.class); intent.putExtra("name","전송할 문자열"); <- 전송할 문자열 셋팅 startActivity(intent); 실행된 액티비티에서 인테트를 호출한 후 문자열 추출 Intent intent=getIntent(); String name=intent.getExtras().getName("name").toString(); ß 전송된 문자열 추출 |
인텐트의 구성 요소
인텐트의 종류와 구성 요소
명시적 인텐트 | 암시적 인텐트 |
컴포넌트 이름 | 액션(Action) |
카테고리(Category) | |
데이터(Data) | |
데이터 타입(MIME Type) | |
엑스트라(Extras) |
컴포넌트 이름
애플리케이션 내 클래스 이름 또는 애플리케이션의 AndroidManifest.xml 파일에서 설정된 패키지 이름과 클래스 이름의 조합입니다.
컨포넌트 이름은 setComponent(), setClass(), 또는 setClassName() 메서드에 의해 설정되고 getComponent()에 의해 읽혀지게 됩니다.
Action(행동)
인텐트 액션은 수행되어야 하는 작업 내용으로 인텐트 액티비티 액션과 브로드캐스트 액션으로 나뉩니다.
액티비티 액션 | 액티비티를 호출하겠다는 액션 |
브로드캐스트 액션 | 브로드캐스트리시버를 호출하겠다는 액션 |
액티비티 액션
액션 상수 | 설명 |
ACTION_MAIN | 시작하는 액티비티를 지정합니다. |
ACTION_VIEW | 인텐트에 첨부되는 데이터의 URI가 가리키는 데이터를 사용자에게 보여주라는 액션입니다. |
ACTION_EDIT | 인텐트에 첨부되는 데이터의 URI가 가리키는 데이터를 변경하라는 액션입니다. |
ACTION_DELETE | 인텐트에 첨부되는 데이터의 URI가 가리키는 데이터를 삭제하라는 액션입니다. |
ACTION_DEFAULT | ACTION_VIEW와 동일합니다. |
ACTION_PICK | 데이터에서 하나(URI)를 선택하여 정보를 반환하라는 액션입니다. |
ACTION_GET_CONTENT | 데이터에서 하나의 컨텐트를 선택하여 반환하라는 액션으로 액티비티에 의하여 신규 작성한 데이터를 반환하는 것도 가능합니다. |
ACTION_RUN | 데이터를 실행시키는 액션입니다. |
ACTION_INSERT | 빈 아이템을 작성하라는 액션입니다. |
ACTION_CALL | 전화 연결을 요청하는 액션입니다. 실제로 전달된 전화 번호로 전화를 겁니다. |
ACTION_DIAL | 전화 연결을 요청하는 액션입니다. 전화 다이얼패드 화면으로 이동합니다. |
ACTION_SENDTO | 데이터의 메시지를 보내라는 액션입니다. |
ACTION_ANSWER | 전화 착신에 관한 액션입니다. |
ACTION_SYNC | 데이터와 서버의 데이터를 동기화하라는 액션입니다. |
인텐트 객체의 액션을 설정하는 메서드로 setAction()에 의해 설정될 수 있으며, getAction()메서드에 의해서 읽게 된다.
브로드캐스트 액션
브로드캐스트 액션 상수 | 설명 |
ACTION_BATTERY_CHANGED | 배터리 잔량의 변화를 알림 |
ACTION_BATTERY_LOW | 배터리 부족 경고 |
ACTION_BOOT_COMPLETED | 시스템 부팅 완료 알림 |
ACTION_DATE_CHANGE | 날짜 변경 알림 |
ACTION_HEADSET_PLUG | 헤드셋이 디바이스에 연결되었거나 또는 분리되었다는 것을 알림 |
ACTION_PACKAGE_ADDED | 애플리케이션 패키지 추가 시 알림 |
ACTION_PACKAGE_REMOVED | 애플리케이션 패키지 제거 시 알림 |
ACTION_SCREEN_ON | 스크린이 켜졌음을 알림 |
ACTION_TIMEZONE_CHANGED | 타임존 변경 시 알림 |
ACTION_TIME_CHANGED | 시간 지정 시 알림 |
ACTION_TIME_TICK | 매시간 변경 시 알림 |
Category(분류)
인텐트를 수신하여야 할 컴포넌트의 종류에 대한 정보를 포함하는 문자열을 정의합니다. 주로 수신받을 액티비티와 관련되어 안드로이드에서 몇 가지의 카테고리 상수를 제공하고 있습니다.
카테코리 상수 | 설명 |
CATEGORY_BROWSABLE | 타켓 액티비티는 링크에 의해 참조되는 데이터(예를 들어 이미지나 이메일 메시지)를 보여주기 위해 브라우저가 호출 되어야 합니다. |
CATEGORY_HOME | 디바이스가 켜질 때, HOME 키가 눌렸을 때 사용자가 보게되는 첫 번째 화면인 액티비티의 홈 화면을 보여주는 액티비티가 되어야 합니다.. |
CATEGORY_LAUNCHER | 액티비티는 하나의 태스크에서 최초로 생성된 액티비티가 되며, 최상위 계층의 애플리케이션으로 시작됩니다. |
CATEGORY_PREFERENCE | 타깃 액티비티는 설정 프레퍼런스입니다. |
Data(데이터)
Data는 호출 대상 액티비티가 처리해 주었으면 하는 데이터 "주소"입니다.(실제 데이터가 아닙니다)
이러한 주소는 URI(Uniform Resource Identifier) 형식으로 정의되어 있으며, 전화번호, 웹 주소 등 다양한 형태가 있습니다.
예) 액션이 'ACTION_DIAL'이라면, 데이터 필드는 통화해야 할 전화번호를 가진 'tel:URI'을 가져야 합니다.
MIME Type(종류)
- 인텐트 객체 내의 데이터는 데이터의 "주소"만을 나타낼 뿐, 주소 자체에서 해당 URI가 가리키는 데이터의 종류가 어떤 것인지는 알 수가 없습니다.
- 실제 데이터의 종류가 음악이 될 수도 있고, 영상이 될 수도 있고, 연락처, 메모 등 어떤 것이든 될 수 있습니다. 즉, Type은 데이터의 "종류"를 지정하여 인텐트 해석 과정에서 정확하게 대상 컨포넌트를 찾을 수 있도록 해 줍니다.
Extra(추가 정보)
인텐트는 엑스트라(Extras)에 필요한 값을 입력하면 안드로이드는 엑스트라 값을 번들(bundle) 객체로 바꿉니다. 위에서 만들어진 번들 객체는 인텐트를 사용하여 애플리케이션 컴포넌트를 호출할 때 해당 컴포넌트에 전달됩니다.
플래그
다양한 종류의 플래그(Flags)는 대부분 안드로이드 시스템에게 액티비티를 시작시키는 방법과 시작 이후 액티비디를 다루는 방법을 알려줍니다.
Intent i = new Intent(this, Test.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); |
플래그 | 설명 |
FLAG_ACTIVITY_CLEAR_TOP | 실행할 액티비티가 태스크에 이미 있다면 태스크에 있는 동일한 액티비티부터 최상단의 액티비티까지 모두 제거하고 새로운 액티비티를 실행하는 플래그입니다. 그래서 태스크 스택에 A, B, C, D가 있을 때, 이 플래그를 지정해서 B를 호출하면 B, C, D가 모두 스택에서 제거됩니다. 그리고 새로운 B 액티비티가 스택에 추가됩니다. |
FLAG_ACTIVITY_SINGLE_TOP | 실행할 액티비티가 태스크 스택 최상단에 이미 있다면 액티비티를 다시 실행하지 않는 플래그입니다. 다시 실행하지 않는다는 것은 태스크에 존재하는 액티비티를 재사용한다는 것을 의미합니다. 재사용한다는 것은 액티비의 많은 리소스와 사용자가 입력했던 데이터들을 그대로 유지할 수 있다는 것을 의미합니다 |
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | 사용자가 홈 스크린이나 "최근 실행 액티비티 목록"에서 태스크를 시작할 경우 시스템이 설정하는 플래그입니다. 이 플래그는 새로 태스크를 시작하거나 백그라운드 태스크를 포그라운드로 가지고 오는 경우가 아니라면 영향을 주지 않습니다. "최근 실행 액티비티 목록" 홈 키를 오랫동안 눌렀을 때 보여지는 액티비티 목록입니다. |
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | 태스크를 재시작할 때 액티비티를 종료할 수 있도록 액티비티에 표시를 하는 플래그입니다. 이 플래그에 의해 표시된 액티비티들은 태스크가 백그라운드에 있다가 포그라운드(전면)에 보이게 될 때 태스크 스택에서 제거됩니다. 단, 해당 태스크는 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 플래그가 설정되어 있어야 합니다. |
FLAG_ACTIVITY_NEW_TASK | 실행한 액티비티와 관련된 태스크가 존재하면 동일한 태스크 내에서 실행하고, 그렇지 않으면 새로운 태스크에서 액티비티를 실행하는 플래그입니다. |
FLAG_ACTIVITY_MULTIPLE_TASK | 액티비티를 항상 새로운 태스크에서 실행하는 프래그이며, FLAG_ACTIVITY_NEW_TASK와 함께 사용해야 동작합니다. |
FLAG_ACTIVITY_CLEAR_TASK | 태스크를 초기화하는 플래그입니다. 액티비티가 이 플래그와 함께 호출되면 태스크에 존재하던 다른 액티비티는 모두 종료됩니다. 이 플래그는 반드시 FLAG_ACTIVITY_NEW_TASK 플래그와 함께 사용되어야 합니다. |
FLAG_ACTIVITY_FORWARD_RESULT | 액티비티 처리 결과를 전달할 수 있는 플래그입니다. 액티비티에서 다른 액티비티를 호출해서 결과 값을 받고 싶을 때 사용하는 것이 startActivityForResult(), setResult(), onActivityResult()메서드입니다. |
FLAG_ACTIVITY_NO_HISTORY | 실행한 액티비티를 태스크 스택에서 관리하지 않도록 해주는 플래그입니다. |
FLAG_ACTIVITY_REORDER_TO_FRONT | 실행한 액티비티가 태스크에 이미 존재하는 액티비티라면 새로 실행하지 않고 태스크에 있는 액티비티를 스택 최상단으로 옮기는 플래그입니다. |
FLAG_ACTIVITY_NO_ANIMATION | 액티비티 전환 시 애니메이션을 사용하지 않게 하는 플래그입니다. |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | "최근 실행 액티비티 목록"에 보이지 않도록 하는 플래그입니다." 최근 실행 익티비티 목록"은 홈 키를 오랫동안 눌렀을 때 보여지는 액티비티 목록입니다. |
FLAG_ACIVITY_BROUGHT_TO_FRONT | 태스크 스택에 있는 액티비티가 다시 실행되었을 때 시스템이 설정하는 플래그입니다. |
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | 액티비티가 "최근 실행 액티비티 목록"에서 실행될 경우 시스템이 설정하는 플래그입니다. |
=================================
=================================
=================================
안드로이드 코딩을 할 때, 가장 기본적인 메소드 중 하나가 바로 startActivityForResult()이다.
하지만 웹 어디를 뒤져봐도 사용법을 쉽게 설명해 둔 페이지는 찾아보기가 힘들더라. (망할것)
나처럼 완전 삽질을 하는 사람이 생겨나는 것을 막고자 이렇게 포스팅을 해보려 한다.
안드로이드의 Activity들은 startActivityForResult()라는 메소드를 통해 sub activity를 만들고 Activity끼리 서로 데이터를 교환할 수 있다.
그 사이에는 'extra'라고 하는 통로가 존재하는데, 이 부분을 잘 알아야 한다.
Activity A가 Activity B를 서브 엑티비티로서 부르고 그로부터 결과값인 데이터를 전송받기 위해서는 어떻게 해야 할까?
먼저 삽화를 통해 기본 원리를 파악해보도록 하자.
다음과 같은 원리이다.
Activity A가 startActivityForResult를 통해서 Activity B를 호출하면,
B는 종료가 되면서 Result 값을 통해 Extra 꾸러미를 넘긴다.
그러면 Activity는 Extra 꾸러미 안에 있는 데이터들을 꺼내서 사용할 수 있는 것이다.
그렇다면 실제 구현 과정에서 어떤 작업들을 해주어야 하는지 살펴보자.
[Activity A 사이드]
Activity A에서 구현되어야 할 부분은,
첫째, int값의 requestCode 값을 설정해준다.
둘째, Intent를 만들어 Activity B를 실행시킨다.
셋째, onActivityResult()를 통해 각 requestCode값에 해당하는 결과값을 받아온다.
[Activity B 사이드]
Activity B에서 구현되어야 할 부분은,
첫째, Intent를 만들어 데이터 꾸러미를 Intent에 추가시킨다.
둘째, 결과값을 보내면서 Extra 꾸러미를 가지고 있는 Intent를 함께 넘겨준다.
간단하지 않은가? 그럼 코드에서는 이와같은 것들이 어떻게 구현이 될까?
[Activity A 사이드]
private static final int B_ACTIVITY = 0;
public void onCreate(){
...
Intent a_i = new Intent(this, B.class);
startActivityForResult(a_i, B_ACTIVITY);
...}
public void onActivityResult(int requestCode, int resultCode, Intent intent){
super.onActivityResult(requestCode, resultCode, intent);
switch(requestCode){
case B_ACTIVITY: // requestCode가 B_ACTIVITY인 케이스
if(resultCode == RESULT_OK){ //B_ACTIVITY에서 넘겨진 resultCode가 OK일때만 실행
intent.getExtras.getInt("data"); //등과 같이 사용할 수 있는데, 여기서 getXXX()안에 들어있는 파라메터는 꾸러미 속 데이터의 이름표라고 보면된다.
}
}
}
[Activity B 사이드]
Bundle extra;
Intent intent;
onCreate(){
...
extra = new Bundle();
intent = new Intent(); //초기화 깜빡 했다간 NullPointerException이라는 짜증나는 놈이랑 대면하게 된다.
...
extra.putInt("data", 1);
intent.putExtras(extra);
this.setResult(RESULT_OK, intent); // 성공했다는 결과값을 보내면서 데이터 꾸러미를 지고 있는 intent를 함께 전달한다.
this.finish();
}
이와 같이 하면 B 사이드에서 1이라는 데이터값을 가지고 있는 "data"라는 이름표의 꾸러미는 Activity A로 결과값으로써 전달이 되고, 사용이 될 수 있는 것이다.
나는 Bundle을 이용해서 했는데 번들을 사용하지 않고도 결과값을 보내기 위한 메소드는 있다고 본다. 이거는 API를 보면 쉽게 파악할 수 있다.
또한 int값 말고도 모든 데이터 변수들을 보낼 수 있어, 그것에 대한 걱정은 하지 않아도 된다.
출처 : http://blog.naver.com/hisukdory?Redirect=Log&logNo=50088038280
=================================
=================================
=================================
by 야몽크 | 13.06.03 12:01 | 2,122 hit
test.a.a 패키지에서
다른 어플리케이션을 호출합니다
test.b.b 라는 패키지로 했을경우
test.b.b.test.class를 호출할경우
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("test.b.b", "test.b.b.test");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("PackageTest", test);
MainActivity.this.startActivity(intent);
startActivityForResult(intent, 0);
이렇게 해서 test.b.b의 패키지에 있는 test를 호출하여 잘 불러왔습니다
test.b.b.test에서는 넘어온 값을 찍으면 잘 찍힙니다.
Intent getIntent = getIntent();
String PackageTest = getIntent.getStringExtra("PackageTest") + "";
if(!PackageTest.equals("null")){
Toast.makeText(MainActivity.this, PackageTest, Toast.LENGTH_SHORT).show();
}
이렇게 해서 찍어주면 넘어온 값이 잘 찍힙니다.
그리고 test.b.b.test에서 버튼 클릭시 해당 엑티비티를 닫고
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getIntent());
intent.putExtra("PkTest", "잘된다");
setResult(RESULT_OK, intent);
finish();
}
});
위의 소스와 같이 setResult를 이용해서 특정 값을 되돌려주려고 하는데 값이 넘어가질 않네요...
완전히 다른 어플리케이션을 호출하여 값을 돌려받을때는 어떻게 돌려받아야되나요??
test.a.a.MainActivity 에서 돌아온 값을 받을때는
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_OK)
return;
if(requestCode == 0){
String test = data.getStringExtra("PkTest");
Toast.makeText(MainActivity.this, test, Toast.LENGTH_SHORT).show();
}
}
이렇게해주고 있는데 다른 어플리케이션 호출했다가 값 돌려받을때는 이런 방법으로 하는게 아닌가요??
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MainActivity.this.startActivity(intent);
startActivityForResult(intent, 0);
by 야몽크 2013.06.03 13:54
그거랑은 전혀 상관이 없어 보이는데요...
전혀 아무 현상도 일어나지 않습니다...
startActivityForResult(intent, 0);
호출로 다른 어플을 실행시키면 실행과 동시에 onActivityResult부분을 실행하게 되더라구요
그러면서 onStop()을 호출하구요
호출한 다른 어플이 setResult를 호출하면서 종료되면 넘어온 값을 받지를 못해서 문제가 되는데
이걸 받아오는 방법을 알고 싶어요..
by nicehee 2013.06.03 15:33
http://www.androidside.com/bbs/board.php?bo_table=B60&wr_id=292
함 참조해 보시고
싱글타스크로 설정된 액티비티는 바로 리턴되더군요...
by 안사 이쁜이 2013.06.03 15:33
축하합니다. ;)
nicehee님은 안사 이쁜이의 이쁨을 받아 4 포인트 지급되었습니다.
by 야몽크 2013.06.04 13:07
a 어플리케이션 프로젝트의 매니페스트랑 b 어플리케이션 프로젝트의 매니페스트 아무리 살펴봐두
launchMode 는 설정이 안되있네요...
테스트 결과
a에서 b를 호출할때 바로 onActivityResult()가 불러지더라구요
그래서 다시 setResult 해서 보내도 저 부분이 실행이 안되던데...
launchMode 이거 말고 다른 문제인듯한데...
찾을 길이 없네요...
그래서 다른 꼼수를 사용하긴했지만 intent에 담아서 값을 다시 돌려준게 아니라...
intent를 가지고 하고싶은데 방법이 없는건지...
intent로 값을 보내고 다시 setResult를 이용해서 intent로 다른 값들을 받고 싶은데...
같은 프로젝트가 아닌 다른 프로젝트를 호출하는건데...
-----------------------------------------------------------------------------------------------------------------
startActivityForResult() 했는데 바로 onActivityResult() 가 불려지는 경우가 있다..
범인은 불려질 액티비티가
android:launchMode="singleTask"
이렇게 되어있을때 바로 불려진다.
singleTask 제거하니 정상동작함..
이건 구글링에도 없는 내용임돠
다른 개발자의 소스코드를 다루려니 어려움이 있다능.... ㅠㅠㅠ
=================================
=================================
=================================
그냥 다른앱 실행하는 방법은 매우 간단하였다.
Intent intent = this.getPackageManager().getLaunchIntentForPackage(packageName);
intent.setAction(Intent.ACTION_MAIN);
startActivity(intent);
혹은
ComponentName compName = new ComponentName(패키지,패키지.액티비티명);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(compName);
해당 방법으로 실행하면 런처로 설정된 메인 엑티비티가 실행이 된다......
근데 실행 하고 싶은 액티비티는 다른 액티비티라면????
일단 실행하고 싶은 앱의 메니페스트에 해당 액티비티 안에 인텐트필터를 생성해준다
<action android:name="com.example.test.T" />
<category android:name="android.intent.category.DEFAULT"/>
액션의 이름을 정해주고
Intent intent=new Intent(액션의 이름);
startActivity(intent);
이렇게 넣었는데도 메인액티비티로만 이동되었다.
그래서 할 수 없이
Intent intent = this.getPackageManager().getLaunchIntentForPackage(packageName);
intent.setAction(Intent.ACTION_MAIN);
startActivity(intent);
위처럼 자바단을 수정하고
호출할 앱 메니페스트 호출할 액티비티단에 android:exported ="true"를 추가해주니 원하는 액티비티로 호출이 가능했다.
=================================
=================================
=================================
출처: http://www.androidpub.com/445351
앱에서 완전히 독립된 다른 앱을 실행 시키는게 가능한가요?
실행시킨 어플에서 버튼으로 지원하는 Content Provider를 통한 작동이 아닌 완전 별개의 어플을 구동시키려고 합니다.
간이 런쳐 비슷한 걸 의미하는데,
예를 들어 버튼1을 누르면 서울 버스 앱이 실행되고 버튼2를 누르면 다음지도 앱이 실행되는 형식으로요.
근데 이게 그냥 어플리케이션 레벨상에서도 가능한건지, 아니면 풀 소스 컴파일하면서 아예 런쳐 형식으로 붙여야 하는지 궁금합니다.
일단 Demo형식으로 어플단에서 처리해보려고 하는데 쉽지 않네요. PackageManager를 통해 설치된 어플들 목록을 받아오고 Intent로 실행 시켜보려 했더니 Exception이 일어나버리구요...
이쪽에 대한 자료는 검색해봐도 잘 나오질 않고..
해결책이어도 좋고, 방향 제시, 힌트라도 좋습니다. 도와주세요. 유용한 정보 조금씩이라도 알려주셨으면 합니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------
package lowmans.test.MyTest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MyTest extends Activity {
private Intent intent;
private final String packageName = "com.android.music";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
intent = this.getPackageManager().getLaunchIntentForPackage(packageName);
Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
MyTest.this.startActivity(intent);
}
});
}
}
참조 http://blog.naver.com/lowmans
2010.06.16 11:47:45
Ganymede
오오 완전 감사합니다 ㅠㅠㅠㅠㅠㅠㅠㅠ
2010.06.17 08:33:06
토끼씨
오우! 저도 완전감사드려요!!
2010.06.29 18:07:47
사랑니
저도 완전 감사.. 도움이 많이 됐습니다.
고유한 패키지 이름을 쓰는군요,,
=================================
=================================
=================================
<category android:name="android.intent.category.LAUNCHER" />
매니페스트에 이부분만 지우면 앱목록에 안나오는건 확인됐는데...
실행을 시켜야되는데 실행이 안되네요....
Activity 하나만 띄우면 되는건데 실행시킬 방법없을까요..?
------------------------------------------------------------------------------------------------------------
.getLaunchIntentForPackage("패키지명"); 이건 해당 패키지의 Luancher 카테고리 설정 되어있는 activity를 실행하는 Intent를 만들어 주는건데 Luancher 카테고리를 삭제하셨으니 실행이 안될거고요.
밑에 답변처럼 intent에 setClassName 사용해서 해당 패키지랑 클래스명 지정해서 사용하시면 됩니다. 클래스 명을 모르신다면... 그땐 좀 복잡하지만 PackageManager 이용해서 알아낼수는 있습니다.
=================================
=================================
=================================
출처: http://hansune.tistory.com/504
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); PackageManager pm = context.getPackageManager(); List<resolveinfo> installedApps = pm.queryIntentActivities(mainIntent, 0); for (ResolveInfo ai : installedApps) { Log.d("tag", ai.activityInfo.packageName); } |
실행시킬 패키지의 액티비를 알 경우,
ComponentName compName = new ComponentName("com.package","com.package.activity"); Intent intent = newIntent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setComponent(compName); startActivity(intent); |
실행시킬 패키지명만 알 경우,
Intent intent = context.getPackageManager().getLaunchIntentForPackage("ParkageName"); startActivity(intent); |
=================================
=================================
=================================
출처: http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=151625
안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang
A 앱에서 B 앱을 실행할 때 다음 코드를 사용하고 있습니다.
Intent intent = getPackageManager().getLaunchIntentForPackage("B패키지명");
startActivity(intent);
이 때, A 앱에서 B 앱으로 간단한 값을 전달하고 싶은데, 어떻게 보내고 어떻게 받을 수 있나요?
답변 부탁드립니다~
----------------------------------------------------------------------------------------------------------------------------------------
질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^
보내는곳
Intent sendIntent = getPackageManager().getLaunchIntentForPackage("com.example.app2");
sendIntent.putExtra("my_text", "This is my text to send.");
startActivity(sendIntent);
받는곳
text=(EditText)findViewById(R.id.edittext1);
Intent intent = getIntent();
if (intent.hasExtra("my_text")) {
String sharedText = intent.getStringExtra("my_text");
text.setText(sharedText);
}
실제로 해보니 잘되네요...
http://stackoverflow.com/questions/20060556/start-an-application-from-another-application-including-parameters
[@nicehee]
아~ 그냥 intent 로 되네요.
서로 다른 앱 간에는 다른 방법을 써야하는 줄 알았는데, 테스트해보니 잘 되네요.
정말 감사합니다 :)
=================================
=================================
=================================
출처: http://www.androidpub.com/1949016
현재 c2dm을 써서 개발을 하고 있는데요
c2dm 메세지를 받으면 액티비티 호출해서 동작하는 방식인데요,
근데 액티비티가 이미 돌아가고 있을 경우, c2dm을 받았을 때 어떻게 이 돌아가고 있는 액티비티에 값을 전달해 줄지를 모르겟네요;
실행중인 경우가 아니라면 인텐트로 줄텐데, 그냥 실험으로 인텐트에 넣어서 실행중일 때 또 실행했더니, 값전달이 안되네요~
내부적으로 액티비티가 실행중일 때 또 실행하면 안되도록 해놨는지...
이 액티비티 내부에도 broadcastreceiver는 있는데, c2dm받았을 때 액티비티 실행중인지 확인 후, 실행중이 아니라면 커스텀 액션을 주는 그런 방법이 있을까요??
이게 아니라도 어떻게 액션을 만들어줄지 잘 모르겟네요;;
고수님들 힌트좀 부탁드립니다^^
Entrepreneur, Embedded/Software Engineer
엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1949016&act=trackback&key=33a
2012.01.20 17:33:47
잇힝국대통령
자답입니다. 일단 intent에 setAction으로 액션을 정의해주고 이걸 브로드캐스트 리시버에서 액션 받아서 해결했는데요,
이미 액티비티가 돌아가는 경우에는 이게 액티비티가 중복 실행되는거 같은데 이건 어떻게 해결하나요~?
2012.01.20 17:52:41
잇힝국대통령
자답2 입니다.
액티비티 중복 실행이 안되도록 매니패스트 파일에
android:launchMode="singleTop"
속성을 추가해 주니 잘 되네요~
2012.01.21 06:55:15
잇힝국대통령
흠 일단 대략적으로 해결은 했는데, 아직 깔끔하게 동작하지 않는 코드가 있네요, 혹시 다른 해결책이 있을까요??
2012.01.22 22:21:18
굴다리
혹시 singleTop으로 해놓고
Activity.onNewIntent() 사용해보셨나요?
2012.01.23 13:47:48
잇힝국대통령
답변감사드립니다~
manifest 에서 singleTop으로 정의하면 무조건 onNewIntent()로 가는게 아니었나요?
2012.01.25 14:04:14
굴다리
해당 액티비티가 이미 생성되어 있을 경우에만 onNewIntent()로 전달됩니다.
생성 전이라면 onNewIntent()는 호출되지 않을 거에요.
2012.01.25 16:21:22
잇힝국대통령
네 해당 액티비티가 이미 생성된 상태라서요,,
2012.02.05 07:36:05
잇힝국대통령
제가 실력이 딸려서 잘못이해를 했었네요, onNewIntent()를 그냥 정의해주고 쓰면 되는거였군요
activity 호출 시의 intent flag에 Intent.FLAG_ACTIVITY_NEW_TASK를 주었다면, onPause() , onNewIntent() , onResume() 순서로 진행되는 것이었군요~
굴다리님께 다시한번 감사드립니다~
=================================
=================================
=================================
출처: https://www.fun25.co.kr/blog/android-execute-3rdparty-app/?category=003
[안드로이드] 외부 앱 실행
안드로이드 앱에서 다른 앱을 실행하는 방법입니다.
먼저 해당 앱이 설치되어 있는지 체크합니다. 아래 메소드는 com.example.testapp 이라는 패키지명으로 시작하는
앱이 설치되어 있는지 체크해서 있다면 true 를 리턴합니다.
public boolean getPackageList() {
boolean isExist = false;
PackageManager pkgMgr = getPackageManager();
List<ResolveInfo> mApps;
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mApps = pkgMgr.queryIntentActivities(mainIntent, 0);
try {
for (int i = 0; i < mApps.size(); i++) {
if(mApps.get(i).activityInfo.packageName.startsWith("com.example.testapp")){
isExist = true;
break;
}
}
}
catch (Exception e) {
isExist = false;
}
return isExist;
}
앱이 설치되어 있다면 앱을 실행합니다.
Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.testapp");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
앱이 설치되어 있지 않다면 앱스토어로 이동합니다.
String url = "market://details?id=" + "com.example.testapp";
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
=================================
=================================
=================================
출처: http://sumi3360.blogspot.kr/2014/03/android-url-scheme.html
[android] url scheme 사용하기 (웹에서 앱 호출 및 앱에서 앱 호출)
[호출될 앱]
다른 앱이나 웹에서 호출될 앱의 AndroidManifest.xml 파일을 열어 원하는 activity에 아래와 같이 빨간 부분을 추가 한다.
<activity android:name=".testUrlScheme" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <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="호스트이름" android:scheme="스키마이름" /> </intent-filter> </activity> |
[testUrlScheme.java]
if(getIntent()!=null){ Uri uri = getIntent().getData(); if(uri != null) { String param1 = uri.getQueryParameter("param1"); String param2 = uri.getQueryParameter("param2"); } } |
[앱에서 호출]
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setdata(Uri.parse("스키마://호스트?param1=test¶m2=test2")); startActivity(intent); |
[웹에서 호출]
<a href="스키마://호스트?param1=test¶m2=test2"> urlscheme </a>
[앱이 다시실행 될 때 호출]
@Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); if(intent!=null){ Uri uri = intent.getData(); } } |
=================================
=================================
=================================
intentURI에서 S.browser_fallback_url옵션 파라메타를 지원하고 있으며, 옵션 파라메타를 지원하지 않는 Chrome 저버전에 대한 우회방안을 설명한다.
APP 실행 또는 특정 url로 페이지 이동
기본 아이디어
모바일 웹에서 어플리케이션이 실행되면 그 이후 브라우저의 실행컨텍스트는 프리징된다.
따라서 어플리케이션 실행 이후 다시 웹으로 돌아왔을때는
실행 전과 실행 이후의 스크립트 수행 시간차이가 적어도 2초이상 발생할 수 밖에 없다.
- app 실행 후 종료 -> 모바일 브라우저로 돌아옴 -> 시간차 2초이상 -> fallback url 이동 X
- app 미설치 -> 앱 실행하지 않으므로 시간차 2초 미만 -> fallback url 이동
구현 이슈
모바일 크롬 및 기타 브라우저의 각 종류 및 버전별로 구현 방식에 약간의 차이가 있다.
특히 크롬에서 버전별 구현 방식에 차이가 있는데,
보통 안드로이드 크롬은 사용자들이 대부분 최신 버전을 사용해서 문제가 없다.
그러나 제조사 브라우저는 특정 크롬 버전을 커스터마이징하여 구현하고 업데이트가 거의 없어서 문제가 된다.
Chromium ~25, Firefox ~40.
Iframe의 src속성을 이용
var scheme = 'androidScheme://host?parameter=10',
fallbackURL = 'http://naver.com';
//...
var iframe = document.createElement('IFRAME'),
start;
iframe.style.display = 'none';
iframe.src = scheme;
document.body.appendChild(iframe);
start = +new Date();
setTimeout(function() {
var now = +new Date();
if (now - start < 2000) {
location.href = fallbackURL;
}
}, 500);
(제조사(삼성, LG, ...)브라우저 포함)
Chromium 25~42(?)https://developer.chrome.com/multidevice/android/intents
Intent URI 스펙을 통한 지원 시작.
Intent URI가 잘못되었을 때 페이지가 깨지는 에러 발생
ERR_UNKNOWN_URL_SCHEME
S.browser_fallback_url 옵션파라메타 지원 X
fallback url 지원을 위해서는 별도 우회방법이 필요하게 됨.
- iframe.src에 scheme 값이 없는 intent uri를 대입. (intent://open#Intent;scheme=;end)
- fallback url 스펙을 지원하지 않으면 iframe 페이지가 에러발생으로 깨지게됨.
- iframe에서 load이벤트가 발생하므로 에러페이지 redirect를 감지할 수 있음.
- 또는 다음 프레임에서 iframe.contentDocument에 접근하면 CORS exception이 발생함으로 감지 가능
- fallback url 스펙을 지원하지 않는다는것을 확인하면, 실제 intentURI로 popup을 열도록 함.
- package 파라메타를 제외시켜야함. (intentURI.replace(/package=.*?;/, ''));
- 사용자 팝업 수락 필요
- 앱이 설치된경우 popup이 close된다.
설치되지 않은경우 popup이 에러페이지로 이동한다. - 앱이 설치되지 않은 경우에는 unload이벤트에서 popup.opener가 살아있으므로,
opener의 location을 fallback url로 바꿔준다. - 앱이 설치된 경우에는 popup이 닫히고 popup.opener가 null이 된다.
iframe을 먼저 body에 append하고 그 이후 src를 수정하면 크롬브라우저 자체적으로 앱 수행을 차단하므로, 반드시 body에 append하기 전 src를 수정해야 한다.
Check (S.browser_fallback_url 지원여부를 먼저 확인)
var SCHEME_FOR_TEST = 'intent://open#Intent;scheme=;end';
//.... "S.browser_fallback_url"이 지원되는지 확인한다.
var iframe = document.createElement('IFRAME'),
self = this;
iframe.style.display = 'none';
iframe.addEventListener('load', function onload() {
if (iframe.src === SCHEME_FOR_TEST) {
self.isNotSupportedFallbackURL = true;
} else {
self.isPrepared = true;
iframe.removeEventListener('load', onload);
document.body.removeChild(iframe);
}
});
iframe.src = SCHEME_FOR_TEST;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.src = '';
}, 100);
Load (S.browser_fallback_url 지원되지 않은 경우 우회 방식)
var popup,
self = this;
if (!this.isPrepared) { // check가 다 끝나지 않았으므로 load를 연기시킴
setTimeout(this.load.bind(this), 10);
return;
}
// fallback url을 지원하지 않는경우 팝업을 통한 우회 처리
if (this.isNotSupportedFallbackURL) {
popup = window.open('');
if (popup) {
popup.addEventListener('unload', function onUnload() {
setTimeout(function () {
if (popup.opener) {
popup.opener.location.href = self.fallbackURL;
}
}, 10);
popup.close();
popup.removeEventListener('unload', onUnload);
});
popup.location.href = this.intentURI.replace(/package=.*?;/, '');
} else {
alert('팝업 허용해주세요');
}
}
Chromium 42(?)~ 버전
https://developer.chrome.com/multidevice/android/intents
S.browser_fallback_url 지원 O
별다른 구현 없이 현제 페이지의 주소를 Intent URI로 변경하면 된다.
주의: S.browser_fallback_url은 절대경로로 작성해주어야 한다.
테스트에서 유니코드 인코딩 여부는 문제 없었지만, Intent URI 소개 페이지에서는 fallback_url을 인코딩하여 적용하였음.
var intentURI = [
'intent://open#Intent',
'scheme=payco',
'package=com.nhnent.payapp',
'S.browser_fallback_url=http%3A%2F%2Fwww.payco.com',
'end'
].join(';');
window.location.href = intentURI;
안드로이드 지원 프로토타이핑 전체 코드
dependency: code-snippet
var SCHEME_FOR_TEST = 'intent://open#Intent;scheme=;end';
var ua = navigator.userAgent,
isAndroid = /android/i.test(ua),
isIOS = /iphone|ipad|ipod/i.test(ua),
isSupportingIntent = (
tui.util.browser.chrome &&
+(tui.util.browser.version) > 24 &&
!(/firefox|opr|fb_iab/i.test(ua))
);
var loader = tui.util.defineModule('appLoader', {
isPrepared: false,
isNotSupportedFallbackURL: false,
initialize: function() {
if (isAndroid) {
if (isSupportingIntent) {
this._checkSupportingFallbackURL();
this.load = this._launchAppViaIntent;
} else {
this.load = this._launchAppViaIframe;
}
} else if (isIOS) {
//...
} else {
alert('run in mobile');
}
},
setParams: function(params) {
this.appURI = params.appURI;
this.fallbackURL = params.fallbackURL;
},
_createHiddenIframe: function() {
var iframe = document.createElement('IFRAME');
iframe.style.display = 'none';
return iframe;
},
_launchAppViaIframe: function() {
var iframe = this._createHiddenIframe(),
start = +new Date(),
self = this;
iframe.src = self.appURI;
iframe.addEventListener('load', function onload() {
iframe.removeEventListener('load', onload);
document.body.removeChild(iframe);
});
document.body.appendChild(iframe);
setTimeout(function() {
var now = +new Date();
if (now - start < 2000) {
top.location.href = self.fallbackURL;
}
}, 500);
},
_checkSupportingFallbackURL: function() {
var iframe = this._createHiddenIframe(),
self = this;
iframe.addEventListener('load', function onload() {
if (iframe.src === SCHEME_FOR_TEST) {
self.isNotSupportedFallbackURL = true;
} else {
iframe.removeEventListener('load', onload);
document.body.removeChild(iframe);
self.isPrepared = true;
}
});
iframe.src = SCHEME_FOR_TEST;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.src = '';
}, 100);
},
_launchAppViaIntent: function() {
var popup,
self = this;
if (!this.isPrepared) {
setTimeout(this.load.bind(this), 100);
return;
}
if (!this.isNotSupportedFallbackURL) {
window.location.href = self.appURI;
return;
}
popup = window.open('');
if (popup) {
popup.addEventListener('unload', function onUnload() {
setTimeout(function () {
if (popup.opener) {
popup.opener.location.href = self.fallbackURL;
}
}, 10);
popup.close();
popup.removeEventListener('unload', onUnload);
});
popup.location.href = this.appURI.replace(/package=.*?;/, '');
} else {
alert('팝업 허용해주세요');
}
},
load: function() {
alert('load() is not implemented!');
}
});
서비스코드
loader.setParams({
appURI: [
'intent://open#Intent',
'scheme=xxpayco',
'package=com.nhnent.payapp',
'S.browser_fallback_url=http%3A%2F%2Fwww.payco.com',
'end'
].join(';'),
fallbackURL: 'http://www.payco.com'
});
loader.load();
=================================
=================================
=================================
Android] URL scheme – 주소창에서 앱실행, 앱간의 값 전달
Posted on 1월 15, 2013 작성자: ch7895
뭐할때 쓰는 녀석이냐면
ㄱ. A앱에서 B앱을 호출하고 싶을때,
ㄴ. 주소창에서 A앱을 실행시키고 싶을때,
ㄷ. 1,2번을 하면서 parameter로 값을 전달하고 싶을때.
방법은 간단하다.
우선 andoridmanifest.xml을 열어서 해당 activity에 intent 필터를 추가 시키고,
아래처럼 내용으로 채워준다.
<activity android:name=".ListViewActivity" android:label="@string/app_name">
<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="test2" android:scheme="bill" />
</intent-filter>
</activity>
그리고 호출할때는
bill://test2 (스킴://호스트)
형식으로 하면 된다.
해석하면 bill://teset2를 주소창에 입력하면 ListActivity가 실행.
사실 이건 앱을 실행시킨다기보다는
해당 activity를 실행시키는 것이다.
intent filter의 action하고 category를 왜저렇게 했는지 궁금하면
http://developer.android.com/training/basics/intents/filters.html
여기보면 나와있다.
일단 이렇게 만들고 안드로이드 브라우저에서 bill://test2를 입력하면
본인의 목적과는 다르게 브라우저에서 구글링을 해버린다.
그래서 내가 만든게 잘못된나 싶어서 html페이지 하나 띄우고
거기다가 <a href=”bill://test2″> 하니까
그제서야 제대로 작동한다.
값얻어오는법
manifest에서 괜히 intent에 data 태그를 쓰는게 아니다.
if(getIntent()!=null){
Uri uri = getIntent().getData();
if(uri != null){
Log.d("MainAtv-receivedata", uri.toString());
Log.d("MainAtv-receivedata", uri.getQueryParameter("confirm")); } }
앱간 데이터 전달
네이티브 앱간에도 데이터 전달하는법.
받는부분이야 위에 적었던 부분하고 동일하고
보낼적에는
manifest에 설정한것 처럼 intent 하나 맹그러서
uri 담아가지고 보내믄 된다.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse("bill2://test2?r=received"));
startActivity(intent);
=================================
=================================
=================================
출처: http://al02000.tistory.com/32
public void getApps(final String panName){
manager = act.getPackageManager();
try{
manager.getApplicationInfo(panName, PackageManager.GET_META_DATA);
Intent intent = act.getPackageManager().getLaunchIntentForPackage(panName);
startActivity(intent);
Log.e("TEST"," 앱 있음");
}catch(NameNotFoundException e){
Log.e("TEST", "앱 없음");
Toast.makeText(act, "앱이 설치되지 않았습니다.\n
설치화면으로 이동합니다.", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri u = Uri.parse("https://play.google.com/store/apps/details?id="+panName);
intent.setData(u);
startActivity(intent);
}
}
=================================
=================================
=================================
'스마트기기개발관련 > 안드로이드 개발' 카테고리의 다른 글
[안드로이드] android.webkit.CookieManager 를 이용한 웹뷰와의 세션 공유 (0) | 2020.09.20 |
---|---|
안드로이드 개발 인트로 넣기, 런쳐 이미지, 초기화면 관련 (1) | 2020.09.20 |
안드로이드 android TextView 밑줄 긋기, html 의 href 처럼 링크버튼 처럼 사용하기 관련 (0) | 2020.09.20 |
안드로이드 android 상태에 따라 버튼 색깔바꾸기 다른 컨트롤도 응용 가능 관련 (0) | 2020.09.20 |
[android] Android Studio를 사용하며 자주 겪는 Gradle 관련 오류 해결 방법 (0) | 2020.09.20 |
댓글 영역