0. 시작하기 전


해당 포스트는

Android Developers Blog: An update on Eclipse Android Developer Tools등으로 이클립스 지원 중단이 발표되면서
기존 이클립스+ADT 프로젝트를 안드로이드 스튜디오용으로 컨버팅하는 작업말고도
추가 개발을 하고자 조금이라도 빠른 적응을 위한 가이드글입니다.


즉, 개발 초심/입문자를 위한것이 아니라
기존에 안드로이드 개발을 하던 사람 기준으로 개발도구 전환을 하는데 촛점을 두고 있으므로
초보자분에겐 안 맞을수도 있습니다.






1. gradle


1) gradle이란?

빌드 및 의존성 처리를 위한 스크립트 파일입니다.

어떻게 보면 이클립스+ADT환경이 GUI에 가까웠다면 gradle을 쓰는건 CUI에 가까운 방식?
(혹은 용도별로 bat파일을 다 작성/설정하는 모양새)



2) setting.gradle

1
include ‘:app’
cs


스트립트 내용자체는 굉장히 단순합니다.
물론 개발목적/요구사항에 따라 커스텀 마이징은 있겠지만, 구글쪽 문서나 해당 스크립트가 취급하는 내용을 보면
코드를 변경할 경우는 많지 않은것으로 보입니다.



3) build.gradle

> 안드로이드 스튜디오에서 build.gradle은 2가지가 있습니다.

: 여기서는 임의로 프로젝트 build.gradle / app build.gradle(혹은 모듈 레벨) 표기하겠습니다.

: 간단히만 짚으면, 구글링해서 샘플코드를 보다가 무슨 build.gradle인지 분간이 안 되면
app build.gradle --> apply plugin로 시작 혹은 android, buildTypes항목 여부.

프로젝트 build.gradle --> repositories 항목
으로 구별해볼수 있습니다.

> app build.gradle.

: 이클립스+ADT에서 주로 쓰던 AndroidManifest.xml에 명시하던 내역이 있습니다.

[(프로젝트폴더)\app\src\main\AndroidManifest.xml]

: 추가 라이브러리 연동 및 설정가능.

> 프로젝트 build.gradle

: 구글링 하다가 build.gradle을 편집하라는 내용이 있는데 대부분 이쪽이 gradle은 아니던거 같습니다.





2. 매니페스트(manifest.xml) 연계


app build.gradle쪽에서

연동된 라이브러리/minSdkVersion/버전코드 및 네임등을 지정가능하니
여기선 깔끔한 코드를 위해 액티비티 등록과 시스템 권한 지정으로 역할을 나누는게 나을것 같습니다.

앱 구동상 어느쪽을 읽는게 우선인지로 성능에 의미있는 차이를 있다면 이야기가 좀 다르겠지만요.






3. 리소스 경로 관리


1) 경로

* xml, 이미지파일, raw 하위경로 파일등은 대문자를 쓰면 안됩니다.
이건 이클립스+ADT때도 허용되지 않던 명명규칙이라 그대로 유지인거 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
android {
... ... ...
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res',
                           'src/main/res/raw',
                           'src/main/res/layouts/activity',
                           'src/main/res/layouts/dialog',
                           'src/main/res/layouts/widget',
                           'src/main/res/layouts/view'
            ]
        }
    }
}
cs


예시.



2) 파일IO

> assets디렉토리쪽은 리소스 ID가 아닌 AssetManager만 가능하다고 합니다.

1
2
3
4
5
6
7
8
9
10
11
try {//raw폴더 하위경로 기준.
    InputStream ins = argContext.getResources().openRawResource(R.raw.my_raw_file_name);
    byte[] buffer = new byte[is.available()];
    ins.read(buffer);
    ins.close();
    
    Log.d("SAMPLE"new String(buffer));
    } catch (IOException exception) {
        exception.printStackTrace();
    }
}
cs






4. 빌드&디버그


1) 빌드

빌드메뉴의 표기명이 좀 헷갈리더군요.

Build Bundle(s) / APK(s)면 서명이 없는 테스트용 APK고

Generate Signed Bundle / APK가 마켓에 업로드 가능한 빌드메뉴입니다.

서명파일 작성 및 암호입력은 이클립스 기반과 동일합니다.

옆의 Run을 보시면 디버그 모드가 있으니


이클립스 기반에서는 써본적이 없는데,

안드로이드 스튜디오에서는 디버그 모드로 실행하면 break point를 거는게 지원되네요.

안드로이드 개발용 에뮬레이터는 너무 느리니 NOX와 연동해서 디버깅하는거 추천드립니다.



2) 디버깅

주요 구간마다 로그를 심을때 제일 번거로운게 로그가 있는 함수명도 기입하는거였는데

구글링 해보니 로그를 심은 함수의 이름과 호출된 코드라인번호까지 알수 있는 방법이 있더군요.

코드는 아래의 링크로 대체합니다.

