일전에 자바스크립트에서 URL 인코딩 관련 내용을 포스팅한 적이 있습니다. 

http://jamesdreaming.tistory.com/2

(위 URL 참조)


언급하지 않은 내용중 escape() 함수가 있습니다. 


실질적으로 많이 쓰는 인코딩 및 디코딩 함수는 아래와 같습니다. 


   escape(URI)

   unescape(escapedURI)


   encodeURI(URI)

   decodeURI(encodedURI)


   encodeURIComponent(URI)

   decodeURIComponent(encodeURI)



각각의 함수는 인코딩하는 정도의 차이가 있는데요. 

그 차이점은 아래과 같습니다. 


escape(URI)

- 영문 알파벳과 숫자, 일부 특수 문자(@, *, -, _, +, / 등등)을 제외하고 모두 인코딩

- 1바이트 문자 -> %XX 형식으로 변환

- 2바이트 문자 -> %uXXXX 형식으로 변환


encodeURI(URI)

- 인터넷 주소에 사용되는 일부 특수 문자(:, ;, /, =, ?, &)는 변환하지 않음 


encodeURIComponent(URI)

- 알파벳과 숫자를 제외한 모든 문자를 인코딩 

- UTF-8 인코딩과 동일



결과는 다르지만 인코딩이라는 동일한 역할을 하는 함수들인데요, 

현재는 encodeURIComponent(URI) 함수를 가장 많이 사용하고 있습니다. 


escape 같은 경우에는 + 기호를 인코딩 하지 않기 때문에 약간의 문제가 발생하고 있습니다. 

그래서 최근엔 운영 환경에서 escape 를 사용하지 않습니다. 





블로그 이미지

쉬운코딩이최고

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

,

자바스크립트(javascript)를 이용하면 현재 화면에서 뒤로가기, 앞으로가기, 앞뒤 원하는 칸만큼 이동하기, 화면 리로드 하기 등등의 기능을 사용할 수 있습니다. 


이를 가능하게 하는 것이 바로 javascript 의 History Object 입니다. 

History Object 는 웹 브라우저 상에서 사용자가 방문한 URL 정보를 가지고 있습니다. 

History Object 는 Window Object의 한 부분으로 window.history 속성을 통해 접근 가능합니다. 여기서 window. 은 생략되어도 무관합니다. 


■ 뒤로가기 

<a href="javascript:history.back();">뒤로가기</a>

window.history.back(); 함수 사용


위와 같이 a tag 의 href 속성에 바로 history.back() 호출 하는 방법도 있지만 아래와 같이 다른 방법들을 사용 할 수 있습니다. 


<script type="text/javascript">

function goBack(){
window.history.back();
}

</script>

<input type="button" value="뒤로가기" onclick="goBack();" />
<a href="goBack();">뒤로가기</a>
<a href="#" onclick="goBack();">뒤로가기</a>

goBack() 이라는 스크립트 함수를 만들고 여기에 window.history.back(); 또는 history.back(); 을 선언하여 원하는 history back 이벤트를 발생 시킬수 있습니다. 

input tag 및 a tag 두가지 모두 동일 동작을 하게 됩니다. 



■ 앞으로가기 

<a href="javascript:history.forward();">앞으로 가기</a>

window.history.forward(); 함수 사용


뒤로 가기와 마찬가지로 앞으로 가기도 여러가지 방식으로 처리 가능합니다. 

<script type="text/javascript">

function goForward(){
window.history.forward();
}

</script>

<input type="button" value="앞으로 가기" onclick="goForward();" />
<a href="goForward();">앞으로 가기</a>
<a href="#" onclick="goForward();">앞으로 가기</a>



■ 원하는 페이지 수만큼 이동하기

<script type="text/javascript">

function goForward(){
window.history.go(2);
}
function goBack(){
window.history.go(-3);
}

</script>

<button onclick="goForward()">두페이지 앞으로이동</button>
<button onclick="goBack()">두페이지 뒤로이동</button>

window.history.go(); 함수 사용


