팝업 윈도우를 사용하는 이유는 커스텀하게 배경을 넣을때 사용하면 유명함
또한 좌표위치도 조절이 가능하기 때문에 아래나 위로 붙일때 유효하게 사용가능함
아래는 리스트 뷰에서 클릭시에 팝업을 띄워 처리하는 방법을 제시해줌.

http://ememomo.tistory.com/3
저작자 표시
신고

[공식사이트]
android sdk
http://developer.android.com/sdk/index.html

아이콘 생성툴
http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

android library document
http://developer.android.com/reference/packages.html

android 블루투스 정보
http://docs.androidside.com/docs/guide/topics/wireless/bluetooth.html

android 블루투스 chat source
http://developer.android.com/resources/samples/BluetoothChat/index.html

 

[블로그]
android 개발 블로그
http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=2617&page=0

안드로이드 기반 오픈 소스 프로젝트 및 참고 사이트 모음
http://www.androidpub.com/89895


 

안드로이드 강좌 3 - 프로젝트 실행과 디버깅 그리고 단말 세팅
http://www.androidpub.com/764


Expat XML Parser
http://www.hpc.wm.edu/SciClone/documentation/software/misc/expat/reference.html#XML_SetStartElementHandler


sqlite 3 한글 문제 및 사용번 adb devices
http://underclub.tistory.com/260?srchid=BR1http%3A%2F%2Funderclub.tistory.com%2F260


안드로이드 데이트 타임 포멧 형식
http://developer.android.com/reference/android/text/format/DateFormat.html

http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=1521잘되어있음.

 

챠트 그래프 엔진
http://www.achartengine.org/

http://youngik.tistory.com/41?srchid=BR1http%3A%2F%2Fyoungik.tistory.com%2F41


바이오리듬예제
http://www.cocoadev.co.kr/205


안드로이드 디자인 ui 에디터 툴
http://www.androidside.com/page/help/droiddraw.php


안드로이드 버튼 롤오버
http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=11310&page=2


구글 검색
안드로이드 asset db


 sdcard db 쓰고 읽기
http://androcat.egloos.com/1799323


코너를 둥글게 하는 코드가 기재된 사이트를 소개합니다.

   http://stackoverflow.com/questions/1705239/how-should-i-give-images-rounded-corners-in-android
[출처] Android Side - http://www.androidside.com/bbs/board.php?bo_table=B49&wr_id=6954#c_7014

 

커스텀 버튼 만들기 (숫자표시???)
http://blog.cyworld.com/kenur/3865946

테이블레이아웃 TableLayout
http://tigerwoods.tistory.com/12


테이블 모서리 둥글게
http://lomohome.com/317


안드로이드 소켓통신

http://blog.naver.com/west372?Redirect=Log&logNo=80099128812
소켓통신!!!
http://pulsebeat.tistory.com/24
파일전송
http://blog.paran.com/du19s/38833337

C 와 java server 소켓
http://www.javanuri.com/devforum/boardView.jsp?Id=306222&gb=qna&menuId=9


c 와 java servlet
http://dont.pe.kr/tt/25


struts ajax 업로드
http://ant103.egloos.com/tag/%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/page/1


안드로이드 게시판
http://blog.naver.com/PostView.nhn?blogId=q1q3q5&logNo=10095649155

 

[아이폰 개발 sdk] http://developer.apple.com/devcenter/mac/index.action

 

WebView 화면 확대 축소

http://blog.outsider.ne.kr/462

 

3D openGL ES 소개

http://zorg.tistory.com/128

 

 

 

Android NDK 시작하기

http://blog.naver.com/ofking00/120119379228

 

 

Hello Android NDK example

http://micropilot.tistory.com/1522?srchid=BR1http://micropilot.tistory.com/1522

저작자 표시
신고

비동기 소켓이란.

 

동 기 : 소켓이 서로 통신할 때 데이터를 언제 보낼 것인가와 언제 받을 것인가를

알고 있는 경우의 통신. 만약 데이터를 보냈는데 받지 못하는 상황이 발생