> [안드로이드/Android]개발할때만 Log 남기는 방법 - Debug Log - 박상권의 삽질블로그






기타. 참조자료


빌드 구성  |  Android Developers

Gradle 팁 및 레시피  |  Android Developers

리소스 제공  |  Android Developers


[Android] Gradle 이란?



장범석님의 개발일지: [안드로이드] Gradle로 여러가지 버전 생성하기

안드로이드 layout폴더를 서브폴더로 나누기 :: 혁준 블로그






기타. 변경이력


일자

변경이력

2019-07-01

 초안





0. 필요한 파일


파일명

예시 경로

 JDK

 C:\Java\jdk1.8.0_111
개발용 환경변수 설정(Path 설정) 참조.

 android-studio 3.1.1.0

 [#]

 C:\android-studio

 sdk-tools-windows-3859397.zip

 [#]

 D:\dev_lib\android-sdk-windows\tools
안드로이드: SDK 명령어 버전 참조.




1. 기본 사항


1) Import project

보시는바와같이 일반 폴더 아이콘이 기존 이클립스 프로젝트이고,
안드로이드 스튜디오 프로젝트의 폴더에는 별도의 아이콘으로 표시되며
프로젝트 폴더명에 공백이 있을경우 경고가 뜹니다.



2) Gradle

프로젝트가 열린후,

하단 레이아웃에 있는 Messages Gradle Sync에서 다음과 같은 에러내역이 출력됐습니다.

1
2
3
4
5
6
7
8
9
Could not find com.android.tools.build:gradle:3.1.1.
Searched in the following locations:
    https://jcenter.bintray.com/com/android/tools/build/gradle/3.1.1/gradle-3.1.1.pom
    https://jcenter.bintray.com/com/android/tools/build/gradle/3.1.1/gradle-3.1.1.jar
Required by:
    project :
    Add Google Maven repository and sync project
    Open File
    Enable embedded Maven repository and sync project
cs


수동으로 아래와 같이 스크립트 수정후,

콘솔창에 있는 Enable embedded Maven repository and sync project를 클릭합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#(project_folder)\build.gradle
buildscript {
    repositories {
        jcenter()
        google()    //<--이 부분이 추가항목 (1)
    }
    ... ... ...
}
 
allprojects {
    repositories {
        jcenter()
        google()    //<--이 부분이 추가항목 (2)
    }
}
cs



1
2
3
4
5
6
7
#(project_folder)\gradle\wrapper\gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip
classpath=com.android.tools.build:gradle:3.1.1
cs

> 7번째 줄에 있는 클래스path의 경우 이후 언급될 app 빌드에 필요한 입력값입니다.



3) Build Tools 버전 맞추기

> SDK쪽 Build Tools가 최신버전이라는 전제조건이 있습니다.

> 기존 프로젝트 설정과 SDK쪽 빌드툴 버전이 동일하면 생략이 가능합니다.



4) sync

Snyc Project with Gradle Files라는 메뉴입니다.

싱크결과가 CONFIGURE SUCCESSFUL in 0s로 떠 있거나

최하단 상태표시에 Gradle build finished가 있으면 기본적인 포팅은 된겁니다.

* 만약 Gradle build가 되지 않는다면 에러메시지에 있는 항목을 복사해서 구글링을 하시면 대응이 가능할것으로 보입니다.


1
2
3
4
5
6
7
8
9
오후 11:17    Gradle sync started
 
오후 11:18    Project setup started
 
오후 11:18    Gradle sync finished in 44s 881ms
 
오후 11:18    Executing tasks: [:app:generateDebugSources]
 
오후 11:18    Gradle build finished in 11s 815ms
cs






2. 빌드


1
2
3
4
5
6
7
#(project_folder)\build.gradle
buildscript {
    ... ... ...
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
    }
}
cs


apk를 빌드하려니깐

[illegalcharacter: '\ufeff']라는 에러로 빌드가 안 됩니다.

에러가 나는 java파일등을 열고, 안드로이드 스튜디오 우측 하단에 있는 인코딩을 UTF-8로 적용후 빌드를 시도하면 정상적으로 될겁니다.






기타. 참조자료


이클립스에서 안드로이드 스튜디오로 프로젝트 임.. : 네이버블로그

안드로이드 스튜디오(Android Studio)에서 이클립스 프로젝트 불러오기(Import Eclipse Project)


이클립스 프로젝트 안드로이드 스튜디오로 마이그레이션 할 때 주의점 · Ringsterz Log





기타. 변경이력


일자

변경이력

2018-05-17

 초안






0. 필요한 파일


파일명