go() 함수에 인자값을 추가 하여 이동하고자 하는 방향 및 페이지 수를 결정 할 수 있습니다. 

go(1) 과 같이 1 이상의 number 값을 입력 시 앞으로 이동하게 되고 

go(-1) 과 같이 -1 이하의 number 값을 입력 시 뒤로 이동하게 됩니다. 


number 대신에 URL string 을 입력하여 해당 URL로 이동하는데 사용하기도 합니다. 다만, 모든 브라우저를 지원 하는 것이 아니므로 원하는 페이지로의 이동을 하시려면 

window.location.href='jamesdreaming.tistory.com';

위와 같이 window.location.href 를 사용하시는게 좋습니다. 



■ 리로드

<a href="javascript:location.reload();">리로드</a>

window.location.reload(); 함수 사용



■ History stack count

var numberOfHistoryEntries = window.history.length;

window.history.length 를 사용하여 history stack 에 쌓여 있는 URL 정보 갯수를 가져 올 수 있습니다. 



블로그 이미지

쉬운코딩이최고

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

,

[ 추천앱 ] 허니스크린 (잠금화면 리워드 앱)



이번에 추천할 앱은 허니스크린 이라는 이름을 가진 녀석입니다. 

최근 몇년간 캐시슬라이드를 사용했었는데요. 우연한 기회에 허니스크린을 접하게 되었습니다. 


개발자로써 궁금한건 못참고 바로 다운받아서 사용해봤습니다. 

이름만 봐도 잠금화면 리워드 앱 이라는 것은 금방 아실 수 있을꺼예요.

물론 캐시슬라이드와 캐시 적립은 동일한 방식 입니다. 

하지만 단가가!!! 캐시 슬라이드는 평균 2원 정도 인데요. 허니스크린은 최대 10원까지 14원까지 획득 해봤습니다. (물론 잠금 해제만으로 획득 한 포인트 입니다)


당분간은 캐시슬라이드 잠시 사용중지 하고 허니스크린 사용해보려고 합니다. 


아래는 허니스크린 공식 안내문입니다. 


▼▼▼▼▼


캐시 적립부터 유용한 콘텐츠까지, 돈버는 앱 '허니스크린'(Android 지원)

http://yimay.kr/t490bomqzo


글로벌 천만 유저가 선택한 잠금화면 속 꿀캐시

허니스크린은 캐시 적립부터 유용한 콘텐츠까지

알뜰하고 알찬 혜택을 제공하는 잠금화면 리워드앱입니다. 


[캐시 모으는 방법]

1. 잠금 화면을 쓱 밀어 가볍게 적립하기

2. 관심 있는 광고는 자세히 보고 추가로 적립하기

3. 추천하는 앱을 설치하거나 브랜드 소셜페이지를 팔로우·좋아요하고 적립하기

4. 친구에게 추천하고 동시에 둘 다 적립하기


[적립한 캐시 사용법]

1. 스타벅스·투썸플레이스·이디야 등 11곳의 카페에서 사용하세요.

2. 버거킹·KFC·뚜레쥬르·파리바게트 등 34곳의 프렌차이즈에서 사용 가능합니다.

3. GS25·CU·세븐일레븐 편의점에서 사용할 수 있습니다.

4. 해피머니·팀캐시·문화상품권으로 유료 아이템을 구매하여 게임도 즐겨보세요.

5. CGV·레진코믹스·지니 등 영화·웹툰·음원도 구매해보세요.

6. 그 외 백화점·소셜 커머스·통신사·기부 단체 등 약 70개의 스토어를 이용하세요.

7. 물론 환급 요청을 통해 통장으로 현금을 입금 받을 수 있습니다.





블로그 이미지

쉬운코딩이최고

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

,

[ 추천앱 ] 헤이딜러 




이번에 추천할 앱은 헤이 딜러라는 내 차 중고 판매 앱입니다. 

일반적인 중고차 판매 앱들의 경우 특정 딜러가 해당 차량에 대해 가격을 매기기 때문에 차주 입장에서는 여기저기 많은 앱을 다운 받아 판매 가격 딜을 하게 됩니다. 


