ANDROID Service (2)




소멸된 서비스 재시작 옵션 제어

onStartCommand() 메서드는 반드시 정수를 반환해야 합니다. 정수는 안드로이드 시스템이 서비스를 중단시킨 경우 시스템이 해당 서비스를 어떻게 것인가를 정의하는 값입니다.

반환 가능한 값은 반드시 다음 상수 하나여야 합니다.

 

START_NOT_STICKY

  • 전송 대기중인 Intent 있는 경우가 아니라면 서비스 중단 다시 시작시키지 말라고 시스템에게 전달합니다.

  • 이는 서비스가 불필요하게 실행되는 일을 피할 있게 해주는 가증 안전한 옵션입니다.

  • 애플리케이션이 완료되지 않은 모든 작업을 단순히 재시작 있을 좋습니다.


START_STICKY

  • 시스템이 onStartCommand() 메서드 반환 후에 서비스를 중단시키는 경우 서비스 소멸 최대한 빠르게 서비스가 다시 시작되어야 한다는 것을 의미 합니다.
  • 전송 대기중인 Intent 없다면 null Intent 값을 인자로 받는 onStartCommnad() 콜백 메서드가 호출됩니다.
  • 전송 대기중인 Intent 있다면 해당 Intent 전달 됩니다
  • 무기한으로 실행 중이며 작업을 기다리고 있는 미디어 플레이어 같은 애플리케이션에 적합합니다.

 

START_REDELIVER_INTENT

  • 만약 onStartCommand() 메서드의 실행 서비스를 중단시키는 경우 마지막으로 전달된 Intent onStartCommand() 호출하여 서비스가 다시 시작되어야 한다는 것을 의미 합니다.
  • 모든 전송 대기중이던 Intent 순차적으로 전달 됩니다.
  • 파일 다운로드와 같이 즉시 재개되어야 하는 작업을 수행중인 서비스에 적합합니다. 

 

■ 매니페스트 파일에 서비스 선언

MyService.java 로 정의한 서비스가 있을 경우 <application> 항목에 추가 하면 됩니다. 

아래 샘플에서는 <application> 항목 안에 <activity> 속성 아래에 추가 했습니다. 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tutorial.james.androidtutorialtest">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:name=".MyService" />

</application>

</manifest>

service 는 기복적으로 public 으로 선언 됩니다. 즉, 서비스가 애플리케이션 패키지 외부의 컴포넌트들이 액세스 할 수 있다는 의미 입니다. 서비스를 private 로 만들려면 android:exported 속서을 false로 추가 하시면 됩니다. 

<service android:name=".JamesService" 
android:exported="false"/>



서비스 시작

Activity 다른 구성 요소에서 서비스슬 시작하려면 Intent(시작할 서비스) startService() 함수에 전달 하면 됩니다.

그러면 Android 시스템이 서비스의 onStartCommand() 호출하고 여기에 Intent 전달합니다. (절대로 onStartCommand() 직접 호출하면 안됩니다.)

MyService.java 정의된 서비스가 있다고 가정 하고 이를 Activity 시작하려면 startService() 인텐트를 전달하면 됩니다

Intent intent = new Intent(this, MyService.class);
startService(intent);


■ 서비스 중단

시작된 서비스는 자신만의 Service Lifecycle(생명주기)를 직접 관리해야 합니다. 즉, 안드로이드 시스템이 메모리가 부족하여 서비스를 중단 시키거나는 경우가 아니라면 직접 stopSelf() 를 호출하거나 다른 구성 요소가 stopSevice() 를 호출하여 이를 중단 시킬수 있습니다. 

stopService(intent);


■ 시스템 구동 시 서비스 시작 시키기

안드로이드 시스템이 최초 부팅되는 시점에 자동으로 서비스가 시작되도록 하는 방법입니다. 

이는 BroadcastReceiver 를 이용하여 처리 가능합니다. 


방법은 다음 링크를 따라 이전에 작성한 포스팅 참조 하세요 :)

☞ 포스팅 보러 가기 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

Android Service


Android Service 사용자가 응용프로그램을 종료 하거나 다른 응용프로그램으로 전환을 하더라도 백그라운드(화면으로 보이지 않는 뒷단)에서 장시간 계속해서 동작하도록 제공하는 기능입니다. 또한 구성 요소를 서비스에 bind하여 서비스와 상호작용할 있으며 다른 프로세스간의 통신을 수행 수도 있습니다.


미디어플레이어, MP3 플레이어, 알람앱 등이 Android Service 이용한 App입니다.


Service Thread 아니며, 아래와 같이  가지 형식을 제공합니다.

 

Started Service (시작된 서비스)

Activity 또는 BroadCastReceiver 같은 다른 애플리케이션 요소들이 Context.startService() 함수를 호출 함으로써 시작되게 됩니다. Service 한번 시작되면 Service 중단되거나 리소스 해제를 위해 안드로이드 런타임 시스템에 의해 해제 되는 시점까지 백그라운드에서 무한정 실행됩니다. Service 자신을 실행시킨 애플리케이션이(우리가 일반적으로 이야기하는 App) 이상 포그라운드(사용자 입장에서 봤을 실행 - 화면을 있는 상태) 있지 않아도 백그라운드에서 실행되고 있습니다.

 