예시 경로

 sdk-tools-windows-3859397.zip

 [#]

 D:\dev_lib\android-sdk-windows\tools


명령줄도구 zip파일 예시경로는
이전의 SDK zip파일 디렉토리 구조를 참조한것으로 최신 SDK에서는 자체 SDK/AVD 매니저가 없습니다.






1. 설치


1) 버전확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(Win PowerShell)
PS D:\dev_lib\android-sdk-windows\tools\bin> ./sdkmanager --list
... ... ...
  build-tools;26.0.3                | 26.0.3       | Android SDK Build-Tools 26.0.3
  build-tools;27.0.0                | 27.0.0       | Android SDK Build-Tools 27
  build-tools;27.0.1                | 27.0.1       | Android SDK Build-Tools 27.0.1
  build-tools;27.0.2                | 27.0.2       | Android SDK Build-Tools 27.0.2
  build-tools;27.0.3                | 27.0.3       | Android SDK Build-Tools 27.0.3
  build-tools;28.0.0-rc1            | 28.0.0 rc1   | Android SDK Build-Tools 28-rc1
... ... ...
  platforms;android-26              | 2            | Android SDK Platform 26
  platforms;android-27              | 1            | Android SDK Platform 27
... ... ...
  system-images;a...s_playstore;x86 | 1            | Google Play Intel x86 Atom Sys...
  tools                             | 26.1.1       | Android SDK Tools
 
Available Updates:
  ID      | Installed | Available
  ------- | -------   | -------
  tools   | 26.0.1    | 26.1.1
done
cs

포스팅 시점(2018-04)에서 아래의 페이지들을 참조하면

SDK Build Tools Release Notes | Android Studio

SDK Tools Release Notes | Android Studio

업데이트시킬 버전이 있지만, 메이저 넘버상 생략했습니다.



2) 플랫폼 설치

아래의 예시처럼

SDK Platform Tools Release Notes | Android Studio

sdkmanager | Android Studio페이지를 참조한 설치명령을 실행하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
PS D:\dev_lib\android-sdk-windows\tools\bin> ./sdkmanager "platform-tools" "platforms;android-27"
Warning: File C:\Users\Cetus202\.android\repositories.cfg could not be loaded.
License android-sdk-license:
---------------------------------------
Terms and Conditions
... ... ...
... ... ...
November 202015
---------------------------------------
Accept? (y/N): y
done
cs


플랫폼 설치후 아래의 캡쳐처럼 확인이 가능합니다.


기본적인 설치는 다 됐습니다.

안드로이드 스튜디오나 VS등에서 제공하는 SDK관리자 메뉴로 추가적인 패키지를 설치&업데이트를 하면 됩니다.






기타. 참조자료


How do I download the Android SDK without downloading Android Studio? - Stack Overflow






기타. 변경이력


일자

변경이력

2018-04-23

 초안

즐겨쓰는 변수 명명 규칙(이하, 네이밍)은