하지만 이번에 추천하는 앱은 기존의 앱들과 다른 성향을 가지고 있습니다. 


딜러가 견적제시한 가격으로 결정 되는 것이 아니라 전국 1천여명의 딜러가 가격을 제시하고 차주가 그중 합리적인 가격을 선택하는 방식입니다. 

그만큼 내 차를 원하는 가격에 판매하기 쉬워 지겠죠.


아래는 헤이딜러 공식 안내 문구 입니다. 참조하세요.


▼▼▼▼▼


내 차 어떻게 제값 받고 팔지 고민이라면, 이 앱 써보세요(Android지원, iOS 지원)

http://yimay.kr/t490bu0avy


'내차팔때, 제값에 판매한다’


헤이딜러는 전국딜러 비교가 가능한 모바일 플랫폼으로, 엄선된 회원딜러들과 엄격한 정책을 바탕으로 고객중심적으로 운영하고 있습니다. 

전국민이 내차를 제값에 파는 서비스가 되기위해 열심히 노력하겠습니다. 

(iOS, Android 지원)


경매결과 둘러보기 : 최근 50개 경매결과 둘러보기

견적요청 하기 : 사진 5장, 차량정보 8가지로 중고차 경매 간편신청

전국딜러 견적받기 : 48시간동안 평균 9개의 비교견적 받기

원하는 딜러선택 : 제시가격/고객후기로 딜러 1명 선택

헤이딜러 안심중개 : 헤이딜러 본사에서 견적확인 후 딜러연결

집앞에서 거래 : 출장방문 후 차량최종 확인 및 거래

명의이전 : 48시간 내 명의이전(평균 업무일 기준 24시간)


*시럽드라이브 맴버쉽 회원 포인트 지급, OK캐쉬백 회원 포인트 지급

*중고 화물차/특장차/버스 등 모든 차차차 매매가능

*SK엔카 직영, 유카 직영 등 기업형 중고차 업체, 엠파크, 국민 KB차차차 매매단지 딜러 등 전국 1,000여명의 딜러가 활발한 경매참여 중


 






블로그 이미지

쉬운코딩이최고

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

,

웹 페이지 개발 중 특정 HTML 요소에 onClick 이벤트를 발생 시 이미지 변경 또는 특정 효과를 주기 위해 class 를 추가 제거 하는 상황들이 많이 발생하게 됩니다. 


물론 큰 사이트 개발이나 유지 보수를 하는 경우라면 개발자 입장에서는 위와 같은 경우를 컨트롤 할 필요가 거의 없습니다. UI / UX 개발 담당자들 또는 퍼블리셔들이 이미 해당 HTML 요소(Check box, Radio box 등등)의 click 이벤트에 대해 처리를 해두었기 때문입니다. 


하지만 소규모 프로젝트에서 일반적으로 퍼블을 전달 받았을때 스크립트 적용은 되어 있지 않은 경우가 거의 대부분입니다. 


그렇다면 HTML 요소의 class 변경을 어떻게 해야 할까요? 

<input id="chkBox" type="checkbox" class="on"
onclick="javascript:chkBoxImageChange();" checked/>

위 코드는 간단한 체크 박스를 표기 합니다. 


기본 checked / unchecked 이미지를 사용 하지 않습니다.  

class 명이 on 일경우 check 된 스타일의 이미지를 입히고, 

class 명이 빈값일 경우 unchecked 된 스타일의 이미지를 입힌다고 가정 하겠습니다. 


chkBoxImageChange() 함수는 아래와 같이 작성하면 됩니다. 

<script type="text/javascript">

window.chkBoxImageChange = function() {
if(document.getElementById('chkBox').getAttribute('class') == 'on')
{
document.getElementById('chkBox').setAttribute('class', '');
} else {
document.getElementById('chkBox').setAttribute('class', 'on');
};
};

</script>


class 명이 on 이면 id 값이 chkBox 인 요소의 속성 값 중 class 를 빈값으로 바꾸고 