Service Context.stopService() 또는 stopSelf() 함수가 호출 되기 전까지 지속적으로 동작하게 됩니다.

Context.startService() 중복 호출의 결과로 여러 차례 호출 결과를 받게 되더라도 중복 Context.startService() 호출이 중첩되지 않아 Context.stopService() 또는 stopSelf() 한번이라도 호출 되면 Service 중단되게 됩니다.

 

Service 안드로이드 시스템에 의해 높은 우선순위가 부여되며 리소스 해제를 위해 종료될 때도 가장 마지막에 고려 대상이 됩니다.

 

Bound Service (바인드된 서비스)

애플리케이션의 구성 요소가 자신에게 바인드될 있도록 허용하는 서비스이며, bindService() 호출하여 오래 지속되는 연결을 생성합니다.

 

Started Service 유사하지만 Started Service 결과를 반환하지 않으며 자신을 호출한 컴포넌트와의 상호작용도 허용하지 않는 반면 Bound Service 자신을 호출한 컴포넌트와의 상호작용을 허용하고 결과를 받을 있습니다. , Activity Application 다른 구성요소에서 Service 상호작용하기를 원하는 경우 바인드된 서비스(Bound Service) 생성해야 합니다. Application 기능 가지를 프로세스 통신 (IPC : Interprocess Communication) 통해 다른 Application 노출하고자 하는 경우에도 좋은 선택입니다

 

클라이언트가 시작되어 bindService() 함수를 호출하면 Bound Service 바인딩 됩니다.

 

Bound Service onBind() 콜백 함수를 구현하여야 합니다. Service 최초 생성될 때와 이후에 다른 클라이언트들이 Service 바인딩 모두  onBind()  함수가 자동 호출됩니다. onBind() 함수의 목적은 바인딩한 클라이언트들에게 IBinder 타입의 객체를 반환하는 것입니다.

다시 정리 하자면 클라이언트와 Service 사이에서 쓰이는 인터페이스는 반드시 IBinder 타입의 객체의 구현이어야 하며 이를 서비스가 onBind() 콜백 메서드에서 반환해야 합니다. 클라이언트가 IBinder 수신하면 해당 인터페이스를 통해 서비스와 상호작용을 시작할 있습니다.

 

클라이언트는 바인드된 서비스를 이상 필요로 하지 않을 unbindService() 호출해야 합니다. 마지막 바인딩 클라이언트가 Service 에서 바인딩을 해제하면 안드로이드 런타임 시스템이 해당 Service 종료 시킵니다.

 

 

Service Lifecycle (서비스 생명주기)

Service 생명 주기는 Activity 생명 주기보다 훨씬 간단하지만 Service 생성하고 해제하는 방법에 특히 주의 해야 합니다. Service 사용자가 모르는 채로 백그라운드에서 실행될 있기 때문입니다.

 

Service Lifecycle  아래 이미지와 같이 서로 다른 가지 경로를 따를 있습니다. 왼쪽이 Serviced Service 이며 오른쪽이 Bound Service 입니다. 참고하세요.




1. Started Service (시작된 서비스)

다른 구성 요소가 startService() 호출하면 Service 생성됩니다. Service 무한정 실행 있으며 stopSelf() 호출하여 자체적으로 중단해야 합니다. 다른 구성 요소도 Context.stopService() 호출하여 Service 중단할 있습니다. 서비스가 중단되면 안드로이드 런타임 시스템이 이를 소멸 시킵니다.


2. Bound Service (바인드된 서비스)

클라이언트가 bindService() 호출하면 서비스가 생성됩니다. 클라이언트가 IBinder 인터페이스를 통해 서비스와 통신을 주고 받을 있으며 클라이언트가 연결을 종료하려면 unbindService() 호출하면 됩니다. 여러 클라이언트가 같은 Service 바인드될 있으며, 모두가 바인딩을 해제하면 시스템이 해당 서비스를 소멸시킵니다. (Started Service 달리 Service 스스로를 중단시키지 않아도 됩니다)

 

 

내용이 어렵게 느껴질 있겠는데요 ^^;

마지막 Service Lifecycle 부분이 Service 대한 요약이라 보시면 무방합니다.

 

 

 

Referenced By -

https://developer.android.com/reference/android/app/Service.html

https://www.tutorialspoint.com/android/android_services.htm

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요, James 입니다.

 

업무에 시달리다 보니 정말 오랜만에 포스팅을 하게 됩니다.

 

오늘은 Android Life-cycle 관련한 내용을 정리 하고자 합니다.

생명주기라는 의미로 Android App 구동되는 시점부터 종료 되는 시점까지 어떤 함수들이 호출 되고 어떤 동작들을 하고 있는지 확인 해보도록 하겠습니다.

 

Activity Life Cycle (안드로이드 Activity 생명주기)

 

이미 C, C++ 또는 Java 프로그래밍을 해보신 분들이라면 아시겠지만 main() 함수를 통해 프로그램이 구동 됩니다.

이와 비슷하게 Android 에서도 Activity 시작은 onCreate() 라는 callback 함수를 호출하면서 시작하게 됩니다