하거나 데이터를 받을 준비를 했는데 아무것도 오지 않는 상황이 발생한다면

이로 인해 프로그램이 멈추게 된다. 언제 데이터가 오고 가는지 알고 있어야만

통신이 가능해진다.

비동기 : 서로 통신할 시기를 알지 못하는 경우를 생각해보면 언제 올지 모르는 데이터를

계속 기다리는 것은 비효율적인 작동방식이 된다. 이를 효율적으로 작동시키기 위

해서는 언제 데이터가 오는지는 알 필요 없이 데이터가 왔는지 안 왔는지만 확인해

서 다른 작업을 하다가 데이터가 왔다면 그 때 도착한 데이터를 받아 들인 후 처리

하면 된다.

 

블러킹모드와 넌블러킹모드

 

블러킹모드 : 소켓은 기본적으로 socket()함수를 써서 소켓을 생성하게 되면 블러킹모드로

만들어지게 된다. 블러킹모드에서 send()나 recv()함수를 호출하게 되면 데이

터가 가거나 오지 않는 이상 이 함수는 리턴을 하지 않고 계속 머무르게 되어

있다.

넌블러킹모드: fcntl()함수를 이용하여 소켓을 넌블러킹모드로 만들 수 있다. 이렇게 해서 만

들 경우 소켓은 데이터를 보내거나 받을 시 데이터가 있으면 바로 보내거나

받게 되고 없다면 errno변수(errno.h 헤더에 있다)에 상태를 기록하게 된다.

이 상태변수를 보고 무엇을 할지 결정하면 된다.

 

함수의 블록상태와 넌블럭상태

함수를 호출했을 때 리턴이 되지 않고 어떠한 상태가 될 때까지 무한히 기다리게 되는 경우가 있게되면 이것은 블록킹함수이고 이러한 상태가 없이 어떤 결과든 리턴해주게되는 경우가 넌블럭킹함수이다.

 

 

 

비동기의 방식

 

블록과 넌블록함수는 프로그램의 상태를 말해주는 의미이고 동기와 비동기는 읽기와 쓰기의 상태에 때라 구별되는 개념이다. 동기란 입력과 출력의 상호간에 약속에 의해 동시간에 이루어지는 것이다. 즉 A라는 상대가 1시에 파일을 보내기로 했다면 이것을 받는 B라는 상대도 1시에 정확히 파일을 받는 것을 의미한다. 만약 B가 1시 이전부터 파일을 받으려고 한다면 1시까지는 기다려야 함을 의미하며 B가 1시에 기다리고 있는데 A가 보내지 않는 다면 B는 A가 보낼 때까지 기다려야 함을 의미한다. 비동기는 언제 보내고 언제 받을지를 결정하지 않고 상대가 보낸다는 신호를 받으면 그 때 받는 행동을 하는 것이다. 비동기의 예를 들면 전화나 편지가 있다. 상대가 언제 보낼지 알 수 없고 전화벨이 울리면 그 때 받으면 된다. 전화벨이 울리기 전까지는 다른 일을 해도 된다.

 

비동기의 방식에는 여러가지가 있는데 윈도우와 유닉스의 방식에는 같이 쓸 수 있는 방법이

select()함수를 이용한 방법이 있다. 그리고 윈도우에서 지원해주는 여러가지 함수를 이용해서 다양한 방법을 쓸 수 있다. 리눅스에서는 select()나 poll()함수를 이용하여 만들 수 있는데 이 방법은 엄밀히 말하면 비동기가 아니다. 단지 운영체제가 언제 recv나 send함수를 호출해야 하는 지를 가르쳐주기 때문에 통신은 동기로 이루어 지지만 방식은 비동기에 가깝다. 진정한 비동기 방식은 운영체제에서 프로그램에 인터럽트를 걸고 데이터가 왔다고 알린 후 콜백함수를 등록하여 이를 호출하여 처리되는 식으로 동작할 것이다. 하지만 이런 방식은 구현이 까다롭고 OS에 대해 잘 알고 있어야 하며 select나 poll 방식에 비해 효율적이라고 할 수도 없어서 대부분 다른 방식을 사용한다고 한다.