class 명이 빈값이면 id 값이 chkBox 인 요소의 속성 값 중 class 를 on 으로 바꾸는 코드 입니다. 



위와 같이 작성 할 수 있지만 HTML5 에서는 위와 같은 수고스러움을 모두 덜어 주고 있습니다. 

<script type="text/javascript">

window.fncShowHideList = function() {
document.getElementById('chkBox').classList.toggle('on');
};

</script>

HTML5에서는 classList 라는 속성을 제공하고 있는데요. 이녀석은 class 값을 더욱 쉽게 가지고 놀수 있도록 도와 주고 있습니다. 


classList.toggle('class명') 이라고 작성 했을 경우 class명이 존재 하면 삭제를 하고 존재하지 않을 경우 추가를 하는 동작을 합니다. 


jQuery 의 toggle 과 동일한 동작을 하는 거죠. 다만 jQeury 는 사용하기 위해 Library 를 추가 해야 하지만 HTML5 는 그럴 필요가 없다는 겁니다. 



Element.classList 사용 예를 추가로 보여드리겠습니다. 

div.classList.remove("foo");
div.classList.add("newclass");

<div> 태그 class 명에 foo 값이 있으면 제거하고 newclass 라는 class 명을 추가 합니다. 


div.classList.toggle("visible");

첫 샘플에서는 getElementById('id') 로 해당 ID값에 대해 class 추가 / 삭제 여부를 결정 했다면 이번에는 <div> 태그 전체에서 class 명 중 visible 있으면 삭제하고 없으면 추가 하는 명령입니다. 


div.classList.toggle("visible", i < 10 );

for loop 이나 while loop 을 돌리고 있을 경우 i 값으로 카운트 한다고 가정했을때 i 값이 10보자 작을 경우에만 class 명이 visible 이 있으면 삭제하고 없으면 추가 하는 명령입니다. i 값이 10보다 커지면 아무 동작 하지 않습니다. 


alert(div.classList.contains("foo"));

contains 라는 함수가 보이는 데요. 이는 foo 라는 class 명이 있으면 true 를 리턴하고 없으면 false 를 리턴합니다. 


div.classList.add("foo", "bar");
div.classList.remove("foo", "bar");

class 명을 , 로 구분하여 한번에 여러 class 명을 추가 / 삭제 하는 명령입니다. 



IE 10 에서는 동작하지 않는 다는 글이 있습니다. (제가 테스트 해보지는 못했습니다. 테스트 후 확인 되면 명확하게 내용 추가 하도록 하겠습니다. )

그래서 PC 환경에서는 적용하기 약간은 부담이 될 수도 있지만 모바일 환경이라면 마음 놓고 사용하셔도 문제 없을 것 같습니다. 

블로그 이미지

쉬운코딩이최고

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

,

 

■ 구글 애널리틱스(Google Analytics) 란?

 

구글 애널리틱스는 사이트에 방문하는 방문자들에 대하여 나이, 접속시간, 방문후 머문시간, 이동 페이지 경로, 접속 국가 등의 방대한 데이터를 수집 분석 하는 역할을 해주는 도구로 사이트 운영에 엄청난 도움을 주는 도구 입니다. 

 


■ 티스토리에 구글 애널리틱스 연동하기

 

1. 구글 계정은 필수 이므로 꼭 생성하셔야 합니다. 

 

2. 구글 애널리틱스 오피셜 사이트로 이동 하여 우측상단 로그인을 클릭하여 구글 계정으로 로그인 합니다. 

 

구글 애널리틱스 오피셜 사이트로 이동 <<< 클릭 하여 이동하기




3. 구글 애널리틱스 가입하기를 클릭 하여 가입합니다. 



4. 새 계정정보를 입력 하고 추적ID 가져오기를 합니다. 

   이때 중요한건 웹사이트 URL 은 본인 사이트를 입력해야 합니다. 

   나머지는 편한데로 입력 하시면 됩니다. 