파스칼, 카멜을 섞이서 쓰는중입니다.[#참]


정확히는 클래스가 파스칼형

함수 및 변수가 카멜.

그 외에 세부적인건 조금씩 다를떄도 있지만 현재 사용중인 방식은 아래와 같이 사용중입니다.

(주력 언어가 자바이다보니 포인터에 대한 규칙은 없는 상태.)

 사용중인 네이밍

 boolean

 예.  isBooelanVar

 int

 예.  integerVar   [별도 표식없음]

 float

 예.  floatVar       [별도 표식없음]

 String 예.  msgContentStr
 Array

 예.  contentArr

 Vector

 예. contentVec

 protected var.
 [별도 표식없음]

 전역변수

 예. g_var
 멤버변수

 예.  _thisIsMember

 final 및 constant

 예.  THIS_IS_FINAL
       THIS_IS_CONSTANT


함수 및 클래스
-> 동사+목적어
-> 단어의 경우, 가급적 3~4자짜리 축약어 사용. (함수)
     축약어 자체가 대문자로만 될 경우, 첫글자 이후로 소문자

-> 예시.

함수

클래스

getVal(... ... ...)

getValInt(... ... ...)

getValStr(... ... ...)

setValJson(... ... ...)

setValJSON(... ... ...)

setAPI(... ... ...)

onImgColor(... ... ...)

GallerylAdapter.java

SplashActivity.java

MainActivity.java

GalleryPopup.java

Achieve.java  / AchieveManager.java





* 해당 포스트는 adMobSDK.jar없이 최신 '구글 플레이 라이브러리'로 구글 애드몹(google adMob)을 구현한 예제입니다.






0. 필요한 파일


파일명

예시 경로

 이클립스 [#]

 C:\eclipse
 (Kepler, Luna. 2가지로 테스트 해본결과 상관은 없습니다.)

 ADT [#]

 C:\android-sdk-windows


* JDK 1.6rhk 1.7으로도 정상작동하는거 확인했습니다.






구글 [#애드몹, 한국어 페이지]








2. 이큽립스 세팅


Android SDK Manager를 통해

Android SDK Build-tools와 Google Play services를 아래와 같이 최신버전으로 맞춰줍니다.


!!!주의사항!!!

General>Existing Projects into Workspace가 아니고

Android>Existing Android Code Into Workspace입니다.

경로: C:\android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib






3. XML


① Manifest

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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.analoggreen.testadmob"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
 
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity
            android:name="com.google.android.gms.ads.AdActivity"
            android:theme="@android:style/Theme.Translucent"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
 
        <activity
            android:name="MainActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>


② 레이아웃 XML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000">

      <com.google.android.gms.ads.AdView
          xmlns:ads="http://schemas.android.com/apk/res-auto"
          android:id="@+id/adView"
          ads:adUnitId="ca-app-pub-xxxxxxxxxxxxxxxx"
          ads:adSize="BANNER"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"/>
</LinearLayout>






4. JAVA


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
package com.example.testadmob;
 
import android.app.Activity;
import android.os.Bundle;

mport android.provider.Settings.Secure;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
 
public class MainActivity extends Activity
{
    private AdView adView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     //String deviceid = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
     AdRequest adRequest = new AdRequest.Builder().addTestDevice(deviceid).build();
        adView = (AdView) this.findViewById(R.id.adView);
        adView.loadAd(adRequest);
    }
 
    @Override
    public void onResume()
    {
        super.onResume();
        if (adView != null)    {    adView.resume();    }
    }
 
    @Override
    public void onPause()
    {
        super.onPause();
        if (adView != null)    {    adView.pause();    }
    }
 
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (adView != null)    {    adView.destroy();    }
    }
}
 






기타. 참조자료


시작하기 - Google Mobile Ads SDK — Google Developers

Google Play 서비스 이전 - Google Mobile Ads SDK — Google Developers

도라지 - Dorage: [Unity] [배너/전면] 새로운 AdMob 광고 달기

전면광고 적용 가이드 - 애드몹 100% 즐기기


애드몹 광고 내앱에 추가 방법 - Google Play의 Android 앱


Banner Ad - AdMob Android Guides — Google Developers

Could not find class 'com.google.android.gms.ads.AdView'... - Google 그룹스

eclipse - how to get an android device ID - Stack Overflow






기타. 변경이력


일자

변경이력

2014-11-21

 초안.

2014-11-26

 4. JAVA. 테스트용 디바이스 아이디 관련 추가


'프로그래밍note > JAVA & JDK 계열' 카테고리의 다른 글

안드로이드: SDK 명령어 버전  (0) 2018.04.23
변수 명명 규칙  (0) 2014.11.27
안드로이드: 구글 애드몹  (3) 2014.11.21
JAVA: 맵/콜렉션 선택하기  (0) 2014.09.21
안드로이드: 사용자 정의 탭뷰  (0) 2013.09.26
JAVA: 시간과 날짜  (0) 2013.07.12
  1. 알론소 2015.02.28 01:00

    저 주인장님 ca-app-pub-xxxxxxxxxxx에

    그냥 pub-숫자 를 넣는건가요?

  2. 알론소 2015.06.17 02:03

    즐찾해놓고 항상 보고 있네요
    좋은자료 감사합니다 ^^

  3. 엘리시아 2015.10.08 11:00

    android:value="@integer/google_play_services_version" 이걸 입력하면 빨간줄이 뜨는데 하루종일 해결이 안됩니다. 뭐가 문제일까요?






자료형 선택하기


출처: Guide to Selecting Appropriate Map/Collection in Java






성능별 대조


출처: Performance of Java Collections | Javalobby


Sentio, ergo sum :: HashMap, ArrayList, LinkedList 속도 비교

까오기네집 - 일터 :: 컬렉션 클래스들의 성능 속성

깐순이 : [JAVA/자바] 컬렉션 클래스들의 성능 속성..

'프로그래밍note > JAVA & JDK 계열' 카테고리의 다른 글

변수 명명 규칙  (0) 2014.11.27
안드로이드: 구글 애드몹  (3) 2014.11.21
JAVA: 맵/콜렉션 선택하기  (0) 2014.09.21
안드로이드: 사용자 정의 탭뷰  (0) 2013.09.26
JAVA: 시간과 날짜  (0) 2013.07.12
안드로이드: 기초정리(4)  (0) 2012.10.25



안드로이드 자체에 기본 탭뷰가 있긴 하지만, 탭뷰 버튼에 추가적인 기능을 넣는게 어렵거나 제약이 많습니다.

버튼과 수평 스크롤을 이용한 수동적인 탭뷰로 구현할수도 있겠지만,

탭뷰의 특성중 '선택중인 버튼 색상 변화'에서 손이 더 가게 되죠.


알려드릴 방법은 XML을 이용해 JAVA코드에서 별도로 터치된 버튼에 맞게 색상이 바뀌게 코드를 작성할 필요가 없습니다.






0. 예시 환경


 IDE

 ADT

 (Build: v22.2.1-833290)

 안드로이드 SDK

 adt-bundle-windows-x86-20130917.zip

 android:minSdkVersion

 10

 Android SDK Build-tools 16






1. 구현


 ① res/drawable/tab_button.xml

-> 터치입력 상태 fa

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">


    <item android:drawable="@drawable/tab_bg" android:state_selected="true"/>

    <item android:drawable="@drawable/tab_bg" android:state_focused="true"/>

    <item android:drawable="@drawable/tab_bg" android:state_pressed="true"/>

    <item android:drawable="@drawable/tab_select"/>


</selector>


 ② res/layout/layout_tab.xml

... ... ...

    <View

        android:id="@+id/custom_tab0"

        android:background="@drawable/tab_button"

        android:layout_width="100dp"

        android:layout_height="50dp" />

... ... ...


 ③ .java

... ... ...

package com.analoggreen.customedtab;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;


public class MainActivity extends Activity implements OnClickListener

{

final static int TAB_SET0 = 0;

final static int TAB_SET1 = 1;

final static int TAB_SET2 = 2;

private int selectedTab;

View set_1;

View set_2;

View set_3;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

selectedTab = -1;

set_1 = findViewById(R.id.custom_tab0);

set_1.setOnClickListener(this);

set_1.setSelected(selectedTab == TAB_SET0);

... ... ...

}


@Override

public void onClick(View v)

{

switch(v.getId())

{

case R.id.custom_tab0 :

setTab(0);

break;

... ... ...

}

}

private void setTab(int tab)

{//해당 함수로 안 넘어오면 탭의 클릭이 유지되지 않는다.

if(selectedTab == tab)

{

return;

}

selectedTab = tab;

set_1 = findViewById(R.id.custom_tab0);

set_1.setSelected(selectedTab == TAB_SET0);

... ... ...

}

}

... ... ...






2. 예제 파일







기타.


혹시나 싶어

android:state_selected="true"등으로 검색하니깐,

아라비안나이트 :: 안드로이드/Android XML Selector 사용 하기

닉스로그 :: android 에서 xml 을 이용해 이미지 전환 효과주기

같은 결과들이 나오는군요.


어떤 코드/방식이건 프로그래머가 응용하기 나름같습니다.






0. 환경


* 해당 포스팅은 아래와 같은 환경 기준으로 작성되었습니다.

이클립스 케플러

JDK 1.7.0_17 & JRE 7


* 이전까지 간단한 디지털 시계등에서 Date클래스로 getHours()나 getMinutes()등등을 사용했지만, 이 함수들은 Deprecated함수여서 경고가 뜨는데다가 가급적 안 쓰는게 좋습니다. 최근에 서버 프로그램도 작업하면서 안정성을 위해 이 경고가 안 뜨게 작업한 방법을 메모 하겠습니다.






1. 샘플코드


import java.util.Calendar;

import java.util.GregorianCalendar;


public class Main

{

// private static Date date = null;<---관련 함수들이 deprecated

private static Calendar calendar1 = null;

private static Calendar calendar2 = null;

//==================================================

// GET & SET

//==================================================

private static void setTime()

{

System.out.print("new GregorianCalendar()\n");

calendar1 = new GregorianCalendar();//그레고리력

int month1 = calendar1.get(Calendar.DAY_OF_MONTH);

int day_week1 = calendar1.get(Calendar.DAY_OF_WEEK);

int hour1 = calendar1.get(Calendar.HOUR);

int min1 = calendar1.get(Calendar.MINUTE);

int sec1 = calendar1.get(Calendar.SECOND);

System.out.print(month1 + "월 " + setDayWeek(day_week1) + "\n" + hour1 + "시 " + min1 + "분 " + sec1 + "초.\n\n");

System.out.print("Calendar.getInstance()\n");

calendar2 = Calendar.getInstance();

int month2 = calendar2.get(Calendar.DAY_OF_MONTH);

int day_week2 = calendar2.get(Calendar.DAY_OF_WEEK);

int hour2 = calendar2.get(Calendar.HOUR);

int min2 = calendar2.get(Calendar.MINUTE);

int sec2 = calendar2.get(Calendar.SECOND);

System.out.print(month2 + "월 " + setDayWeek(day_week2) + "\n" + hour2 + "시 " + min2 + "분 " + sec2 + "초.\n");

}

private static String setDayWeek(int day_week)

{

String result = null;

switch (day_week)

{

case Calendar.SUNDAY:

result = "일요일";

break;

case Calendar.MONDAY:

result = "월요일";

break;

case Calendar.TUESDAY:

result = "화요일";

break;

case Calendar.WEDNESDAY:

result = "수요일";

break;

case Calendar.THURSDAY:

result = "목요일";

break;

case Calendar.FRIDAY:

result = "금요일";

break;

case Calendar.SATURDAY:

result = "토요일";

break;

}

return result;

}

//==================================================

// MAIN

//==================================================

public static void main(String[] msg)

{

setTime();

}

}





Android APIs Reference


안드로이드: 기초정리(1)

안드로이드: 기초정리(2)

안드로이드: 기초정리(3)

안드로이드: 기초정리(4)


추천자료: 안드로이드 개발시 100가지 팁

추천자료: [Android] 정보 정리






09. 구글맵과 좌표


Bohemian life :: 구글맵에 마커 표시하기(위치 지정)

구글맵에서 현재위치에 마커 표시하기. :: 네이버 블로그






10. 스레드

 1. 

Thread()

Thread(Runnable runnable)

-> JAVA: 스레드 참조.


* 허니컴부터는 메인스레드에 NW연결을 넣으면 에러가 나기때문에

별도로 Runnable를 정의 하고 스레드에 넣어서 실행하거나, AsyncTask를 상속받은 클래스를 만들어서 해당 클래스 객체를 생성 시키면 됩니다.(UsrAsynk synk = new AsyncTask()처럼)





11. 마크업 문서

 1. 마크업 문서와 HTML

① 마크업 문서란?

마크업 문서 = 내용 + 구조 + 스타일

-> 내용: 실제 문서내용

-> 구조: 문서 구성 정보(제목, 장, 절 각주, 문단 등)

-> 스타일: 문서 표현 정보(글꼴, 글자색, 글자 크기, 여백 등)

② HTML(Hyper Text Markup Language)

-> 웹에서 정보를 표현할 목적으로 제안된 마크업 언어

-> 장점.

     단순한 구조 / 사용의 편리성 / 시스템에 독립적인 웹 브라우저에 의해 해석

-> 단점.

     사용할 수 있는 태그가 제한적 / 정보 표현에만 집중된 기능. / 전체 문서 표현만 가능

     구조화된 정보를 표현/검색, 문서 유효성 검증 어려움

③ XML

-> 미니 데이터 베이스

-> 다른 DBMS에 비해 수월한 데이터 통합

-> 사용환경에 구애되지 않고 사용가능.




 2. XML 개념과 성향

① 기본개념

-> 구조적인 데이터로 표현하여 작성한다. 

-> HTML과 비슷해 보이지만 다르다.

-> 텍스트지만, 읽는 것만 의미하지는 않는다. 

-> 확장할 수 있다. 

-> 기술의 집합이다.

-> 새로운 기술이 아니라, 발전한 기술이다.

-> HTML에서 XHTML로 이끌었다.

-> 모듈식이다.

-> RDF와 시맨틱 웹의 토대다.

-> 라이센스 제약이 없고, 플랫폼 독립적

② 설계 목표

-> 인터넷에서 바로 사용할 수 있어야 한다 

-> 다양한 종류의 애플리케이션을 지원해야 한다. 

-> SGML과 호환되어야 한다. 

-> 문서를 처리하는 프로그램은 사용하기 쉬워야 한다. 

-> 옵션은 최소여야 한다. 

-> 문서는 쉬워야 한다. 

-> 설계는 빠르게 할 수 있어야 한다. 

-> 설계는 정형적이고 간결해야 한다. 

-> 문서는 만들기 쉬워야 한다. 

-> 간결성은 무시될 수 있다.




 3. 구조

<?xml version="1.0" encoding="euc-kr" standalone="yes" ?>     <!--  XML문서 선언부  --> 

<user_profile xmlns="xml_name_space">     <!-- 이 줄부터 사용자 정의 요소, xmlns로 네임스페이스 지정O-->

    <name>리혜</name> 

    <blog>노력과 삽질 퇴적물</blog> 

    <url>http://analog-green.tistory.com/</url>

    <m1:memo>XML요소내 내용에는 특수문자가 불가하므로 개체참조/문자참조를 써야 한다.<br>

        <![CDATA[  CDDATA 명령어 섹션은 해당 범위내에서

           특수문자 < > ' " &등을 여러개 쓰기 편하다.

        ]]>   

    </m1:memo>

    <m2:memo>해당메모는 접두사를 이용한 예시</m2:memo>

    <content m3:id="memo_03">해당메모는 XML요소 속성에 ID를 부여</content>

</user_profile>




 4. 설계

1단계: 표현하려는 객체를 선택한다.

2단계: 객체 분석과 모델링을 통해 요소(element)를 추출해서 정의/분석한다. 

3단계: 분석된 객체 정보로 트리를 만들고 요소에 대한 정형화된 데이터를 작성한다. 

4단계: 분석된 정보를 나타내는 요소명과 속성명을 구분해서 정의한다. 

5단계: 설계한 트리를 보고 XML로 코딩.






12. XML파싱

 1. DOM파싱

① XML 문서를 읽음.

② XML 파서로 문서 트리 구조로 변환.

③ DOM API를 사용해서 XML 문서의 요소/속성/텍스트 내용을 추출후 XML 문서를 조작.(XML 문서 추가, 삭제, 수정 등).

④ 조작한 XML 문서를 애플리케이션에 따라서 생성, 수정, 삭제한 후 결과 문서를 만든다.

 2. 개념

-> DOM은 XML 문서를 하나의 객체 모델로 인식

-> 각 객체를 인터페이스 개념으로 접근

-> 외부 애플리케이션은 객체에 정의된 인터페이스를 통해 해당 객체를 제어

-> 노드 클래스(객체) = 인스턴스1 + 인스턴스2     //인스턴스는 객체 소속 하위클래스

-> 장점과 단점.

     장점: DOM은 XML 문서를 객체트리구조로 다루기 때문에 XML 전체문서를 읽어 들여조작하는 경우 편리다.

     단점: XML 문서가 커질경우에는 메모리 소모가 커진다.

 3. 조작 및 I/O
1)조작