이런 방식으로 SIGNAL 방식이 있다. 이것은 운영체제에 어떠한 신호를 등록해두고 자신은 다른 일을 하다가 신호가 오면 운영체제가 신호를 받아서 미리 등록해둔 방식으로 동작하도록 하는 것이다. 이 방식은 쓰레드를 써야하며 멀티플렉싱이 이루어 져야 할 때는 모든 소켓을 뒤져야 하므로 poll이나 select 방식에 비해 장점이 없다. 이러한 단점을 극복한 방법으로 REALTIME SIGNAL이라는 방법이 있지만 구현이 까다롭다고 한다.

 

 

 

다중 비동기 소켓 클래스

 

poll방식을 사용하여 비동기방식으로 다중 소켓을 처리할 수 있는 소켓클래스이다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/%BA%F1%B5%BF%B1%E2%BC%D2%C4%CF%BC%AD%B9%F6%C5%AC%B7%A1%BD%BA

이곳에서 구현해놓은 클래스와 예제가 있어서 분석해보았다.

 

파일 리스트를 보면

sock.h // sock클래스 구현 socket의 기본 기능을 구현

sock.cpp

asyncSocket.h // 다중 비동기 통신을 위하여 AsyncSocket클래스 구현

asyncSocket.cpp

log.h // 에러 보고를 위한 함수 선언 헤더

log.cpp

이렇게 있다.

 

Sock 클래스

 

소켓의 기본 기능인 connect나 bind, send등의 함수를 구현해 놓은 클래스이다.

특이점은 처음 connect를 할 때 블러킹되는 것을 방지하기 위하여 fcntl함수를 이용하여

소켓을 넌블러킹모드로 만들었다가 다시 블러킹으로 바꿔준다는 것이다.

그외에는 소켓의 기본 기능이 모두 들어가 있다.

 

AsyncSocket 클래스

 

다중접속을 위해 만들어진 소켓클래스이다. 소켓을 얼마나 열지는 클래스 생성자의 인자를 이용해 줄 수 있다. 언제나 0번 소켓은 서버용으로 사용되고 입력을 받는데 사용된다.

그외의 소켓은 accept함수에서 지정해주는 소켓을 받아서 통신에 사용하게 된다.

 

AsyncSocket클래스는 Sock클래스에서 상속을 받지 않고 다중소켓을 만들기 위하여 Sock개체를 포함하여 다수의 Sock객체를 가지고 있다. poll()함수를 사용하는 함수이기 때문에

apoll() 메소드가 가장 중요한 부분이 된다.

중요한 속성변수로

struct polldf* pFd;

ConInfo* conSock;

Sock * sock;

이 있다. pFd 는 poll함수에서 사용하기 위한 변수로 자세한 설명은

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Poll

이곳에서 참고하였다.

ConInfo* conSock; 이 변수는 socket의 상태를 저장하기 위한 변수이다. 이것을 보고 현재

소켓이 접속되었는지 아닌지를 판단하게 된다.

poll함수는 pollfd형 포인터로 여러 개의 pollfd구조체변수를 등록해서 이 중에 어떤 소켓에

입력이나 출력등의 신호가 왔는지를 판단해 주게 된다.

 

 

 

이 AsyncSocket클래스는 예제가 있어 사용하기에는 불편함이 없지만 TCP에 국한되어있고

사용하는데 불편한 점이 있어서 직접 클래스를 작성하기로 하였다.

 

select방식의 비동기 입출력

 

select 방식의 소켓의 방식을 알기 위해 www.sourceforge.net 에서 찾아보았다.

Asynchronous Socket Library로 검색하면 나오게 되는 예제소스가 있는데

Select의 동작방식은 알 수 있었지만 클래스단위로 구현되어 있지 않고 전역함수를 사용하는 등의 방식으로 이루어져 있어서 사용하기에 까다로워 보였다. 그래서 새로 하나 만들어보기로 했다.

