안드로이드 현재시간 구하기 및 포맷지정 방식 예제입니다.

물론 자바에서도 가능하구요.


// 현재 시간을 msec으로 구한다.

long now = System.currentTimeMillis();


// 현재 시간을 저장 한다.

Date date = new Date(now);


// 시간 포맷 지정

SimpleDateFormat CurDateFormat = new SimpleDateFormat("yyyy년 MM월 dd일");

SimpleDateFormat CurTimeFormat = new SimpleDateFormat("HH시 mm분");

SimpleDateFormat CurYearFormat = new SimpleDateFormat("yyyy");

SimpleDateFormat CurMonthFormat = new SimpleDateFormat("MM");

SimpleDateFormat CurDayFormat = new SimpleDateFormat("dd");

SimpleDateFormat CurHourFormat = new SimpleDateFormat("HH");

SimpleDateFormat CurMinuteFormat = new SimpleDateFormat("mm");


// 지정된 포맷으로 String 타입 리턴 

String strCurDate = CurDateFormat.format(date);

String strCurTime = CurTimeFormat.format(date);

String strCurYear = CurYearFormat.format(date);

String strCurMonth = CurMonthFormat.format(date);

String strCurDay = CurDayFormat.format(date);

String strCurHour = CurHourFormat.format(date);

String strCurMinute = CurMinuteFormat.format(date);


이렇게 보면 참~ 쉽고 간단하죠? ^^


by wisegirl 2013. 4. 20. 18:13

 

 

 

 

 

 

 

 

 

 

 

 

ㅇ 네이티브 앱

앱스토어, 플레이스토어를 통해 배포되고 디바이스의 종류에 따라 별도로 구동되는 앱
모바일 OS제조사에서 제공하는 개발언어를 이용하여 자신들의 제품에서만 동작됨
애플의 OS는 IOS 이고 개발언어는 object-c 제품은 아이폰 
구글의 OS는 안드로이드(java기반) 이고 개발언어는 안드로이드 제품은 넥서스, 갤럭시 등
동일한 서비스의 앱을 개발한다 하더라도 모바일 OS에 따라 별도의 앱으로 모두 새로 개발해야 함
예) 카카오톡, 다함께차차차, 에버노트 등

 

ㅇ 웹 앱
웹 브라우저 기반에 네이티브 앱의 형태로 보여지는 앱
실제 구동플랫폼은 웹 기반이지만 마치 앱을 사용하는것과 같이 동작함
Html5 기반으로 웹 표준을 따라 Css와 Javascript로 개발
예) 비즈조선 (http://app.chosunbiz.com)

 

ㅇ 모바일 웹
모바일에 최적화 된 웹 사이트를 말함.
기존 PC환경의 웹이 1024또는 1280의 해상도에 최적화 되어 있기 때문에 모바일 기기에서 보기에 불편한 점이 많다는 점을 보완함.
모바일 해상도에서 최적화 되어 볼수 있도록 만들어 제공되는 웹 페이지
기존의 웹 사이트를 두고 모바일 버전으로 별도의 웹 페이지를 새로 만들어야 함 (2배의 공수)
이에 대한 대안으로 반응형 웹이 주목받기 시작함
(반응형 웹: 브라우저 해상도에 따라 화면의 텍스트 사이즈나 UI구성이 자동으로 변형되는 형태의 웹, http://www.thunderboltgames.com)
예)http://m.naver.com, http://m.daum.net

 

ㅇ 하이브리드 앱
모바일 웹과 모바일 앱의 장점을 가져와 혼합한 형태의 앱.
겉은 IOS나 안드로이드 플랫폼의 네이티브 앱으로 만들고 내용은 웹으로 만든 형태
UI나 내부구조 하드웨어에서 지원하는 기능을 API로 구성하고, 컨텐츠는 웹으로 구성하여 앱 처럼 실행 되도록 하는 경우가 많음
다시말해 앱의 껍데기는 모바일 OS플랫폼으로 하되 실제 보여지는 컨텐츠 페이지는 웹의 형태로 구성
고정되어 있는 부분은 앱으로 개발하고 지속적으로 변경되고 업데이트 되어야 할 부분은 웹으로 구성하면 편리함
예) 네이버앱, 다음앱, 구글앱

by wisegirl 2013. 3. 25. 09:10

이클립스 안드로이드 설치시 기억할것

 

(1) Java 설치, 환경변수 Path 경로추가

C:\Program Files\Java\jdk1.7.0_17\bin\

 

(2) 이클립스 다운로드