5. 데이터 공유 옵션은 전부 체크된 상태로 추적ID 가져오기 버튼을 클릭합니다. 



6. 서비스 약관 동의 절차 진행 합니다. 



7. 추적 ID 및 추적 코드를 가져옵니다. 


여기서 부터 두가지 옵션이 있습니다. 



8-1. 티스토리 플러그인 기능 이용하기 


첫번째는 티스토리에서 제공하고 있는 플러그인기능을 이용하여 구글 애널리틱스를 연결하는 방법입니다. 

이를 위해서는 7번 이미지에서 Option 1 추적ID 가 필요 합니다. 



추적ID 를 입력하고 저장하면 끝입니다. 



8-2. 추적 코드를 HTML 코드에 삽입하기 


두번째는 HTML/CSS 편집 기능을 이용하여 추적 코드를 직접 삽입하여 구글 애널리틱스에 연결하는 방법입니다. 

이를 위해서는 7번 이미지에서 Option 2 추적 코드가 필요 합니다. 



복사한 추적 코드를 HTML 코드에 삽입합니다. 


코드 삽입 위치와 관련해서 소스 최상단에 추가 하라던지, 또는 body 부에 추가 하라던지 하는 이야기 들이 많이 있는데요. 단지 구글 애널리틱스 연결만을 위한 거라면 위치는 어디라도 상관 없습니다. 


하지만 일반적으로 스크립트를 추가하는 위치는 <head> </head> 사이를 많이 사용하고 있으니 저는 위 이미지와 같이 <head> </head> 사이에 삽입했습니다. 


이렇게 하면 추적 코드 삽이도 완료 입니다. 


참고로 Google Search Console 등 다른 구글 서비스를 이용하기 위해서는 <head> 섹션에 추적 코드를 삽입하는것이 정석입니다. 




플러그인으로 입력 하는 경우 구글 웹마스터와 연동 할 수 없는 관계로 웹마스터를 사용할 계획이 있으신 분들의 경우 추적 코드를 HTML 소스에 삽입 하는 방식으로 구글 애널리틱스를 연동 하시기 바랍니다. 


Google Analytics (구글 애널리틱스)를 이용하여 사이트 관리를 더욱 효율적으로 하실수 있을 겁니다. 

각자 원하는 목표를 향하여 오늘도 화이팅 :)










블로그 이미지

쉬운코딩이최고

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 등의 프로그래밍 언어를 소개 합니다.

,

Adsense 중복계정 문제 해결

 

일반적으로  Adsense 계정 신청은 2 승인까지 받아야 완료가 되며 정상적으로 광고가 노출 됩니다

 

■ Adsense 1차 승인

1 승인은 원하는 사이트를 개설 해당 사이트로 Google Adsense 검토 신청을 하는 과정입니다.

일반적으로 반려가 가장 많은 케이스가 여기서 발생하는데요. 등록 글 수가 충분하지 않거나 성의 없는 글등을 게재시 컨텐츠가 부족하다는 이유로 반려가 됩니다.

이와 관련하여 어떤 식으로 승인 받는지는 여러 포털 사이트에 많이 올라오고 있으니 설명 하지 않겠습니다.



위와 같은 메일을 받으면 1차 승인이 완료 된 것입니다. 


■ Adsense 2차 승인 

2 승인은 컨텐츠의 광고 단위를 생성하여 해당 광고 코드를 신청한 사이트에 등록 하는 작업을 필요로 합니다

역시 광고 단위 생성 신청 방법은 많은 글들이 있으므로 생략 하겠습니다.



 

위와 같은 메일을 받으셨다면 이제 원하는 사이트에 광고가 게재되기 시작했다는 것을 의미 합니다.

 


■ Adsense 중복 계정 오류


하지만 저는 위의 메일을 받는데 자그마치 9개월이 넘게 걸렸습니다.

이유와 해결 방안을 설명 드리겠습니다.

 

우선 제가 보유한 Android 개발자 계정은 A, B 2 입니다.