우선 새로 만든 클래스는 소켓의 기본적인 역할을 하는 클래스와 이를 이용해서 비동기로 작동하게 하는 클래스를 만들었다.

 

기본 소켓 클래스

CSocket

이 클래스는 소켓이 할 수 있는 대부분의 동작을 메소드로 구현해 두었으며 이 클래스만 가지고 통신을 할 수 있게 만들었다.

생성자의 인자를 이용해 TCP나 UDP로 이용할 수 있게 만들어 두었다.

클래스 헤더는 다음과 같다.

 

#ifndef _CSOCKET_H_

#define _CSOCKET_H_

 

typedef int SOCKET;

 

class CSocket

{

private:

SOCKET m_sockfd;

short m_port;

uint m_ip;

int m_family ; //AF_INET

int m_type; //SOCK_STREAM or SOCK_DGRAM

int flag;

sockaddr_in m_addr;

static socklen_t m_addrlen;

sockaddr_in m_client_addr;

static socklen_t m_clientlen;

 

bool isNonBlock;

 

public:

 

CSocket();

CSocket(int family,int type,int protocol);

~CSocket();

int Send(char * buf,int length,int flag=0);

int Sendto(char * buf,int length,sockaddr* addr,socklen_t len);

int Recv(char * buf,int length,int flag=0);

int Recvfrom(char * buf,int length,sockaddr* addr,socklen_t* len);

int Bind(void);

int Connect(int retry);

int Listen(int backlog=5);

int Accept(int srvfd);

int Close();

int setToBroadcast();

int setSockOpt(int level, int optname, const void *optval, socklen_t optlen);

int setNonBlockSock();

int setaddr(const char* ip, int port);

int setsvraddr(const char* ip, int port);

int setSocket(int family, int type, int protocol);

int setSockfd(int fd);

int getfd();

 

};

 

#endif //_CSOCKET_H_

CAsyncSock

 

CSocket클래스 객체를 포함하는 클래스이다. 상속을 사용하지 않은 이유는 CAsyncSock클래스는 다중접속을 위한 클래스이고 CSocket클래스는 하나의 소켓만 고려한 클래스이기 때문에 상속을 받기에는 부적합하기 때문이다.

다음은 CAsyncSock의 클래스 선언부이다.

 

class CAsyncSock

