#android

개발 세팅 및 환경 설정

가상화 기기 설정

안드로이드 가상화 기기 설정을 위해 VT-X 켜기
컴퓨터의 BIOS세팅에 진입(레노버의 경우F1 혹은 Enter)에 진입하여
Intel 가상화 세팅을 Enable로 바꾼다.

기본 환경 설정

  1. 자바 JDK(Java Development Kit)를 설치한다.
    JDK는 앱을 만드는 일종의 작업장과 같은 역할을 한다.
    JDK는 컴퓨터가 JAVA 프로그래밍 언어를 읽고 쓸수 있게 해 주는 소프트 웨어 이다.
    결론적으로 JDK Standard Edition을 설치한다.

  2. 안드로이드 스튜디오를 설치한다.
    안드로이드 스튜디오는 우리가 앱을 만드는 일종의 작업장과 같은 개념이다.

  3. Android Setting의 plugin에서 lombok plugin 다운로드

도메인 이름 설정

흔히 알고 있는 패키지 명은 .com 형식을 취하며 이것은 특정 도메인을 일컷는다.
패키지 명은 이를 단순히 뒤집은 꼴이며 제일 뒤에 Application name이 붙게 된다.
이는 어플리케이션을 배포 할때 각각 고유한 패키지를 가지게 한다.

만약 company domain 이 tangentx.com이고 어플리케이션 이름이 expirit이라면 패키지 명은
com.tangentx.expirit이 된다.

모바일 설정

핸드폰에게 내가 개발자라는 사실을 알리기 위해 개발자 모드를 적용한다.
핸드폰 제작사 별로 알맞은 드라이버를 설치한다.
핸드폰을 연결하여 에뮬레이팅 할 수 있다.
가상 장치를 이용하여 에뮬레이팅 할 수 있다.
컴퓨터의 프로그램 및 기능에 들어가서 vt-x를 활성화 한다.

한글 설정

1
2
3
4
//plugins/android/lib/layoutlib/data/fonts/fonts.xml 에서
<family lang=""ko"">
<font weight=""400"" style=""normal"" index=""1"">NanumGothic.ttf</font>
</family>

를 추가해준다.

바로 수정이 되지 않는 경우가 있으므로 파일을 바탕화면에 저장하여 바꾼뒤 복사해주는 식으로 한다.

Android 프로젝트 세팅

AndroidManifest 세팅
AndroidManifest에서 처음 어플리케이션을 시작한다.

IDE란?

IDE란 Integrated Developing Envionment의 약자로써 코드를 작성하는 공간을 의미한다.
안드로이드 에서는 흔히 Android Studio를 일컷는다.

XML이란?

XML이란 Extensible Markup Language의 약자로써 기본적인 표현 언어이다.
이 언어의 문법을 XML Syntax라고 한다.

Advanced Layout

Drawable의 활용

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/magnitude1" />
<size
android:width="36dp"
android:height="36dp" />
<corners android:radius="18dp" />
</shape>

Drawable에 새로운 Shape을 정의
하고 이를 background로 사용

ListView

Network

URL이란? Uniform Resource Locator

http: 는 protocol, scheme을 의미한다.
example.com은 host/domain/authority
를 의미한다.
/animal/mammal/primate/tarsier는
resource path를 의미한다.
?diet=carnivore&active=night은 query
부분이다.

1
2


API

Application Programming Interface
다른 소프트웨어에서 해당 어플리케이션이 편하게 사용되도록 하는 장치
모든 사람람들은 API를 사용하게 된다.
API의 url 에 특정한 request를 보내면 일정한 데이터 형식을 같추어 response를 보내준다.

1
2


Parsing

긴 스트링을 컴퓨터가 이해하기 쉬운 다른 형태로 변형하는 과정 즉 JSON과 같은 형태로 변형
JSON = JavaScript Object Notation

Permission in Android

인턴넷에 접속하거나 혹은 메시지를 보내고 카메라를 작동 시키는 등 다양한 동작을 하기 위해서는
permission을 얻어야 한다.

readFromStream()

클라이언트가 서버에 요청을 보내면 서버는 이진수 형태의 raw data를 보내주는데 이를 사람이 이해 할 수 있
는 형태의 데이터로 읽어들이기 위해서 readFromStream을 사용한다.

InputStream

