|
new Intent( Context packageContext, Class cls ) |
// 인텐트 개체 생성 // senderActivity.this : 현재 컴포넌트의 Context 개체( getApplicationContext() 메서드 ) // reciverActivity.class : 호출할 컴포넌트의 클래스 Intent intent = new Intent( sender );
// 티비티 호출 startActivity(intent); |
실행시킬 액티비티를 직접 개발하고 인텐트를 작성해 호출(실행)할 액티비티 클래스를 직접 지정하는 방법을 사용한 것이다. 위의 예제로 생성한 인텐트는 senderActivity 액티비티가 reciverActivity 액티비티를 호출하여 직접 실행 하겠다는 의미이다.
암시적 인텐트
호출 대상 컴포넌트가 정확히 정해진 것이 아니라, 호출 대상 컴포넌트의 특성만 나열되어 있는 인텐트.
New Intent( String action, Uri uri ) |
// 인텐트 개체 생성 Uri uri = Uri.parse( “tel:0101234567” ); Intent intent = new Intent( Intent.ACTION_DIAL, uri );
//액티비티 호출 startActivity(intent); |
응용 프로그램에 전화를 걸 수 있도록 하고자 한다면, 새로운 다이얼러 액티비티를 구현하기 보다는 이미 만들어져 있는 다이얼러 액티비티를 실행시키고 요청하는 것이 좋을 것이다.
이럴 때 Uri로 표현된 전화번호에 대해 수행되는 액션을 요청하는 암시적 인텐트를 사용 할 수 있다. 안드로이드는 이 인텐트를 분석해 전화번호에 대한 전화 걸기 액션을 제공하는 액티비티(Intent.ACTION_DIAL)를 시작시킨다.
다음은 액티비티간에 데이터를 주고 받는 예제이다.
/res/layout/main.xml |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="이름: "/> <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="-정보 없음-"/> </LinearLayout>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="전화번호: "/> <TextView android:id="@+id/TextView02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="-정보 없음-"/> </LinearLayout>
<Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="정보 입력"/>
</LinearLayout>
|
메인 레이아웃을 위와 같이 꾸민다.
HelloTestActivity.java |
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView;
public class HelloTestActivity extends Activity {
private final int REQUEST_CODE = 1;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
final Button button = (Button) findViewById(R.id.Button01);
button.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) { // 인텐트 객체를 생성한다. Intent intent = new Intent(HelloTestActivity.this, NewActivity.class);
// 결과값을 받기 위한 Sub Activity 호출 startActivityForResult(intent, REQUEST_CODE); } }); }
// onActivityResult()는 결과를 받는 이벤트 핸들러로, // startActivityForResult()로 호출한 액티비티가 종료되었을 때 호출된다. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);
TextView text_name = (TextView) findViewById(R.id.TextView01); TextView text_digit = (TextView) findViewById(R.id.TextView02);
if(requestCode == REQUEST_CODE) // Sub Activity 호출시 사용된 요청 코드 { if(resultCode == RESULT_OK) // Sub Activity의 결과 코드 { // 받아온 이름과 전화번호를 액티비티에 표시한다. text_name.setText(data.getStringExtra("data_name")); text_digit.setText(data.getStringExtra("data_digit")); } } } } |
액티비티를 위와 같이 구현한다. 단순히 액티비티를 호출 할 때에는 startActivity(Intent) 메서드를 사용했었지만, 액티비티를 호출한 후 결과 값을 받기 위해서는 startActivityForResult( Intent intent, int requestCode ) 메서드를 사용해야 한다. 인자 중에 requestCode는 이 액티비티를 여러 액티비티가 호출하는 경우, 어떤 액티비티가 호출 했는지를 알기 위한 식별 값이다. onActivityResult() 메서드는 결과를 받는 이벤트 핸들러로, startActivityForResult() 로 호출한 액티비티가 종료되었을 때 호출된다.
/res/layout/layout.xml |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="이름과 전화번호를 입력하세요."/>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="이름: "/> <EditText android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="홍길동"/> </LinearLayout>
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="전화번호: "/> <EditText android:id="@+id/EditText02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="010-123-4567"/> </LinearLayout>
<Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="입력 완료"/>
</LinearLayout> |
위는 사용자로부터 직접 입력을 받을 수 있도록 하는 액티비티의 레이아웃을 꾸민 것이다.
NewActivity.java |
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText;
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout);
final Button button = (Button) findViewById(R.id.Button01);
button.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) {
EditText name_input = (EditText) findViewById(R.id.EditText01); EditText digit_input = (EditText) findViewById(R.id.EditText02);
// 이 액티비티를 시작하게 한 인텐트를 호출한다. Intent intent = getIntent(); // 인텐트에 추가 정보를 넣은 후, 다시 인텐트를 반환한다. intent.putExtra("data_name", name_input.getText().toString()); intent.putExtra("data_digit", digit_input.getText().toString()); setResult(RESULT_OK, intent);
finish(); // 액티비티 종료 } });
} } |
위는 사용자로부터 입력을 받도록 하는 액티비티이다.
getIntent() 메서드는 현재 자신을 호출했던 인텐트를 불러온다.
putExtra( String name, _value) 메서드는 데이터들을 키/값 쌍으로 짝을 이루어 인텐트 개체에 저장한다.
setResult( RESULT_OK, intent ) 메서드는 호출당한 액티비티가 정상적으로 끝났음을 알리기 위해 사용한다.
AndroidManifest.xml |
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hardrock.hellotest" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloTestActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<activity android:name=".NewActivity" />
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest> |
하나의 응용에 2개의 액티비티를 사용하고 있는데 위와 같이 매니페스트에 각각의 액티비티를 명시해 주어야 한다.
결과는 위와 같다. 텍스트를 출력만 하는 액티비티가 메인이고 정보입력 버튼을 눌러 입력을 담당하는 액티비티가 새로 실행된다. 이 액티비티에 값을 입력하고 입력 완료하면 메인 액티비티에 데이터가 전달돼 출력되는 모습을 볼 수 있다.