{

private:

 

vector <int> fds;

vector<ConInfo> m_sockinfo;

int maxi;

int conNum;

fd_set read_fds, write_fds;

 

public:

CAsyncSock();

CAsyncSock(int maxNum

virtual ~CAsyncSock();

int Close(int i);

locker < vector <CSocket > > m_sockList; //socket array

void InitAsync();

int aListen(int domain, int type, int protocol, const char* ip, int port, int backlog);

int aConnect(int domain, int type, int protocol, const char* ip, int port, int retry, int t) ;

void AsyncNotificationLoop(bool noWrites=false);

unsigned int GetAvailBytes(int i);

int getconNum(void);

int getSockStatus(int i) ;

void increaseSock(int i, bool increase);

void Select(timeval *timeout, bool noWrites);

virtual int OnRead(int i);

virtual int OnWrite(int i);

virtual int OnClose(int i);

};

locker<> 클래스는 템플릿 인자를 상속받아서 만들어지는 클래스로 작업도중 뮤텍스락을 걸수 있도록 해서 못건드리도록 하는 작업을 하는 클래스이다.

 

Select함수를 이용했기 때문에 select메소드에서만 입력에 대해 확인하고 대응되는 동작은

OnRead나 OnClose함수를 재정의해서 사용하면 된다.

저작자 표시
신고

'기타 > 기술문서' 카테고리의 다른 글

비동기 통신 학습  (0) 2011.12.14
visual assist 설정 및 단축키 설명서  (0) 2009.12.20
DB 연결샘플  (0) 2009.12.20
WCF 정리  (0) 2009.12.17
C# 패턴  (0) 2009.12.17
AVR_GCC 닷넷에서 사용하는 방법.  (0) 2009.12.17
PHP에서 소켓 통신을 하려면, 먼저 소켓을 지원할 수 있도록 모듈을 추가해야 한다.

php.ini 파일을 열어 아래 라인을 수정.
;extension=php_sockets.dll

-> 맨 앞의 ;(세미콜론)을 삭제하고 웹서버(아파치)를 재시작 하도록 하자!

※ 참고. 리눅스에서는 다시 컴파일을 시도해야할 수도 있음.

1. 소켓 생성
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

2. 서버 접속
define("IP", "127.0.0.1");
define("PORT", 3122);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
sock_connect($sock, IP, PORT);

3. 데이터 보내기
define("IP", "127.0.0.1");
define("PORT", 3122);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
sock_connect($sock, IP, PORT);
$data = 'Hello Socket';
sock_write($sock, $data, strlen($data));

저작자 표시
신고

'웹 프로그래밍 > PHP' 카테고리의 다른 글

소켓통신  (0) 2011.12.14
특정 태크 제거 소스.  (0) 2011.12.14
웹을 공부해 보자 PHP- PEAR()를 이용한 프로그래밍~  (0) 2010.06.18
<?php
// 제거할 태그들
unset($tag
);
$tag[] = 'form'
;
$tag[] = 'iframe'
;
$tag[] = 'meta'
;
$tag[] = 'object'
;
$tag[] = 'script'
;
$tag[] = 'style'
;
$tag[] = 'textarea'
;
.
.
.
$tags implode('|',$tag
);

// 제거 함수
function stripTags(&$str,&$tags
)
{
  
$str eregi_replace('</?('.$tags.')[^>]*>','',$str
);
  return 
$str
;
}
?>
저작자 표시
신고

'웹 프로그래밍 > PHP' 카테고리의 다른 글

소켓통신  (0) 2011.12.14
특정 태크 제거 소스.  (0) 2011.12.14
웹을 공부해 보자 PHP- PEAR()를 이용한 프로그래밍~  (0) 2010.06.18

다운로드 받은 설치 프로그램을 다운 받아 설치해보도록 하자.

Setup-Subversion-1.6.6.msi 더블 클릭하여 실행!!!

SVN 설치에 관해선 별 다른 특별한 그 무엇은 없는 것 같다. 일단은.. 무조건 Next!!!

 

Step1.Welcome to the Subversion Setup Wizard

 

Step 2 Information

이런 저러한 정보들. 보통은 그냥 읽지 않고 넘어가는 경우가 대부분이다.

난 혹시나 유용한 정보가 있을지 몰라 어떤 프로그램이든 설치할 때 다 읽어본다.

 

Step 3 Destination Folder

설치경로는 본인이 끌리는대로..

 

Step 4 Ready to install Subversion

 

Step 5 Installing Subversion

 

Step 6 Completed the Subversion Setup Wizard

 

마지막으로 Finish를 클릭하면 SVN 설치 끝.

 

설치 경로엔 아래와 같이 폴더가 생긴다.

 

그럴리는 없겠지만 혹시나 path가 설정이 안되어져 있는지 다시 한번 확인!!

C:\Program Files\Subversion\bin 이 설정되어 있는게 보인다.

이렇게 되면 어느 위치에서든지 Subversion의 bin 하위 폴더의 프로그램들을 실행 시킬 수 있다.

저작자 표시
신고
* 특정 URL에 있는 파일을 다운로드 받아서 storage로 저장을 하고 싶을경우

    public void onCreate(Bundle savedInstanceState) {
        ....
        try {
            String DownloadURL = "http://www.androes.com/exchange.xml";
            String FileName = "/mnt/sdcard/exchange.xml";
            InputStream inputStream = new URL(DownloadURL).openStream();
            
            File file = new File(FileName);
            OutputStream out = new FileOutputStream(file);
            saveRemoteFile(inputStream, out);
            out.close();
            Logger.d("androes", "File Write /mnt/sdcard/exchange.xml");
            
        } catch(Exception e){
            Logger.d("androes", "File Write Failed! /mnt/sdcard/exchange.xml");
            e.printStackTrace();
        }
    }