input Stream은 이미지나 텍스트 등 다양한 resource들이 입력되는 입력 형태이다.
이 input Stream을 읽어들여 이미지, 텍스트 등 다양한 요소들을 적합한 형태로 받아온다.

MainThread

Android가 작업들을 처리할때는 처음부터 순차적으로 처리하게 되는데 이러한 주 작업목록을
MainThread 라고 한다. 이는 사용자가 쓰는 측면에서 UIThread 라고도 하는데 이 작업목록에 긴 시간동안의
작업이 포함되면 사용자가 다음 입력을 지시하여도 화면이 얼어있게 된다.
그래서 절대 UIThread를 막으면 안된다.
즉, UIThread에서는 사용자가 실제 사용하는 것들만 처리하고 그 동안 다른 근 작업들은 backgroundthread
에서 처리하도록 한다. - AsyncTask<Params, Progress, Result>

레이아웃

Fragment

WorkFlow

  1. Activity에 Fragment 추가
    activity_main에 fragment를 추가해 준다.

  2. Fragment를 위한 Layout Resource XML 작성

  3. 각 Fragment Class 구현

  4. Activity의 onCreate()에서 Fragment초기화.

  5. FragementTransaction을 사용한 Fragment 제어
    FracmentTansaction의 replace()함수를 통해 제어.

TabLayout

WorkFlow

  1. gradle에 dependencies를 추가해 준다.

  2. style.xml에서 액션바를 제거한 다음, 탭으로 사용할 Fragment를 생성한다.

  3. 프래그먼트를 구현할 xml를 생성한다.

  4. MainActivity에서 Toolbar, TabLayout, ViewPager를 생성하고 설정한다.
    출처 바로가기

라이브러리

ButterKnife

개요

일반적으로 레이아웃을 생성하고 난뒤, 제일 먼저 View를 선언하고 할당하는 작업이다.

WorkFlow

  1. Gradle에 추가
    그레이들 -> compile ‘com.jakewharton:butterknife:7.0.1’

  2. Activity에서 버터나이프로 바인드 해주기

    1
    2
    3
    4
    5
    6
    7
    //액티비티의 경우
    super.setContentView(layoutResID);
    ButterKnife.bind(this);

    //Fragment의 경우
    View view = LayoutInflater.from(getActivity()).inflate(resId, null);
    ButterKnife.inject(this, view);
  3. 레이아웃에서 View 객체 선언

1
2
3
4
5
6
@Bind(R.id.view_action_sms)
View view_action_sms;
@Bind(R.id.view_action_comment)
View view_action_comment;
@Bind(R.id.view_input_comment)
View view_input_comment;

기타 기능
onClickListener달기
ClickListener가 필요한경우 setOnClickListener를 선언해줄필요 없이 바로 실행될 함수를 만들고 @OnClick 을 사용하면 됩니다.
만약 View가 button처럼 클릭 이벤트만을 받고싶은 경우라면 2번에서 처럼 View객체를 선언할 필요조차 없이 그냥 바로 @OnClick함수만 사용해도 됩니다.

1
2
3
4
5
6
7
8
9
10
@OnClick(R.id.view_action_call)
void onCallClick() {
.... 
}
<!-- 여러 뷰에 대해서 하나의 함수만을 실행시키고 싶다면 아래와 같이 선언해주면 됩니다. -->

@OnClick({R.id.pager, R.id.indicator, R.id.cell_picture, R.id.cell_product, R.id.cell_price, R.id.cell_description,R.id.cell_location})
public void onSomeThingClick(View view) {

}

RecyclerView

WorkFlow

  1. 레이아웃에 RecyclerView를 추가한다.

  2. 액티비티에 레이아웃을 연결한다.

  3. RecyclerView.Adapter 클래스를 생성한다. // 굳이 만들지 않고 다음단계로 진행해도 된다.
    RecyclerView.Adapter를 extends하여 클래스를 생성하고, 내부에서 ViewHoler를 생성한다.

onCreateViewHolder(ViewGroup parent, int viewType)
뷰와 뷰홀더를 만들고 레이아웃의 사이즈 마진 패딩 등을 조절한다.
뷰홀더에 뷰를 넣어 뷰홀더 인스턴스를 만들어 리턴한다.