① DOM의 노드들에 대한 인터페이스 속성(타입/이름/값)

② 노드정보에 대한 메소드

③ XML문서에 대한 메소드

④ XML문서 요소에 대한 메소드

등등.

2)I/O

① 자바기반 I/O

XML문서 → 버퍼(스트림) → XML문서

② DOM API기반 I/O

XML문서 → 버퍼(2진 트리) → XML문서

3) 예제

추천링크.

[Android/안드로이드] DOM Parser ( 돔 파서 ) :: 돼지왕왕돼지의 놀이터

Android XML Parsing Tutorial(androidhive)




 2. SAX (Simple API for XML) 파싱

http://www.saxproject.org

http://sax.sourceforge.net


-> 큰 규모의 XML 문서를 분석하기 위해 개발된 파싱법. Serial Access Method로도 불린다.

-> 메모리를 적게 사용하면서 대용량의 XML 문서를 처리하기위해 제안된 API

-> 이벤트기반 API로써 SAX 파서가 XML 문서를 처음부터 끝까지 차례로 읽어가면서 이벤트를 발생시켜 처리하는 구조

① SAX 파서 종류

Xerces-J 아파치그룹(Apache)에서 만듬

Crimpson 자바(sun) 공식 파서

Oracle Oracle회사의 Parser