    public void saveRemoteFile(InputStream is, OutputStream os) throws IOException    
    {
        int c = 0;
        while((c = is.read()) != -1)
            os.write(c);
        os.flush();    
    }  


* AndroidManifest.xml 파일에 아래항목 추가

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
저작자 표시
신고

특정 URL에 있는 파일을 다운로드 받아서 storage로 저장을 하고 싶을때 아래와 같은 코드를 사용하여 작업할 수 있습니다.


InputStream inputStream = new URL(DownloadURL).openStream();
    
File file = new File(FileName);
OutputStream out = new FileOutputStream(file);
writeFile(inputStream, out);
out.close();

 위 코드에서 DownloadURL 부분과 FileName 부분만 원하시는 내용으로 채워서 사용하시면 됩니다. 사용된 writeFile 함수의 구현은 다음과 같습니다.


public void writeFile(InputStream is, OutputStream os) throws IOException
{
     int c = 0;
     while((c = is.read()) != -1)
         os.write(c);
     os.flush();
}  

 인터넷이 허용된 상태여야 다운로드를 받을 수 있기 때문에 AndroidManifest.xml 파일에 아래와 같이 추가 되어 있어야 에러가 나지 않습니다.


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

 만약 sdcard와 같은 곳으로 저장을 한다면 아래 내용도 추가를 해야합니다.


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

 파일을 다운로드 받을 필요는 없고, 파일에 있는 값만 컨트롤 하고 싶으면 맨 위에 있는 소스에서 InputStream을 가지고 내용을 얻어와서 사용을 하면 됩니다.

저작자 표시
신고
<com.android.settings.IconPreferenceScreen
                      settings:icon="@drawable/ic_settings_connectivity" android:key="connectivity_settings"                                   android:title="@string/connectivity">
<intent android:action="com.lge.autorun.connectivitySettings" /> 
</com.android.settings.IconPreferenceScreen>

다음 내용은 xml을 이용하여 패키지를 호출하는 방법 입니다.
 
저작자 표시
신고

<목표> [안드로이드] Preference – UI 정보, 간단한 변수 저장하기

   

 

  이번에는 Preference에 대해 다루어 보겠습니다. Preference(이하 프리퍼런스)는 화면 이동 시 간에 발생하는 데이터 손실을 방지하기 위해 사용되는 자료형입니다. 간단한 예로 들자면, 친구에게 메시지를 보내기 위해 열심히 문자를 쓰고 있는 와중에, 전화와 온다고 가정합시다. 전화를 받고 나서 긴 장문의 메시지가 날라간다면 어떤 느낌이 들까요? 이런 일을 방지하기 위해서 프리퍼런스라는 자료형을 사용합니다. 화면 전환 시, UI 정보를 저장하고, 다시 그 화면으로 돌아왔을 때의 UI 정보를 불러와서 다시 화면에 뿌려주는 역할을 합니다. 이 밖에도 화면 전환 시에 저장하고 싶은 데이터를 저장할 수도 있습니다. 즉 간단하게 말하면, 임시 저장소라고 생각하시면 될 것 같습니다.

   

[핵심코드]   Preference

   

엑티비티 변환  데이터를 저장합니다.

SharedPreferences prefs = getSharedPreferences("PrefName"MODE_PRIVATE);

SharedPreferences.Editor editor = prefs.edit();

editor.putString(KEY_MY_PREFERENCE, text);

editor.commit();

엑티비티를 다시 실행하였을  데이터를 불러옵니다.

SharedPreferences prefs = getSharedPreferences("PrefName"MODE_PRIVATE);

String text = prefs.getString(KEY_MY_PREFERENCE"");

   

   

  아래의 예제에서는 간단하게 두 엑티비티 간의 화면이 바뀌었다가 다시 돌아왔을 때 제대로 프리퍼런스가 동작이 되고 있는지 확인합니다.

     

   

STEP 1  Java Source Code

   