onBindViewHolder(ViewHolder holder, int position)
데이터베이스에서 데이터들을 받아와 뷰홀더 내의 요소들에 입혀준다.

  1. 액티비티에 LayoutManager와 Adapter를 생성한다.
    어댑터는 데이터 집합의 항목에 액세스할 수 있게 해주며, 항목 뷰를 생성하고, 원래의 항목이 더 이상 보이지 않을 경우 일부 뷰의 콘텐츠를 새 데이터 항목으로 교체합니다

Google Developer 참조

Retrofit

개요
Rest API통신을 위한 Android/Java 라이프러리
WorkFlow

  1. build.gradle에 의존성 설정
1
2
3
4
dependencies {
compile 'com.squareup.retrofit2:retrofit:2.1.0' // Retrofit
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3' // Gson 변환을 위한 converter
}
  1. 퍼미션 추가
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    인터넷 통신을 하기 위한 퍼미션을 추가해 준다.
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- Resource URI

    http://apis.skplanetx.com/weather/current/hourly?version={version}&lat={lat}&lon={lon}&city={city}&county={county}&village={village}

    Protocol - REST

    HTTP Method - GET -->

    public interface WeatherApiInterface {
    @Headers({"Accept: application/json"})
    @GET("weather/current/hourly")
    Call<WeatherRepo> get_Weather_retrofit(@Query("version") int version, @Query("lat") String lat, @Query("lon") String lon);
    }

    <!-- @Headers 에는 필요한 헤더 부분을 ({ ~~ . ~~ }) 형식으로 넣어줄 수 있습니다.

    @GET 부분에는 현재날씨(시간별)에 해당하는 URL 을 넣어줍니다.

    다음으로 Call입니다.

    Call <'주고받을 객체'> '함수명' (@Query ('변수 이름') '자료형' '변수 이름')  형태로 나타나 있는데요

    @Query 를 통해 위치가 바뀌어도 동적으로 값을 받아올 수 있습니다! -->

GSON
JSON의 파싱을 쉽게 하기 위해 구글에서 만든 라이브러리이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class WeatherRepo {
@SerializedName("result")
Result result;
@SerializedName("weather")
weather weather;

public class Result {
@SerializedName("message") String message;
@SerializedName("code") String code;

public String getMessage() {return message;}
public String getCode() {return code;}
}

public class weather {

public List<hourly> hourly = new ArrayList<>();
public List<hourly> getHourly() {return hourly;}

public class hourly {
@SerializedName("sky") Sky sky;
@SerializedName("precipitation") precipitation precipitation;
@SerializedName("temperature") temperature temperature;
@SerializedName("wind") wind wind;

public class Sky{
@SerializedName("name") String name;
@SerializedName("code") String code;

public String getName() {return name;}
public String getCode() {return code;}
}

public class precipitation{ // 강수 정보
@SerializedName("sinceOntime") String sinceOntime; // 강우
@SerializedName("type") String type; //0 :없음 1:비 2: 비/눈 3: 눈

public String getSinceOntime() {return sinceOntime;}
public String getType() {return type;}
}
public class temperature{
@SerializedName("tc") String tc; // 현재 기온

public String getTc() {return tc;}
}
public class wind{ // 바람
@SerializedName("wdir") String wdir;
@SerializedName("wspd") String wspd;

public String getWdir() {return wdir;}
public String getWspd() {return wspd;}
}
public Sky getSky() {return sky;}
public hourly.precipitation getPrecipitation() {return precipitation;}
public hourly.temperature getTemperature() {return temperature;}
public hourly.wind getWind() {return wind;}
}
}
public Result getResult() {return result;}
public weather getWeather() {return weather;}

public interface WeatherApiInterface {
@Headers({"Accept: application/json"})
@GET("weather/current/hourly")
Call<WeatherRepo> get_Weather_retrofit(@Query("version") int version, @Query("lat") String lat, @Query("lon") String lon);
}
}
<!-- GSON이 쉽고 편하고 아름답게 파싱해 주는 것을 볼 수 있습니다!

여기서 @SerializedName 어노테이션이 포인트인데요

이 어노테이션을 이용하면 wspd(풍속) 을 

@SerializedName("wspd") String windSpeed; 처럼 변수 이름을 바꿔 넣을 수도 있습니다.
-->

장점 / 용도
다음과 같은 귀찮은 작업들을 매우 편리하게 바꾸어 준다.

  1. 네트워크 통신 연결/해제
  2. 가져온 데이터 파싱
  3. Json통신의 경우, Json데이터를 Class로 변환
  4. 각종 에러 처리