1. Activity Life Cycle Diagram

이미지 출처 : https://developer.android.com/guide/components/activities/activity-lifecycle.html >


그래프는 안드로이드 Activity 라이프 사이클을 보여주고 있습니다.


여기에 보여주고 있는 모든 함수들은  callback 함수로 Activity 생성되어 종료되는 시점까지 자동으로 호출 되므로 사용자가 모두 구현할 필요는 없지만 각각의 함수들을 이해하고 사용할 알아야 합니다



2. Callback 함수  


No

Callback  함수

Description

1

onCreate()

Activity 생성되면 가장먼저 호출 되는 callback 함수

2

onStart()

Activity 사용자에게 보여지기 직전에 호출 되는 callback 함수

3

onResume()

사용자가 응용프로그램과 상호 작용을 있는 상태에 호출되는 함수

- 사용자가 응용프로그램을 사용할 있는 상태를 의미

4

onPause()

Activity 중지된 상태로 사용자로 부터 어떠한 입력도 받을 없고 어떤

코드도 실행 없는 상태

- 다른 Activity 실행되어 Activity Stack 최상단으로 올라가는 경우 호출

5

onStop()

Activity 이상 보여지지 않는 경우 호출

6

onRestart()

Activity onStop() 호출 이후에 재시작 되는 경우 호출 되는 함수

7

onDestroy()

시스템이 Activity 종료하기 직전에 호출 되는 callback 함수


위 표는 Activity Life Cycle 에서 호출되는 Callback 함수들을 나열한 것입니다. 

언제 어떤 상황에서 호출 되는지 잘 알아 두셔야 앱을 개발하실때 편하게 사용 하실 수 있습니다. 


우리가 일반적으로 가장 많이 구현하는 함수는 onCreate() 가 되며 onResume() 과 onPause() 도 앱의 성격에 따라 사용빈도수가 높은 편입니다. 

이 callback 함수들의 사용 방법등은 차후에 다루도록 하겠습니다. 



3. Sample Code

package com.tutorial.james.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

private static String TAG = MainActivity.class.getSimpleName();

/** Activity 가 처음 생성될때 호출 되는 함수 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "The onCreate() called");
}

/** Activity 가 보여지기 직전에 호출 되는 함수 */
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "The onStart() called");
}

/** Activity 가 보여지고 input 을 받을 수 있는 상태 */
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "The onResume() called");
}

/** 다른 Activity 가 호출되는 시점에 호출 되는 함수 */
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "The onPause() called");
}

/** Activity 가 더이상 보이지 않을때 호출 되는 함수 */
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "The onStop() called");
}