  자바 코드는 두 가지를 다루게 됩니다. 첫 엑티비티는 시작화면으로, 간단히 데이터를 입력하고 화면을 전환시킵니다. 두 번째 엑티비티는 별다른 기능없이 다시 첫번째 엑티비티로 돌아가는 역할만 수행합니다.

   

     

[[Activity]]   Preference 를 이용한 첫 번째 엑티비티

   

package example.preference;

   

import android.app.Activity;

import android.content.Intent;

import android.content.SharedPreferences;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

   

   

public class PreferenceTestActivity extends Activity {

   

public static final String KEY_MY_PREFERENCE = "my_preference";

@Override

   public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.main);

   

   Button bt = (Button)findViewById(R.id.nextButton);

   bt.setOnClickListener(new View.OnClickListener() {

              

            @Override

            public void onClick(View v) {

                Intent intent =

                new Intent(PreferenceTestActivity.this, NextActivity.class);

                startActivity(intent);

            }

        });

   

   SharedPreferences prefs = getSharedPreferences("PrefName"MODE_PRIVATE);

   String text = prefs.getString(KEY_MY_PREFERENCE"");

      //  번째인자는 두번째 인자는 키에 대한 데이터가 존재하지 않을 경우의 디폴트값

     final EditText edit =(EditText)findViewById(R.id.text);

   edit.setText(text);

}

   

    // onStop() :  이상 엑티비티가 사용저에게 보여지지 않을  불립니다.

    //          기존에 존재하는 데이터를 저장합니다.

   protected void onStop() {

    super.onStop();

   

   EditText editText =(EditText)findViewById(R.id.text);

   String text = editText.getText().toString();

   

       // 데이타를 저장합니다.

   SharedPreferences prefs = getSharedPreferences("PrefName"MODE_PRIVATE);

   SharedPreferences.Editor editor = prefs.edit();

   editor.putString(KEY_MY_PREFERENCE, text);

   editor.commit();

   }

}

     

[Activity ①]   SharedPreferences 이용하여 데이터 저장하기

   

  첫 번째 엑티비티로 화면에서 간단한 UI를 조작하고 있습니다. 버튼을 클릭하면 Intent를 이용하여 다음 엑티비티로 전환합니다. 화면을 전환하게 되면 onStop()이 호출이 되게 되며, 이 상태에서 저희가 사용할 프리퍼런스를 이용해서 데이터를 저장해야합니다. 위의 코드에서 보는 것처럼 SharedPreFerences라는 데이터 유형을 사용해야 합니다. 안드로이드 자체에서 제공해주는 자료형으로써, getSharedPreferences( Key값, Permission값 ) 메서드를 호출하여 자료형의 속성을 지정할 수 있습니다.

"PrefName" 은 말그대로 자신이 정하고 싶은 Key 값이라고 보시면 됩니다. 다음에 데이터를 호출할 때 이 Key 값을 이용하여 그 자료형을 불러올 수 있습니다. 다음 인자는 이 자료형에 대한 권한 설정을 해주는 부분입니다. MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 을 이용하여 이 파일에 대한 접근 권한을 설정합니다.

   

MODE_PRIVATE

-rw-rw----

MODE_WORLD_READABLE

-rw-rw-r--

MODE_WORLD_WRITEABLE

-rw-rw--w-

   

  위에서 보시는 것과 같이 이 데이터에 대한 권한을 설정할 수 있습니다. 리눅스 개발을 한번이라도 접해신분들이라면 곧바로 이해가 되실 겁니다. 이렇게 저장된 프리퍼런스는 xml 형태로 저장이 됩니다. (소스 내에 존재하진 않습니다.) 패키지 파일 내에 있는 shared_prefs 영역에 선언된 SharedPreferences 자료가 저장되어 있는 것을 확인하실 수 있습니다.

  이렇게 저장된 프리퍼런스를 이용하여 Editor라는 자료형으로 선언합니다. 말 그대도 편집하기 위해서 선언을 한 뒤에, 자신이 저장하고 싶은 데이터 이름을 설정해주고, 저장하고 싶은 변수를 넣으면 저장이 됩니다. 그리고 마지막으로 commit()을 호출하면 데이터가 저장됩니다.

   

