꿈꾸는 시스템 디자이너

엑티비티(Activity)와 서비스(Service) 예제 본문

Development/Android

엑티비티(Activity)와 서비스(Service) 예제

독행소년 2013. 5. 15. 17:55

메인 엑티비티에서 새로운 엑티비티나 서비스를 실행 시키는 방법과, 엑티비티 실행 결과를 확인하는 방법은 다음과 같다.


<MainActivity.java>

package com.example.startactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	Intent serviceIntent;
	private int requestCode = 10;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void onClick(View v) {
		switch (v.getId()) {

		// 엑시티비 시작 버튼이 눌린 경우
		case R.id.mainBtStartActivity:
			// 새로운 인텐트 생성
			Intent intent = new Intent(this.getBaseContext(),LocalActivity.class);
			// 새로운 엑티비티 실행
			this.startActivityForResult(intent, requestCode);
			break;

		// 서비스 시작 버튼이 눌린 경우
		case R.id.mainBtStartService:
			// 새로운 인텐트 생성
			serviceIntent = new Intent(this.getBaseContext(),LocalService.class);
			// 새로운 서비스 실행
			this.startService(serviceIntent);
			break;

		// 서비스 종료 버튼이 눌린 경우
		case R.id.mainBtStopService:
			// 서비스 종료
			this.stopService(serviceIntent);
			break;

		}
	}

	// 실행시킨 엑티비티의 수행 결과를 확인
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		Toast.makeText(
				this.getBaseContext(),
				"ResutestCode: " + String.valueOf(requestCode)
						+ "\nResultCode: " + String.valueOf(resultCode), 0)
				.show();
	}

}


  • 엑티비티 실행

라인 25부터 27까지의 내용을 보면 호출할 클랙스명으로 인텐트를 만들어 startActivityForResult()를 호출함으로써 새로운 엑티비티를 실행 시킬 수 있다. 실행시킨 엑티비티로부터 리턴값을 받을 필요가 없을때는 startActivity()로 호출하면 된다.

startActivityForResult()호출시 '10'을 RequestCode로 전달하였는데, 이는 라인 48부터 실행했던 새 엑티비티가 종료되면서 결과값을 받을 때 호출되는 onActivityResult()에서 사용하기 위함이다. 메인 엑티비티에서 두개 이상의 새로운 엑티비티를 호출하고 결과값을 받길 원한다면.. 서로 다른 requestCode값으로 각각의 엑티비티를 실행시켜서 구분을 해야한다.


  • 서비스 실행
라인 33부터 35까이의 내용을 보면 비슷한 방식으로 서비스를 실행할 수 있음을 알 수 있다. 라인 41은 실행했던 서비스를 종료하는 코드이다.


<LocalActivity.class>

package com.example.startactivity;

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 LocalActivity extends Activity {

	// 취소버튼으로 돌아갈 때 전달할 result
	private int basicResult = 99;
	// Return 버튼으로 돌아갈 때 전달할 result
	private int specialResult = 100;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_local);
		
		// 기본 ResultCode
		this.setResult(basicResult);
		
		// Stop Service 버튼이 눌린 경우
		Button btReturnToMainActivity = (Button)findViewById(R.id.laBtReturnToMain);
		btReturnToMainActivity.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				
				// 반환할 인텐트 객체 생성
				Intent resultIntent = new Intent();
				// 별도의 ResultCode 값 저장
				setResult(specialResult, resultIntent);
				finish();				
			}
		});
	}
}

새롭게 시작한 엑티비티가 종료되면 메인 엑티비티로 전환되는데, 엑티비티를 종료시키는 방법에 따라 다른 resultCode를 가지도록 구성하였다. 이 resultCode는 메인엑티비티의 onActivityResult()메소드를 통해 화면에 출력된다. 라인 22에서는 기본 resultCode로 99를 설정하여 취소버튼으로 엑티비가 종료될 때는 99를 전달하고, 리턴버튼(btReturnToMainActivity)을 누르면 100이라는 값을 전달한다.


<LocalService.java>

package com.example.startactivity;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class LocalService extends Service {

	private int callingCount;

	// 서비스 생성시 1번만 실행
	public void onCreate() {
		super.onCreate();

		Toast.makeText(getBaseContext(), "Service is Created", 0).show();
	}

	// 서비스가 호출될때마다 매번 실행(onResume()과 비슷)
	public int onStartCommand(Intent intent, int flags, int startId) {

		int i = super.onStartCommand(intent, flags, startId);
		Toast.makeText(getBaseContext(), "Service is Started", 0).show();
		
		Toast.makeText(getBaseContext(),
				"Called Count is :" + String.valueOf(callingCount), 0).show();
		callingCount++;
		
		return i;
	}

	// 서비스가 종료될때 실행
	public void onDestroy() {
		super.onDestroy();
		Toast.makeText(getBaseContext(), "Service is Destroied", 0).show();
	}

	public IBinder onBind(Intent intent) {
		return null;
	}
}

새롭게 실행된 서비스의 내용은 위와 같다.


<AndroidManifest.xml>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.startactivity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="17" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
 
        <!-- 메인 엑티비티 -->
        <activity
            android:name="com.example.startactivity.MainActivity"
            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="com.example.startactivity.LocalActivity"
            android:label="@string/title_activity_local" >
        </activity>
        <!--  로컬 서비스 -->
        <service android:name=".LocalService"/>
        
    </application>
</manifest>

메니패스트 파일은 우와 같이 구성한다.

Comments