/** Activity 가 종료되기 직전에 호출 되는 함수 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "The onDestroy() called");
}
}


Activity 가 실행되고 종료될때까지 호출되는 Callback 함수의 순서를 확인하기 위해 debug log 를 찍어 보는 코드 입니다. 


상기 코드로 앱을 실행 후 종료 시 아래와 같은 로그를 확인 할 수 있습니다. 


Activity Life Cycle 을 잘 이해 하시면 안드로이드 앱 개발에 많은 도움이 되실 겁니다. 


이상으로 Android Activity Life Cycle 에 대한 내용 마무리 하겠습니다. 



P.S. 최근 업무에 시달리고, 육아에 시달리다 보니 강좌를 자주 올리지 못하고 있습니다. 최대한 짬을 내서 올릴 수 있도록 하겠습니다. 

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


Android Studio 의 UI 에 대해 대략적인 설명을 하고자 합니다. 


기존에 eclipse로 안드로이드를 개발 하셨거나 서버개발을 하셨던 분들은 그래도 어느정도 비슷한 부분이 많다는 것을 쉽게 알아 채실수 있습니다. 

하지만, 좀더 명확하게 한번 정리 해보고자 합니다. 



■ Android Studio UI


새 프로젝트를 생성하거나 기존 프로젝트를 열게 되면 안드로이드 스튜디오의 메인 창이 뜨게 됩니다. 

eclipse와 다르게 한 프로젝트당 한개의 메인창을 가지게 됩니다. 

즉, A 라는 프로젝트와 B 라는 프로젝트 두개를 열개 되면 아래와 같은 메인 창이 두개가 열리는 겁니다. 


메인창의 구조는 마지막으로 Android Studio 를 종료하던 시점의 구조를 따라가지만 처음 생성 하셨다면 아래와 같은 모습일 것입니다. 


(클릭 하시면 원본 사이즈로 보실 수 있습니다)



A. 메뉴바(Menu bar) 

- Android Studio 내 각종 작업을 수행하는 메인 메뉴들로 구성되어 있습니다. 


B. 툴바 (Toolbar) 

- 각 메인 메뉴에 포함된 항목들중 많이 쓰는 메뉴들을 Short Cut 형식의 아이콘으로 제공합니다. 


C. 내비게이션 바 (Navigation Bar)

- 프로젝트를 구성하는 파일 또는 폴더를 편리하게 이동 할 수 있도록 도와 줍니다. D 편집기 창에서 선택된 파일의 위치를 표기하고 있습니다. 


D. 편집기 참 (Editor Window)

- 현재 작업 중인 파일의 내용을 보여 줍니다. 


E. 상태 바 (Status Bar)

- Android Studio 의 작업 프로세스 처리에 관한 정보를 보여 줍니다. 

- 왼쪽 하단 구석의 아이콘을 클릭 시 도구 메뉴를 볼 수 있습니다. 


F. 프로젝트 도구 창 (Project Tool Window)

- 프로젝트 하위 디렉토리와 파일들을 계층구조로 보여 줍니다. 

- 작업 중 파일을 찾기 위해 또는 필요한 파일 위치 확인을 하기위해 자주 쓰는 도구 창 입니다. 


(Project Tool Window 상세)


1. AndroidManifest.xml

- 안드로이드 앱의 기본 설정을 제공하고 각각의 요소들을 정의하는  manifest 파일입니다. 

- 각종 Android Permission 관련 설정도 합니다. 


2. Java

- .java 소스파일이 위치하는 곳입니다. 


3. res/drawable

- 각종 .png 형식의 이미지 파일 또는 이지미 파일들을 포함하는 .xml drawable 객체들이 위치하는 폴더 입니다. 


4. res/layout

- 앱의 유저 인터페이스를 정의 하는 레이아웃 .xml 파일들이 위치하는 자리 입니다. 


5. res/value

- 문자텍스트, 색상, 사이즈, 스타일등을 정의한 xml 파일들이 위치하는 자리 입니다. 


6. build.gradle

- 자동 생성되는 파일로 compileSdkVerion, buildToolsVersion, applicationId,  minSdkVersion, targetSdkVersion, versionCode 및 versionName 값들이 정의 되어 있습니다. 

- 자동 생성이지만 상황에 따라 개발자가 직접 수정 가능합니다. 



그외 Project, Structure, Favorites 등등의 여러가지 도구창도 제공하고 있습니다. 

이와 관련해서는 다음 강의들을 진행 하면 언급 할 수 있도록 하겠습니다. 


이상으로 Android Studio UI 에 관해 정리해 봤습니다. 

앞으로 자주 보시게 될 화면들이니 빨리 익숙해 지실수 있도록 노력해보세요. ^^




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


오늘부터는 안드로이드 앱 개발을 시작해 보겠습니다. 


지금부터 내용은 모두 Android Studio 기준으로 작성할 예정입니다. 

eclipse 를 이용한 개발도 편하기는 하지만 더이상 지원하지 않는 개발툴로 설명을 할 필요는 없으니 꼭 필요한 경우가 아니라면 언급하지 않겠습니다. 


[Android강좌_003]안드로이드 개발환경 설정 편에서 JDK 설치 및 Android Studio 설치를 끝마쳤습니다. 혹, 설정이나 설치 중 어려움이 있으신 분들은 문의 주시면 도와 드리겠습니다. 




■ 나의 첫 안드로이드 앱에 Hello World 를 찍어보자


대부분의 프로그래밍 언어는 첫 시작을 "Hello World"를 찍는 것으로 시작 합니다. 

그렇다면 우리도 Android 앱 개발의 시작을 알리는 Hello World 를 찍어 봐야겠죠? 


1. 설치한 Android Studio 를 실행 합니다. 

왼편에는 최근 사용한 프로젝트 목록이 나오는데요. 여기서 직접 선택하여 프로젝트를 실행 하실수 있습니다. 


하지만 지금은 첫 프로젝트 생성이니 Start a new Android Studio project 를 선택합니다. 



2. 프로젝트 생성을 위해 Application 이름 및 Company Domain을 설정합니다. 


여기서 정말 중요한 포인트 하나 언급해야 해야 합니다. 

위 두개 명칭을 합쳐서 Package Name (패키지명)을 설정하게 되는데요. 이것이 나중에 여러분이 만든 앱을 구분하는 값이 됩니다. 


위 예제의 경우 Company Domain + Application Name 으로 인해 Package Name 이 com.tutorial.james.myapplication 이 되었습니다. 

위 붉은 색 패키지명이 Google Play 에서 여러분이 만든 앱의 ID가 됩니다. 


예를 들어 Google Play 에서 Gmail 앱을 설치 하려면 아래 링크로 이동이 됩니다. 

https://play.google.com/store/apps/details?id=com.google.android.gm

위 링크 중 com.google.android.gm 이라는 아이디 값이 바로 패키지 명입니다. 


즉, 예제의 앱을 Google Play 에 등록 한다면 

https://play.google.com/store/apps/details?id=com.tutorial.james.myapplication

위 주소로 이동 시 해당 앱을 설치하는 화면이 나오게 됩니다. (위 링크는 실제 앱을 등록하지 않았음으로 아무것도 보실수 없습니다)


그렇다는 것은 이 패키지 명은 유니크 하다는 이야기가 됩니다. Google Play 내에서 동일한 패키지 명을 지닌 앱은 존재하지 않습니다. 

패키지명 생성할때 유의 하셔야 하는 부분입니다. ^^



3. 안드로이드 타겟 단말 설정

< Fig. 3-1 >


< Fig. 3-2 >


3-1 그림의 경우 Minimum SDK 를 안드로이드 4.0 (아이스크림 샌드위치)로 설정 했는데요. 구글 플레이 등록 디바이스 기준 97.4%를 커버 한다는 글이 보이실겁니다. 


3-2 그림의 경우 Minimum SDK 를 안드로이드 2.3 (진저브레드)로 설정을 했는데요. 구글 플레이 등록 디바이스 기준 100%를 커버 한다고 나와 있습니다. 


어느 쪽으로 설정하시든 상관은 없지만 3-1과 같이 4.0 버전으로 설정을 할 경우 나머지 3% 정도는 여러분이 만든 앱을 다운받을 수 없습니다. 검색을 해도 노출이 되지 않습니다. ^^;;


그외 다른 디바이스용 앱도 개발 할 수 있으니 차후 기회가 된다면 관련 글 추가 해보도록 하겠습니다. 



4. Activity 타입 설정


Default 는 Empty Activity 로 설정 되어 있습니다. 개발하고자 하는 목적이나 화면 구성에 따라 풀스크린, 구글광고앱, 구글맵 등등을 선택할 수 있고 프로젝트 생성 시 Android Studio 가 그 설정에 맞는 컴포넌트들을 셋팅해 줍니다. 


편하기는 하지만 굳이 저 기능들을 사용하지 않고 Empty Activity 로 시작해서 원하는 기능들을 추가 하는 방법도 있습니다. 


여기서는 Empty Activity 를 선택하여 Next 를 선택 합니다. 



5. 메인화면 Activity 설정


Android 에서 Activity 란 각각의 화면을 이야기 합니다. 

위 예제에서는 MainActivity 로 생성했는데요. 실제 파일이 생성 될때는 MainActivity.java 파일로 만들어 집니다. 

그리고 하나의 Activity 에는 화면을 구성하는 .xml 파일이 맵핑 되거나 또는 Activity 내에서 직접 코딩으로 생성 하는 경우도 있습니다. 

여기서는 activity_main 이라는 명을 가진 .xml 파일을 생성 합니다. 


Finish 를 눌러 프로젝트를 생성 합니다. 



6. 프로젝트 생성


프로젝트가 생성되고 앞으로 자주 보게될 Android Studio 개발 화면으로 진입하셨습니다. 



7. 안드로이드 가상 장치 AVD (Android Virtual Device) 실행하기 


실제 앱을 실행할 단말이 있어야 합니다. 

안드로이드 폰 사용자라면 폰을 USB 커넥터를 이용하여 개발 PC에 연결하는 방식으로 개발을 할 수 있으나 Android Studio 에서 제공하고 있는 안드로이드 가상 장치 (AVD) 를 사용해 보도록 하겠습니다. 


위 이미지의 아이콘을 클릭 또는 Tools > Android > AVD manager 를 선택합니다.



8. AVD 선택 및 실행 


처음 등록되어 있는 디바이스는 Nexus 5 입니다. 

왼쪽 하단 Create Virtual Device 를 클릭하여 다른 단말들을 등록 하거나, 원하는 디바이스를 커스터마이징 가능합니다. 이부분은 차후에 한번 다시 언급하겠습니다. 


가장 오른쪽 Actions 컬럼의 초록색 화살표를 클릭 하면 AVD를 실행 합니다. 



9. 실행된 안드로이드 가상 장치 (AVD)


Nexus 5 실물과 같은 가상 장치가 실행 됩니다.



10. Application 실행하기


위 이미지의 Run 'app' 버튼을 클릭 하거나 Run > Run 'app' 을 실행하는 것으로 현재 프로젝트 내 개발된 상태로 앱을 실행 (빌드한다 라는 표현을 많이 씁니다) 합니다. 



11. Application 을 설치할 Device 선택


실행 중인 AVD - Nexus 5 가 연결된 단말 정보로 보여집니다. 

물론 여기서도 다른 AVD 를 추가로 생성하는 것이 가능합니다. 


만약 AVD 를 여러개 실행 중이거나 개인 테스트 폰이 USB 를 통해 추가 연결되어 있다면 더 많은 목록이 보여 지게 됩니다. 


원하는 디바이스를 선택후 OK를 클릭하여 앱을 실행합니다. 



12. Hello World!


AVD 에서 앱이 실행 되고 Hello World! 가 찍혀 있는 것을 보실 수 있습니다. 




이렇게 첫 안드로이드 애플리케이션을 만드는데 성공 하였습니다. 

어렵지 안죠? ^^



여담이지만 안드로이드 앱 개발자가 그렇게 많지 않은 초창기에 있었던 이야기 입니다. 


안드로이드 공부를 하고 입사 지원을 한 사람에게 면접관이 이렇게 물었다고 합니다. 


"안드로이드 앱에 Hello World 라는 문구를 찍을려면 어떻게 해야 합니까?"


그러자 지원자가 장황하게 설명을 시작했다고 합니다. 

"레이아웃 xml 파일을 열고 TextView를 생성하여 text에... " 


그 지원자는 바로 면접에서 떨어졌다고 합니다. 


왜인지 아시겠죠? 처음 프로젝트를 생성하고 아무것도 하지 않고 앱을 실행하면 보실수 있는것이 바로 Hello World! 이니까요 ^^



지금까지 안드로이드 첫번째 앱을 만들어 봤습니다. 

앞으로 더 좋은 글 준비 해보겠습니다. 





블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


이번에는 안드로이드 개발을 위한 개발환경 설정에 대해 정리 하겠습니다. 


■ Java JDK 설치

기본적으로 Java JDK 가 설치 되어 있어야 합니다. 

JDK 설치는 아래 오라클 홈페이지의 Java 설치 페이지로 이동 하시면 됩니다. 

http://www.oracle.com/technetwork/java/javase/downloads/index.html



Java Platform (JDK) 8uXXX 를 선택합니다. 


동의 후 PC 버전을 선택하여 다운로드를 시작 하시면 됩니다. 

필자의 PC 는 64비트 이므로 x64 를 선택했습니다. 

참고로 32비트의 경우 x86 을 선택 하시면 됩니다. 


설치 파일을 받으신후 프로그램 설치는 Setup Wizard 따라서 그냥 설치 하시면 되는 전혀 어렵지 않은 과정이므로 생략 합니다. 



■ 개발 툴 설치

개발 툴인 Android Studio 를 아래 링크에서 다운로드 받으시면 됩니다. 

https://developer.android.com/studio/index.html


툴 설치는 Setup Wizard 가 안내하는 대로 그대로 따라 가시기만 하면 간단히 설치 가 되므로 특별히 언급하지 않겠습니다. 


다만 일부 Windows 시스템에서는 JDK 가 설치된 위치를 런처 스크립트가 찾지 못하는 경우가 있다고 합니다. 이 문제가 발생하면 올바른 위치를 나타내는 환경변수를 설정해주면 됩니다. 


Start 메뉴 > 컴퓨터 > 시스템 설정 > 고급 시스템 설정 > 고급 탭  > 환경 변수 를 클릭 하여 JDK 폴더 (예: c:\Program Files\Java\jdk1.8.1_21)를 가리키는 새 시스템 변수 JAVA_HOME 을 추가 하시면 됩니다. 


아래 동영상은 설치 방법입니다. 안드로이드 개발자 사이트에 있는 동영상입니다.


출처 : https://developer.android.com/studio/install.html



기존에는 Java 개발자들에게 아주 친숙한 eclipse 를 사용하여 안드로이드 개발이 가능 하였지만 얼마전부터 eclipse 에 대한 ADT (Android Developer Tool) 지원을 끊어 버렸습니다. 

https://android-developers.googleblog.com/2016/11/support-ended-for-eclipse-android.html


위 링크를 확인 해보시면 2015년 연말에 이미 더이상의 지원을 하지 않을 것이라고 공지 했었음을 명시하고 현재는 지원을 하고 있지 않음을 이야기 하고 있습니다. 



그래서 이제는 더이상 eclipse 를 IDE 로 추천하지 않습니다. 

대신 구글에서 official IDE 로 Android Studio 를 내세우고 있습니다. 그만큼 강력한 개발 툴임은 확실합니다. 물론 eclipse 를 사용하시던 분들에게는 Android Studio 의 단축키가 정말 어렵게만 느껴 질수 있지만 eclipse 단축키를 그대로 사용 하는 방법도 있습니다. 


Android Studio 단축키 및 eclipse 단축키 사용하기 포스트 내용 확인하러 가기



이제 개발 준비가 끝나셨습니다. 

시작이 반이라고 이미 안드로이드 개발자라고 하실수... 있었으면 좋겠지만, 아직 갈 길이 멀게 느껴집니다. 


혼자서 멋드러진 앱을 만들수 있는 그날까지 열심히 강좌를 올리도록 하겠습니다. 

감사합니다. 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안녕하세요. 제임스 입니다. 


Android 개발 기초 포스팅을 지속적으로 할려고 했으나 오늘 오전 Google 로 부터 아래와 같은 제목의 메일을 받았습니다. 


Google Play 개발자 정책 위반 경고: 조치 필요


최근 업데이트를 하지 않은 앱을 대상으로 위와 같은 메일을 받아 처음에는 상당히 당황했습니다. 

뭘 위반했지? 생각해보고자 노력 하는 것 보다는 메일 내용을 확인 해봐야 겠죠?



■ 위반내용 확인



내용 이해하기가 조금 어렵습니다. 


하지만 모든 해결책은 구글내에 있는 법이죠. 

https://support.google.com/googleplay/android-developer/answer/113469#privacy

상기 URL에서 아래와 같은 해결 방법을 제시해주고 있습니다. 



즉, Google Play Developer Console 의 스토어 등록정보 화면에서 '개인정보처리방침' 란에 개인정보처리방침을 호스팅한 URL 을 입력 하라고 합니다. 


■ 원인 확인


Google Play Developer Console 로 이동합니다. 

https://play.google.com/apps/publish/


모든 애플리케이션 > 해당 앱 선택 > 스토어 등록정보 > 개인정보처리방침 항목을 확인 합니다. 



기존에는 위와 같이 "지금 개인정보처리방침 URL을 제출하지 않습니다." 라는 부분을 체크하여 문제 없이 사용하고 있었으나 어떤 이유에서 인지 현 시점 기준으로 정책 위반 상태가 되어 경고가 날아 온 것입니다. 


위에 언급한 android.permission.CAMERA 와 관련된 개인정보처리 방침을 사용자에게 제공하지 않은 것이 문제가 된 것입니다. 


지금까진 잘 썼는데 왜 갑자기 ㅠㅠ



■ 해결 방법


해결책은 의외로 간단합니다. 

운영하고 있는 홈페이지나 블로그에 개인정보 처리 방침에 대해 정리 하고 특히 위 이미지에서 위반으로 표기된 android.permission.CAMERA 와 관련하여 꼭 언급을 해주셔야 합니다. 


그런후 해당 페이지 URL 을 위 개인정보처리방침 URL 에 등록 해주시면 됩니다. 추가로 배포한 앱에도 URL 을 제공하여 사용자가 언제든지 확인 할 수 있도록 조치해 주시면 끝입니다. 




블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,
History of Android

안녕하세요. 제임스 입니다. 

이번 내용은 가볍게 안드로이드 버전별 역사에 대해 간략히 정리 하고자 합니다. 

쓸데 없이 왜 이런 내용을 다루느냐고 하시지 마시고 꼭 잘 봐두시길 바랍니다. 


안드로이드는 버전별로 지원하는 API 가 많이 다르고 버전에 따라 시스템 접근 권한도 다르기 때문에 응용프로그램(애플리케이션)을 개발 하실 때 어느 버전의 안드로이드 OS를 타겟으로 개발 할 것인지 정하는 것이 정말 중요 합니다. 


■ 안드로이드 버전별 역사 (History of Android OS)

많은 분들이 알고 계시겠지만 안드로이드 코드네임은 디저트 명으로 정해지고 있습니다. 

현재는 A 부터 N 까지 나와 있는 상태이며 아래와 같이 나열할 수 있습니다. 

Aestro, Blender, Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwitch, Jelly Bean, KitKat, Lollipop, Marshamallow 그리고 마지막으로 Nougat 까지 발매된 상태 입니다. 





■ 안드로이드 버전 정보 

 Platform Version

API Level 

VERSION_CODES

 Android 7.0 Nougat

24 

 N 

 Android 6.0 Marshmallow

23 

 M

 Android 5.1 Lollipop

22 

 LOLLIPOP_MR1 

 Android 5.0 Lollipop

21 

 LOLLIPOP 

 Android 4.4W Kitkat Watch

20 

 KITKAT_WATCH 

 Android 4.4 Kitkat

19 

 KITKAT 

 Android 4.3 Jellybean

18 

 JELLY_BEAN_MR2 

 Android 4.2 Jellybean

17 

 JELLY_BEAN_MR1 

 Android 4.1 Jellybean

16

 JELLY_BEAN 

 Android 4.0.3 

 Ice Cream Sandwich

15

 ICE_CREAM_SANDWICH_MR1 

 Android 4.0

 Ice Cream Sandwich

14 

 ICE_CREAM_SANDWICH

 Android 3.2 Honeycomb

13 

 HONEYCOMB_MR2 

 Android 3.1.x Honeycomb

12 

 HONEYCOMB_MR1 

 Android 3.0.x Honeycomb

11 

 HONEYCOMB 

 Android 2.3.3 Gingerbread

10 

 GINGERBREAD_MR1 

 Android 2.3 Gingerbread

 GINGERBREAD 

 Android 2.2 Froyo

 FROYO 

 Android 2.1 Eclair

 ECLAIR_MR1 

 Android 2.0.1 Eclair

 ECLAIR_0_1 

 Android 2.0 Eclair

 ECLAIR 

 Android 1.6 Donut

 DONUT 

 Android 1.5 Cupcake

 CUPCAKE 

 Android 1.1 Petit Four

 BASE_1_1 

 Android 1.0 (No Code Name)

 BASE 


※ Platform Version : 일반적으로 이야기 할때 쓰는 버전정보


※ API Level : 숫자 값으로 정해진 버전별 ID 값이라고 생각 하면 됩니다. Android 코드로 뽑아 낼때는 아래와 같이 사용 합니다. 

android.os.Build.VERSION.SDK_INT


※ VERSION_CODES : 숫자 값으로 맵핑 된 enum 값입니다. 사용 방법은 아래와 같습니다. 

android.os.Build.VERION_CODES



각 함수 및 코드 사용법은 추후 관련 내용을 다룰때 자세히 언급 하도록 하겠습니다. 



■ 앱 개발 시 유의 사항

안드로이드 앱 빌드시 꼭 체크 하셔야 하는것들이 바로 아래 두가지 입니다. 


minSdkVersion : 최소 API 레벨을 지정 하는 것으로 만약 9 로 적용 할 경우 진저브레드 2.3 이상 단말에서만 해당 앱을 설치 실행 할 수 있음을 의미 합니다. 


targetSdkVersion : 대상 API 를 설정 하는 것으로 설정하지 않을 경우 minSdkVersion 의 값과 동일한 값을 사용하게 됩니다. 

향후 상위 버전 OS 가 출시 되더라도 지정된 버전과의 호환성을 유지 하도록 호환성 동작을 활성화 하지 않도록 시스템에 알리는 역할을 합니다. 


위 두가지 값을 설정 하는 이유는 앱의 성격에 따라, 대상 연령층에 따라 그리고 개발 앱의 특성에 따라 최소 SDK 설정을 해주어야 합니다. 


예를 들자면, 주거래 고객의 연령층이 높은 금융권 앱이라면 minSdkVerion 을 최소로 낮춰 보통 9 이상으로 잡습니다. 이럴 경우 8 이전 버전의 OS 가 설치된 단말 사용자는 구글 플레이에서 해당 앱을 검색할 수 없게 됩니다. 




지금까지 간단히 안드로이드 버전에 따른 히스토리를 정리 했습니다. 

좀더 디테일한 사용 법은 추후 관련 내용 작성 시 추가 하도록 하겠습니다. 


아래 링크는 안드로이드 히스토리 관련내용을 재미있게 만들어 둔 android official site 입니다. 한번 놀러 가보세요 ^^

https://www.android.com/history/#/donut

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

Android Development Guide




■ 안드로이드란 무엇인가? (What is Android?)

Android는 오프소스로 모바일(스마트폰등)과 태블릿 PC 등의 기기를 위한 Linux 기반 운영체제 입니다. Android는 리눅스 기반 운영체제 이나 응용 프로그램은 Java 를 사용 하여 작성 할 있도록 개발 하였으며 소프트웨어 개발키트 (SDK - Software Development Kit)를 통해 응용 프로그램을 개발하기 위해 필요한 각종 도구들과 API 를 제공하고 있습니다. 



■ 대상 (Target Audience)

앞으로 필자가 작성해 나갈 내용은 안드로이드 개발 초보자들을 위한 내용이며 중간중간 심화 과정도 포함할 예정입니다. 

이 가이드가 끝나는 시점에는 훌륭한 안드로이드 개발 기술을 보유한 상태일 것입니다. 

 


■ 전제조건 (Prerequisites)

안드로이드가 무엇인가라는 섹션에서도 언급했지만 안드로이드는 Java 프로그래밍 언어로 응요프로그램을 개발 할 수 있습니다. 즉, 기본적으로 Java 를 이해 하시고 계셔야 필자가 작성하는 개발 가이드를 이해 하고 따라 오실수 있으며, 더 재미있게 안드로이드 개발을 하실 수 있습니다. 






안녕하세요. 제임스 입니다. 


앞으로 장기간에 걸쳐 안드로이드 개발 가이드를 포스팅 하고자 합니다. 

이와 더불어 시간이 나면 다른 언어들도 하고 싶은 생각이 있지만 너무 의욕만 앞세우다 이도 저도 아닌 어정쩡한 상황이 될수 있겠죠? 

우선은 안드로이드 부터 시작 하겠습니다. 앞으로 잘 준비 해서 많은 분들이 안드로이드 개발에 입문 하고 나아가 좋은 앱을 개발 할 수 있는 초석이 될 수 있도록 좋은 글, 좋은 예제를 준비 하도록 하겠습니다. 


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안드로이드 앱 개발 중 꼭 한번 정도씩은 필요한 기능 중 한가지가 바로 내 폰이 부팅 되는 시점에 내가 만든 앱을 실행 시키는 것입니다. 


Android 앱의 Life Cycle 을 아시는 개발자라면 잘 아시겠지만 내가 만든 앱이 동작을 하기 위해서는 사용자가 직접 실행을 시켜 줘야만 합니다. 

하지만 경우에 따라서는 사용자 승인 하에 앱이 단 한번이라도 실행 되게 되면 그 이후에는 사용자가 신경 쓰지 않아도 단말이 재부팅 되더라도 실행 되어야 하는 경우가 있습니다. 


예를 들자면 헬스 보조 앱이나 알람 같은 경우가 있습니다.


이와 같은 경우를 위해 Android 폰 부팅 시 내가 만들 App을 실행 시키는 방법에 대한 내용을 정리 합니다. 



1. 우선 BroadcastReceiver 를 상속 받는 MyReceiver 클라스를 하나 생성하여 모바일 단말의 부팅이 완료된 경우의 액션을 정의 합니다. 


여기서 android.intent.action.BOOT_COMPLETED 메세지는 모바일 단말의 부팅이 완료 되었다는 메세지 이며 이 메세지를 받았을 경우 MainActivity 를 실행 시켜 주는 기능을 합니다. 


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("android.intent.action.BOOT_COMPLETED")){
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}

}


2. AndroidManifest.xml 에 RECEIVE_BOOT_COMPLETED 권한을 추가 합니다.

 receiver 에는 생성한 클라스명인 MyReceiver 를 등록 하고, intent-filter 에 우리가 사용할 BOOT_COMPLETED 메세지를 추가 해줍니다. 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>


3. MainActivity 클라스에 본인이 원하는 동작을 구현하고 앱을 빌드하면 개발 완료입니다. 



이제 앱을 실행 하면 리시버가 등록이 되고 앱을 종료 하더라도 단말이 재부팅 되면 broadcast receiver 가 BOOT_COMPLETED 메세지를 받아 내 app 의 MainActivity 를 실행 하게 되면 정의한 동작을 수행하게 됩니다. 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,