[[Activity ②]]   SharedPreferences 이용하여 데이터 불러오기

   

  이제 저장한 데이터를 이용하여 불러와야 합니다. 불러오는 부분은 엑티비티가 생성 시, 즉 onCreate( ) 부분에 넣으면 됩니다. SharedPreferences를 설정해주고, 미리 정해둔 Key 값을 넣어 데이터를 불러오면 됩니다. 아주 간단하게 작업이 이루어집니다.

  엑티비티의 라이프 사이클을 고려하여, 해당하는 부분에 알맞도록 프리퍼런스가 동작하도록 설정해주면, 입맛에 맞게 이용할 수 있습니다.

   

   

[[Activity]]   단순히 뒤로갈 수 있게 만드는 두 번째 화면 엑티비티

   

두 번째 화면 엑티비티는 테스트를 위해 필요한 부분입니다. 단순히 다시 화면으로 돌아갔을 때 원래의 값이 남아 있는지 확인 하는 부분입니다. 엑티비티를 생성하시고 간단히 뒤로 가는 버튼을 넣어주면 됩니다. 별다른 어려운 점이 없는 부분이니 넘어가겠습니다.

   

 class NextActivity extends Activity {

   

    public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.next);

   

   Button bt = (Button)findViewById(R.id.previousButton);

   bt.setOnClickListener(new View.OnClickListener() {

              

            @Override

            public void onClick(View v) {

                Intent intent =

                new Intent(NextActivity.this, PreferenceTestActivity.class);

                startActivity(intent);

            }

        });

  }

}

    

     

STEP 2  Xml Code

     

   첫 번째 엑티비티는 텍스트뷰와 에디트박스, 버튼으로 구성되어 있습니다. 에디트박스에 있는 데이터가 저장되고 다시 돌아왔을 때 저장되었는지를 확인합니다. 제대로 저장이 되어 있다면, 쓰고 있던 메시지가 그대로 저장이 되어야 합니다.

   

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

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

   <TextView

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   android:text=" 엑티비티"

   />

   <EditText

   android:id="@+id/text"

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   />

   <Button android:text="다음으로"

   android:id="@+id/nextButton"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"></Button>

</LinearLayout>

   

  두 번 째 엑티비티는 첫 번째 엑티비티를 이용하여 돌아가기 위해 버튼만 구현해 놓았습니다.

   

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

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

   <TextView

   android:layout_width="fill_parent"

   android:layout_height="wrap_content"

   android:text="다음 엑티비티"

   />

   <Button android:text="이전으로"

   android:id="@+id/previousButton"

   android:layout_width="wrap_content"

   android:layout_height="wrap_content">

   </>

</LinearLayout>

   

   

STEP 3  AndroidManifest.xml Code

   

  메니페스트에는 다음 엑티비티를 허용하겠다는 퍼미션만 추가하면 됩니다.

     

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

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

package="example.preference"

android:versionCode="1"

android:versionName="1.0">

   <application android:icon="@drawable/icon"android:label="@string/app_name">

   <activity android:name=".PreferenceTestActivity"

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=".NextActivity"></activity>

   </application>

</manifest>

   

   

   

 마무리 >  프리퍼런스(Preference)를 이용하여 간단한 데이터 저장하기

   

  화면 이동 시 일어날 수 있는 데이터 손실을 미리 방지하기 위해 프리퍼런스를 사용합니다. 이러한 간단한 정보를 데이터베이스를 이용하여 접근하는 것은 속도와 효율적인 면에서 큰 손실이 아닐 수 없습니다. 그렇기 때문에 안드로이드에서 제공해주는 SharedPreferencs라는 데이터 유형으로 프로그래밍 내에서의 변수 선언처럼 간단히 데이터를 저장하고 불러 올 수 있습니다. 엑티비티의 각각의 라이프 사이클에 맞게 데이터를 저장, 불러오기를 한다면 조금 더 사용성에 이점이 있도록 어플리케이션을 개발할 수 있습니다.

     

저작자 표시
신고