XP James clerk가 만듬

② 이벤트 소스와 핸들러구조

-> 파서는 XMLReader 인터페이스를  구현하며 이 인터페이스가 제공하는 parse()메소드로 파싱을 시작한다.

-> SAX Parser가 XML 문서 해석도중 시작태그를 만나면 startElement이벤트가발생하고 , 문자데이타를 만나면 characters 이벤트가 발생한다. 그리고 끝태그를 만나면 endElement이벤트를 발생시킨다.

③ 이벤트 핸들어 작성법

-> ContentHandler, DTDHandler, EntityResolver, ErrorHander 인터페이스를 구현하는 클래스 작성

-> 이벤트 핸들러 클래스 SAX 파서에 등록

-> XMLReader 인터페이스의 메쏘드를 이용하여 SAX Parser에등록.


* 참고로 DefaultHandler클래스는ContentHandler, DTDHandler, EntityResolver,ErrorHander 인터페이스의 메쏘드를 모두 오버라이딩(재정의)한 클래스라서 개발자들은 DefaultHandler를 상속받아 필요한 메소드만 구현하면된다.

//SAXParser 예시

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SAXParserTest

{

public static void main(String[] args)throws Exception

{

//① . SAX 파서 공장 생성

SAXParserFactory factory = SAXParserFactory.newInstance();


//② . SAX 파서 생성

SAXParser parser = factory.newSAXParser();

System.out.println("SAX 파서 객체 생성 성공");


//③ . 이벤트핸들러생성

SAXParserTestHandler handler =new SAXParserTestHandler();


//④ . 파서에 이벤트핸들러등록 및 파싱

parser.parse("student.xml", handler);

}

}

 예제.