출처 - 박상권의 삽질 블로그
출처 - Retrofit 공식 홈페이지

EventBus
Workflow

  1. Otto를 관리해주는 Singleton 개념의 BusProvider 클래스를 생성
  2. Event를 감지하고자 하는 ACtivity 혹은 Fragment에서 register를 수행한다.
  3. Event가 발생하는 위치에서 Event가 발생했음을 알린다.
  4. 이벤트가 발생했을때 수행할 함수를 FinishLoad 메소드에 만들어 준다.
  5. 해당 이벤트에서 원하는 변수, 리스트 등을 받아서 작업을 처리한다.

    출처 바로가기

Dagger
개요
Android/Java에서 Dependency Injection을 위한 편리한 도구이다.
주요 Annotation
@Module, @Provides, @Component, @Inject
@Inject: 이 어노테이션은 의존성을 요청합니다. 의존성 주입을 통해서 해당 어노테이션이 달린 클래스나 필드에게 값을 주입해 달라고 Dagger 에게 요청합니다. Dagger 는 어노테이션이 달린 클래스의 인스턴스를 생성하고 그것들의 의존성을 만족시킵니다.

@Module: 모듈들은 의존성을 제공하는 메서드들을 가진 클래스입니다. 의존성을 제공하는 클래스를 정의하고 @Module 어노테이션을 답니다. 그러면 Dagger 는 클래스 인스턴스를 만들 때 의존성을 만족시키기 위한 정보를 찾을 수 있습니다.

@Provide: 모듈 안에서 해당 어노테이션이 달린 메서드를 정의합니다. 해당 어노테이션이 달린 메서드가 Dagger 가 어떻게 의존성에 맞게 객체를 만들고 제공하는지 알려줍니다.

@Component: 컴포넌트는 @Inject 와 @Module 사이 다리이며 의존성을 주입하는 역할을 합니다. 컴포넌트는 미리 정의한 모든 타입의 인스턴스를 줍니다. @Component 어노테이션은 인터페이스에다만 달아야합니다 그리고 컴포넌트를 구성하는 모든 @Module 이 달린 클래스 목록을 적어야합니다. 컴포넌트에서 사용하는 모듈들중 하나라도 없다면 컴파일 타임에 에러를 만듭니다. 모든 컴포넌트들은 컴포넌트에 포함된 모듈들을 통해 의존성의 범위를 알 수 있습니다.

@Scope: 스코프는 매우 유용하고 Dagger 2 에서 사용자 정의 어노테이션을 통해 범위를 나누는 명확한 방법입니다. 나중에 예제에서 보겠지만 이것은 매우 강력한 기능입니다. 앞에서 언급한바와 같이 하기 때문에, 모든 객체는 자기 자신의 인스턴스를 관리하는 방법에 대해 알필요가 없습니다. 예를들어 사용자가 지정한 @PerActivity 어노테이션이 달려있는 클래스는 액티비티가 살아있는 동안 존재합니다. 다시말하자면 객체 범위의 단위를 정의할 수 있습니다.

@Qualifier: 클래스의 유형이 종속성을 식별하기 불충분할 때 사용하는 어노테이션입니다. 예를 들어 안드로이드의 경우, 많은 경우 컨텍스트의 다양한 타입이 필요합니다, 그래서 “@ForApplication”, “@ForActivity” 같은 식별자 어노테이션을 정의합니다. 컨텍스트를 주입할 때 이 식별자 어노테이션을 이용해서 Dagger 가 어떤 타입을 제공할지 정해줍니다.

WorkFlow

  1. buil.gradle에 dependencies를 추가하여 준다.

    출처 바로가기

Plugins
Lombok
주요 요소

  1. @Getter / @Setter
    기본적으로 멤버필드들에 대한 getter/setter메소드들을 만들어 줍니다.

  2. @AllArgsConstructor / @NoArgsConstructor
    멤버필드들이 모두 파라미터로 지정된 생성자와 빈 생성자를 만들어 줍니다.

  3. @Builder
    모델을 빌더 패턴으로 만들어 줍니다.

  4. @ToString
    toString의 override된 메소드를 만들어 줍니다.

WorkFlow

1. Lombok Plugin 설치

  1. gradle에 Lombokk 적용하기.
  2. gradle에 annotaion을 provide 해주기
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×