Juno 버전 이후 부터 SVN이용가능

 

(3) 안드로이드 SDK 다운로드, 환경변수 Path 경로추가

C:\Android\eclipse-SDK-4.2.2-win32-x86_64\sdk\tools\

 

(4) 이클립스 실행 후 안드로이드 Develop관련 추가설치

Help -> Install New Software ->

https://dl-ssl.google.com/android/eclipse/ 

 

by wisegirl 2013. 3. 20. 08:47

인플레이션(inflation)을 통해 탭 위젯 구현하기

 

인플레이션 구현 복습

해당 액티비티의 객체를 연결해 주는 infalter를 전달받고 그 inflater에 Layout과 TabHost를 등록

LayoutInflater inflater = LayoutInflater.from(this);

inflater.inflate(R.layout.main, mytabhost.getContentview(), true);

 

 

탭 위젯 구현하기

탭 호스트 spec을 만들고 sepc에 Indicator와 setContent를 해 주고 나서

탭 호스트에 spec객체를 addTab();

TabHost mytabhost;

TabHost.TabSpec spec = mytabhost.new TabSpec("tag");

spec.setIndicator("탭이름"(;

spec.setContent(R.id.Layoutid);

mytabhost.addTab(spec);

 

 

by wisegirl 2013. 3. 19. 13:05

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ㅇ static 변수는 해당 static변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.

 

ㅇ static 으로 선언된 변수는 특정 메모리 공간 하나의 주소에 존재한다. (동일한 주소로 변수 참조)

   - 다시말해, 여러번 생성 될 때 마다 메모리에 로딩되지 않고 한번만 한 곳에 로딩된다.

 

ㅇ static 변수는 객체가 생성(new)되기 전에 별도의 메모리 공간에 할당되어 초기화 된다.

 

ㅇ static 변수는 클래스가 생성(new)되지 않더라도 정의만 되어도 접근가능하다.

 

ㅇ static 변수가 초기화 되는 시점은 JVM에 의하여 클래스가 메모리 공간에 올라가는 순간이다.

   - 일반 변수는 객체가 new되는 시점에 메모리에 로딩된다는 점과 차이
   - static변수는 생성자를 통하여 초기화 하면 안됨

 

ㅇ 객체간 데이터 공유가 필요한 상황에서는 static변수를 선언한다.

 

ㅇ 클래스 내부/외부에서 참조의 용도로만 선언된 변수는 static final로 선언된다.

 

ㅇ static 메소드 내에서는 일반 객체 변수를 사용할 수 없다.
   - static 메소드를 호출할 때 객체가 생성되어 있지 않을수도 있기 때문이다.
   - 다시말해, new되어 변수가 메모리에 로딩되지 않은 시점 일 수도 있다는 말이다.

 

ㅇ static변수는 지속적으로 메모리에 유지된다.
   - 일반 변수는 메소드에서 사용되고 나면 자동으로 소멸되는것과 비교

 

ㅇ static 메소드는 컴파일시 early-binding되기 때문에 실행시 바인딩(late-binding)되는 객체 메소드 보다 빠르다.
   - 컴파일시 이미 호출될 함수가 결정되기 때문에 실행시에 호출되는 함수를 찾아서 결정하는 시간을 줄일 수 있다.

 

자주 변하지 않는 일정한 값이나 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어 들이는것 보다 일종의 메모리 차지공간도 줄이고 효율도 높일 수 있다.

static으로 선언된 클래스 변수나 메소드는 객체의 변수가 아니라 클래스의 변수가 된다.
클래스의 변수라 함은 어떠한 객체라도 동일한 주소로 해당 변수를 참조할 수 있다.
반대로 객체의 변수라고 하면 매번 new될때 마다 참조 주소가 달라진다.

일반적으로 클래스의 변수나 메소드는 클래스가 인스턴스화(new) 되기 전에는 사용 할 수 없는데
static으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근/사용가능

 

싱글톤(singleton)
클래스를 private로 선언하면 클래스 객체를 new로 생성할 수 없다.
public static으로 선언한, 객체를 리턴하는 getInstance()와 같은 메소드를 통해서만 객체 접근 가능
public static MyClass getInstnace()
{
if(classInstance == null)
classInstance = new MyClass();
return classInstance;
}

싱글톤 방식은 프로젝트에서 DB연결 등의 공용자원 접근에 이런 static적용을 통해 안전성을 높임
변하지 않는 값을 final static으로 선언하면 GC(Gabage Collection) 대상이 되지 않음

 

 

by wisegirl 2013. 3. 14. 17:24

2tier client/server모델: clint 와  server가 일대일로 연결하는 방식
3tier 모델: 클라이언트-응용서버-데이터서버 연결방식

소켓의 기본이해 (자바 네트워킹과 동일함)

//서버쪽
ServerSocket serverSocket = new ServerSocket(5001);
while()
 Socket socket = serverSocket.accept();
 ObjectInputStream instream = new ObjectInputStream(socket.getInputStream());

 //스트림으로 들어오는 input데이터, socket으로 부터
 String inStr = instream.readUTF();
 System.out.println("result: " + inStr);

 ObjectOutputStream outstream = new ObjectOutputSteam(socket.getOutputStream());
 outstream.write("from server: "+ inStr);
 outstream.flush();

 

//클라이언트 쪽
Socket socket = new Socket("localhost", 5001);

ObjectOutputStream outstream = new ObjectOutputSteam(socket.getOutputStream());
outstream.write("Hello");
outstream.flush();

ObjectInputStream instream = new ObjectInputStream(socket.getInputStream());

//스트림으로 들어오는 input데이터, socket으로 부터
String inStr = instream.readUTF();
System.out.println("result: " + inStr);

자바와 안드로이드 차이점은 메인UI 접근제한으로 핸들러를 이용한다는 점

서버는 일반 소켓서버를 쓰면 된다. 어차피 소켓 프로토콜이므로,

by wisegirl 2013. 3. 13. 10:54

스레드 객체 및 메소드 내에서 메인 UI객체에 접근할수 없다!

그래서 핸들러가 필요하다.

Thread 내에서 Handler 객체를 이용하여 UI 객체와 값을 주고 받는다.

class ProgressHandler extends Handler{

   public void handleMessage(Message msg){ //handler를 통해 UI로 부터 값을 수신하는 메소드. (핵심)

      mytext.settext(msg.what);

   }

}

그리고 Activity쪽에서는 아래와 같이 쓰면 된다.

Thread thread = new Thread(new Runnable(){

   public void run() {

      Message msg = handler.obtainMessage(); // new로 매번 객체를 매번 만드는 대신 handler에게 msg달라고 요청

      msg.arg1 = '1111';

      msg.arg2 = '222';

      msg.object = Object;

      Message msg = Message.obtain(handler, '1111', '222', Object); // 또는 이렇게 한줄로 처리할수도 있다.

     //메세지에 값을 담아서 넘겨준다.

     handler.sendMessage(msg); // msg전송 handler객체의 handleMessage() 메소드가 호출된다

   }

}

 

루퍼: 무한루프 방식을 이용해 메시지 큐에 들어오는 메시지를 지속적으로 보면서 하나씩 실행

 

AsyncTask

백그라운드 작업을 좀 더 쉽고 간단하게 할 경우

AsyncTask 객체를 만들고 execute() 메소드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고, 필요한 경우에 그 결과를 메인 스레드에서 실행하므로 UI 객체에 접근 하는데 문제 없게 됨

 

doInBackground

새로만든 스레드에서 백그라운드 작업 수행

execute()메소드를 호출할 때 사용된 파라미터를 배열로 전달받음

 

onPreExecute

백그라운드 작업 수행 전 호출

메인 스레드에서 실행되며 초기화 작업에 사용

 

onProgressUpdate

백그라운드 작업 진행 상태를 표시하기 위해 호출

작업 수행 중간 중간에 UI객체에 접근하는 경우 사용

이 메소드가 호출되도록 하려면 백그라운드 작업 중간에 publishProgress()메소드 호출

 

onPostExecute

백그라운드 작업이 끝난 후 호출

메인 스레드에서 실행되며 메모리 리소스를 해제하는 등의 작업에 사용

백그라운드 작업의 결과는 Result타입의 파라미터로 전달

 

class ProcessTask extends AsyncTask{

   doInBackground() //스레드 run()함수처럼 실행부분

   publicshProgress() //호출하면 onProgressUpdate()가 호출된다. (스레드에서 .start()하면 run()실행되는것 처럼)

   onProgressUpdate() //이 안에서 메인UI접근가능

   execute() //.start()와 같이 스레드 실행 함수

}

by wisegirl 2013. 3. 11. 22:28

안드로이드에서는 여러 객체에게 메세지를 전달하고 싶은 경우 브로드캐스팅을 사용한다.

문자 수신 또는 전화수신같은 글로벌 이벤트가 대표적.

전달되는 브로드캐스팅 메세지는 브로드캐스트 수신자 애플리케이션 구성요소에 의해 수신.

애플리케이션 구성요소 이므로 매니페스트 파일에 등록해야 함.

서비스 처럼 브로드캐스트 수신자도 화면을 구성하지 않음.

등록방식은 자바코드 상에서 registerReceiver()메소드로 등록

수신하고싶은 메세지가 있다면 그 메세지는 인텐트 필터를 이용해 등록함

 

<receiver android:name=>

 <intent-filter android:prority="1000">

  <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

 </intent-filter>

</receiver>

 

prority속성은 메시지 수신의 우선순위 결정, 숫자가 클 수록 우선순위 높음

  

by wisegirl 2013. 3. 6. 23:59

선택 위젯에서 어댑터는 데이터 관리 객체.

데이터 추가/삭제 등의 관리를 위해 setData(), getData()메소드 구현하여 이용

 

스피너 (Spinner)

<Spinner

   android:id

/>

spin.setAdapter()메소드로 어댑터 설정

ArrayAdapter<String> aa = new ArrayAdapter<String>{

   this, android.R.layout.simple_spinner_item, items);

aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

}

onItemSelected(AdapterView<?> parent, View v, int position, long id)

 

그리드 뷰 (Grid view) : 테이블 모양으로 데이터를 표현 (ex:월별 캘린더)

class DataGridView extends GridView{}

grid = new DataGridView(this);

grid.setAdapter();

 

갤러리 (Gallery) : 단말 내 앨범의 이미를 선택하여 불러올때 이용됨

<Gallery

   android:id

/>

gallery = (Gallery) findViewById(R.id.gallery)

gallery.setAdapter(new ImageAdapter(getApplicationContext()));

gallery.setOnItemClickListener(new OnItemClickListener(){}

by wisegirl 2013. 3. 6. 22:21

여러 개의 아이템 중에서 하나를 선택하도록 하는 위젯을 선택 위젯 이라고 함

선택 위젯은 어댑터(Adapter)를 사용하여야 함

이 어댑터에서 데이터를 관리하도록 해야 할 뿐만 아니라 화면에 보여지는 뷰도 getVeiw()메소드에서 결정함

선택위젯의 가장 큰 특징은 원본 데이터를 위젯에서 직접 설정하지 않고 어댑터라는 클래스를 사용하도록 되어 있다는점

어댑터가 데이터 관리 (getCount, getItems, getItemId, getVeiw)

리스트는 껍데기

 

선택 위젯으로 리스트뷰, 스피너, 그리드뷰(테이블 모양), 갤러리 등을 구현할 수 있음

 

<ListView

   android:id="@+id/list"

   android:layout_width

   android:layout_height

/>

 

LiseView list = (ListView) findViewById(R.id.list);

MyAdapter adapter = new MyAdapter();

list.setAdapter(adapter);

//리스트(껍데기)를 만들고, 리스트 객체에 어댑터(데이터)를 결합한다.

 

어댑터를 별도의 클래스(파일)로 만들어서 이용할 수 있음. 생성자로 Context 객체 전달

Class MyAdapter extends BaseAdapter //데이터 관리하는 어댑터 클래스, View 를 리턴 ex)TextView, LinearLayout

{

   Context mcontext;

   String[] names = {"홍길동", "이성계", "정도전", "세종대왕"};

   public MyAdapter(Context context)

      mcontext = context;

   public int getCount()

      return names.length;

   public Object getItems(int position)

      return names[position];

   public long getItemId(int position)

      return position;

   public View getView(int position, View convertView, ViewGroup parent)

   //getView메소드에서 View 객체에 LinearLayout 등을 리턴할 수 있다. 내부에 이미지, View등을 결합가능

      TextView text = new TextView(getApplicationContext());

      text.setText(names[position]);

      return text; 

}

 

Layout 역시 별도의 클래스(파일)로 만들어서 이용할 수 있음.

Class CustomerItemView extends LinearLayout{}

액티비티 에서는 SetContextVeiw()를 통해 xxx.xml 파일을 로딩하여 화면구성을 인플레이션 할수 있음

그러나 액티비티가 아닌 Layout을 상속받는 클래스에서는 SetContentView()로 인플레이션 할수 없음

따라서, 수동으로 인플레이션 코드를 작성해 주어야 함.

private void init(Context context)

LayoutInflater inflater = (LayoutInflater) context.getSystemService(ACTIVITY.LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.customer, this, true);

by wisegirl 2013. 3. 6. 09:17
| 1 2 3 |