2 계정 모두 Admob 이용하여 앱에 광고를 게재하고 있는 상태 였습니다.

그리고 B 라는 계정으로 블로그에 광고 게재를 위하여 Adsense 가입 진행을 했습니다.

많은 사이트들에서 가이드 하는 1 승인 절차는 없었습니다.

이때 저는 몰랐지만 Admob 사용하는 시점에서 이미 Adsense 가입이 상태였습니다.

간단히 사이트 등록 바로 광고단위 생성 블로그에 광고 등록을 하였습니다.

 

그리고 아래와 같은 메일을 받게 됩니다.

메일 하나로 저는 장장 9개월간 멘붕 상태에 빠지게 됩니다.

 

내용인즉슨 A 라는 계정과 B 라는 계정이 중복이다, 중복된 Adsense 계정을 소유 없다라는 것인데요.

A라는 계정은 Adsense 계정 신청을 적도 없는데 이게 무슨 소리인가 싶었습니다. 그리고 바로 A 라는 계정으로 로그인하여 Adsense 접속을 했더니… 이런… 가입이 되어 있었습니다.


이때부터 이를 해결하기 위해 미친듯이 구글링을 해보고 Adsense 고객센터를 수도 없이 돌아 다녀 봤지만 케이스에 해당하는 글을 찾지 못했습니다.

여러 사정으로 제대로 알아 보기 힘들기도 했지만 저도 슬슬 지쳐가며 거의 포기 상태에 들어 갔습니다.

그러다 7개월이 지나던 시점에 Admob 가입을 통해 Adsense 자동 가입이 되게 되어 있다는 글을 보게 됩니다.

사실 그전에도 해당 글을 보기는 했지만 그냥 넘어 갔었는데 이때 글이 제게 힌트가 되었습니다.

과감하게 해당 계정에서 배포한 모든 Admob 광고를 중단하고 Adsense 계정 취소 진행 했습니다


한글 사이트에서 직접 취소는 불가능한 상태로 아래 사이트에서 해지 요청서 제출을 하고 기다리면 취소 진행이 됩니다. 


1. 아래 사이트에서 2 애드센스 계정 관련 내용  "해지 요청을 제출 클릭하여 해지 신청 페이지로 이동 하거나 

https://support.google.com/admob/answer/6273540?hl=ko

2. 아래 URL 로 바로 이동 가능합니다. 

https://support.google.com/admob/contact/account_cancel



A 계정에서 받은 Admob 및 Adsense 계정 해지 및 취소 메일

 

그리고 다시 B라는 계정으로 광고 단위 생성 사이트에 게재를 하고 기다렸습니다.

 

결과는 성공!!!

위 두번째 이미지와 같은 기다리고 기다리던 메일이 왔습니다.

모든걸 접어 두고 바로 사이트에 접속했더니 그토록 원하던 광고가 노출되고 있었습니다.

장장 9개월에 걸친 사투 끝에 광고를 게재 했으니 감격 스러웠지만 한편으로는 A 계정으로 돌리던 Admob 삭제한 것이 가슴 아프기도 했습니다.

 

간략하게 케이스를 정리 하자만 아래와 같습니다.

 

  1. A, B 두개의 Admob 광고 게재 계정을 보유 (Adsense 별도 가입 절차 없음)
  2. 하나의 계정으로 Adsense 광고 단위 생성 삽입 중복 계정 오류 메일 받음
  3. Admob 때문이므로 중복 계정 Admob 광고 수입이 적은 쪽을 정리하고 Admob 탈퇴
  4. 광고 단위 생성 삽입 2 승인 메일 기다림 (저는 3 정도 걸렸습니다 -> 광고 단위 세번째 생성 받았습니다)
  5. 승인 메일 받으면 !

 

저와 같은 케이스인 경우도 생각보다 많을 같은데 이와 관련한 해결책을 찾기 힘들어 이렇게 공유 합니다.

많은 분들에게 도움이 되었으면 합니다

블로그 이미지

쉬운코딩이최고

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 등의 프로그래밍 언어를 소개 합니다.

,