Android: Simple XML SAX Parser Tutorial » the Open Tutorials

Android XML SAX Parser Example
[Android/안드로이드] SAX Parser ( 삭스 파서 ) :: 돼지왕왕돼지의 놀이터
행복 만들기 :: 알면 편리한 SAX Parser






13. 애니메이션

 1. 트위닝 애니메이션

① xml, 애니메이션 속성정의

② java코드, 애니메이션 구현/설정

③ java코드, loadAnimation()

④ java코드, startAnimation()

⑤ java코드, AnimationListener

-> 추천자료: [안드로이드] 에니메이션 처리하기






 2. 프레임 애니메이션








14. 그외


GCM 푸쉬 클라/서버 구현

안드로이드 GCM 이용과 Third party(jsp) 가이드 - 1부

안드로이드 GCM 이용과 Third party(jsp) 가이드 - 2

안드로이드 GCM 이용과 Third party(jsp) 가이드 - 3

Android APIs Reference


안드로이드: 기초정리(1)

안드로이드: 기초정리(2)

안드로이드: 기초정리(3)

안드로이드: 기초정리(4)


추천자료: 안드로이드 개발시 100가지 팁

추천자료: [Android] 정보 정리






07. 알림창

 1. 토스트

 토스트를 띄우는 코드는 크게 2가지가 가능하다.
-> 유형1.

Toast.makeText(getApplicationContext(), "토스트 알림", Toast.LENGTH_LONG).show();

-> 유형2.

Toast toast = Toast.makeText(getApplicationContext(), "토스트 알림", Toast.LENGTH_LONG);

toast.show();




 2. 상태알림(notification)과 해지

① res/layout

... ... ...

    <Button

        android:id="@+id/registerB"

        android:layout_width="match_parent"

        ... ... ...

        android:onClick="xxxx"

        android:text="notification 등록" />


    <Button

        android:id="@+id/cancleB"

        android:layout_width="match_parent"

        ... ... ...

        android:layout_marginTop="50dip"

        android:onClick="xxxx"

        android:text="notification 취소" />

... ... ...

② src/패키지






 3. 다이얼로그

new AlertDialog.Builder(액티비티명.this)

.setTitle("알림창")

//.setIcon(R.drawable.icon)

.setMessage("이 메시지는 영국에서 시작ㄷ... 아니 안드로이드 스타일 알림창입니다.")

.setPositiveButton("OK", null)

.setNegativeButton("취소", null)

.show(); //or .create()

-> show메서드는 대화상자의 운영까지 책임지진 않는다.






08. 서비스

 1. 개념 및 기본실행

① 기본 개념

-> 특정 액티비티와 상관없이 백그라운드에서 실행되는 컴포넌트

public class MainActivity extends Activity implements ...

{

... ...

   Intent intent = new Intent();

   intent.setClass(getApplicationContext(),

                          CustomedService.class);

   intent.putExtra("Tag_NAME", "message");

   startService(intent);   //stopService(intent);

... ...

}

public class CustomedService extends Service

{

   ... ...

   public void onCreate() {

   Thread t=new Thread(){

         public void run() {   }

      };

   t.start();

   }

   public void onDestroy() {   }

   ... ...

}

② 생명주기

->유형A

i) onCreate(): 서비스가 생성될때 호출

ii) onStart(): startService()에 의해 서비스가 시작될 때마다 호출

iii) onDestroy(): 서비스가 종료될때호출


-> 유형B

i) onCreate(): 서비스가 생성될때 호출

ii) onBind(): startService()에 의해 서비스가 시작될 때마다 호출

iii) onUnbind(): 서비스와 연결이 끊겼을때호출

iv) onDestroy(): 서비스가 종료될때호출

 





 2. 구현 예시

-> 

① 


② 







08. 뷰와 고급그리기

 1. View

-> View 위에 뭔가를 그리기 위해선 View를 상속한 클래스를 만들고, onDraw()를 오버라이딩해서 그 안에 원하는 작업을 넣고, invalidate()를 호출하면 화면이 갱신됩니다.




http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=443

http://blog.daum.net/aero2k/14




 2. 웹뷰 클라이언트(WebViewClient)

① res/layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >


    <WebView

        android:id="@+id/androidWebView"

        ... ... ...

        ... ... ... />


</RelativeLayout>

② src/패키지






 3. 탭뷰

-> 해당 구현법은 다른블로그에 정리가 잘 되어 있어서 해당 링크로 대체합니다.

 안드로이드(android) 탭(TabActivity) 3가지 구현하기(By. 녹두장군)




 4. 카메리와 이미지뷰

① res/layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >


    <ImageView

        android:id="@+id/imageView1"

        ... ... ...

        android:src="@android:drawable/ic_menu_crop" />


    <Button

        android:id="@+id/takePicture"

        ... ... ...

        android:onClick="getCaptureView"

        android:text="안드로이드 카메라&amp;이미지뷰" />


</RelativeLayout>

② src/패키지

-> 버튼 컴포넌트에 이벤트함수를 직접 연견했기 때문에 java코드에서 별도로 버튼클릭에 대한 지정은 없다.






 5. SurfaceView

-> View를 상속받은 SurfaceView는  SurfaceHolder.lockCanvas()와 SurfaceHolder.unlockCanvasAndPost()를 이용하여 화면을 갱신.

-> SurfaceView에 대한 세부설명: http://aroundck.tistory.com/202


① res/layout

② src/CustommedView.java

... ... ...

public class MainActivity extends Activity implements OnTouchListener

{

   CustommedView cusV;


    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ... ...

        cusV = new CustommedView(getApplicationContext());

        setContentView(cusV);       

    }

... ... ...

}

... ... ...

class CustommedView extends SurfaceView implements SurfaceHolder.Callback

{

... ... ...

   //서페이스 뷰는 onDraw메소드를 쓰면 안 된다. (처리 속도가...)

   protected void doDraw(Canvas canvas)

   { ... ... }

}

'프로그래밍note > JAVA & JDK 계열' 카테고리의 다른 글

JAVA: 시간과 날짜  (0) 2013.07.12
안드로이드: 기초정리(4)  (0) 2012.10.25
안드로이드: 기초정리(3)  (0) 2012.09.17
안드로이드: 기초정리(2)  (4) 2012.09.03
안드로이드: 기초정리(1)  (0) 2012.08.28
JAVA: 간단한 응용프로그램  (0) 2012.08.28

+ Recent posts