[jar] jar 압축하기/해제하기

프로그래밍/Java 2010. 9. 10. 16:40 Posted by galad
- JAR 파일 만들기
   jar cvf 만들파일명.jar *.*


- JAR 파일 업데이트
   jar uvf 만들파일명.jar *.*


- JAR 파일 풀기
   jar xvf 압축풀파일명.jar *.*
참고: http://www.yunsobi.com/tt/subby/99
참고: http://decoder.tistory.com/37

첨부된 파일은 검색에서 나온 것으로 문제 있으면 삭제하겠습니다.

package com.omp.bp.cms.batchreg.service;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import com.omp.bp.cms.batchreg.BatchRegisterErrorConstants;
import com.omp.bp.cms.util.DateUtil;

/**
 * 배치 등록 관련 에러 로그 처리 클래스. 콘텐츠 하나에 대한 에러로그XML 생성.
 * @author Sung,HongJe
 *
 */
public class BatchRegisterError {

    private final static Logger log = Logger.getLogger(BatchRegisterError.class);

    private final String ERROR_FILE_NAME_HEADER = "ERROR_";
    private final String ERROR_FILE_EXT = "XML";

    /**
     * 에러 로그 파일 생성
     * @param ftpRepoPath ftp 디렉토리 패스
     * @param contentId 콘텐츠ID
     * @param contentType 콘텐츠타입 - C:채널, E:콘텐츠(에피소드)
     * @param errorCode 에러코드
     * @throws IOException
     */
    public void makeErrorLog(String ftpRepoPath, String contentId, String contentType, int errorCode) throws IOException {

        // 1. ERROR 파일패스 설정 : ftpRepo/ERROR_[TYPE]_[CID].XML
        // 2. 에러 코드를 이용해서 XML 내용 설정
        // 3. 파일로 저장

        // ftpRepo/ERROR_C_000050151.XML
        String filePath = ftpRepoPath + File.separator + ERROR_FILE_NAME_HEADER + contentType.toUpperCase() + "_" + contentId + "." + ERROR_FILE_EXT;
        String errorMsg = BatchRegisterErrorConstants.getErrorMsg(errorCode);

        // XML 내용 생성
        Document xmlDoc = makeErrorXML(contentId, errorCode, errorMsg, DateUtil.getToday() + DateUtil.getTime());

        File file = new File(filePath);
        FileOutputStream out = null;

        try {

            if(!file.exists()) { // 로그 파일 없으면 생성

                File dir = new File(ftpRepoPath); // ftp 디렉토리가 없으면 생성
                if(!dir.exists())
                    dir.mkdir();

                file.createNewFile();
            }

            out = new FileOutputStream(file);
            XMLOutputter serializer = new XMLOutputter();
            serializer.output(xmlDoc, out);
            out.flush();
        }
        catch (IOException e) {

            log.error("BatchRegisterError.makeErrorLog 로그 파일 작성 중 예외 발생", e);
            throw e;
        }
        finally {

            if(out != null) {

                try {

                    out.close();
                }
                catch (IOException e) {

                    log.error("BatchRegisterError.makeErrorLog 로그 파일 작성 종료 중 예외 발생", e);
                }
            }
        }
    }

    /**
     * 에러 메시지를 담는 XML을 생성 후 반환
     * @param contentId
     * @param errorCode
     * @param errorMsg
     * @param dateTime
     * @return
     */
    private Document makeErrorXML(String contentId, int errorCode, String errorMsg, String dateTime) {

        Document doc = new Document();

        Element error_log = new Element("error_log"); // root

        Element content_id = new Element("content_id");
        content_id.setAttribute("id", contentId); // set CID

        Element msg = new Element("msg");
        msg.setText(errorMsg);

        Element code = new Element("code");
        code.setText(String.valueOf(errorCode));

        Element time = new Element("time");
        time.setText(DateUtil.getToday() + DateUtil.getTime());

        content_id.addContent(msg);
        content_id.addContent(code);
        content_id.addContent(time);

        error_log.addContent(content_id);

        doc.addContent(error_log);

        return doc;
    }
}


볼드체를 참고하기

java.util.concurrent 패키지
- 일반 자바 Thread 클래스보다 높은 수준의 동시성 프로그래밍을 지원한다...고 함.
- ExecutorService 클래스는 하나 이상의 스레드를 관리하며, 작업(Runnable이나 Callable 인스턴스)이 실행되도록 실행기(ExecutorService 인스턴스)에 넘겨주면 된다.
  그러면 Future 클래스의 인스턴스를 반환되는데, 이 Future클래스는 실행시킨 작업이 반환할, 아직 알 수 없는 값을 참조한다.
 (1) transThread = Executors.newSingleThreadExecutor(); // 실행기 얻기
 (2) transPending = transThread.submit(translateTask); // ExecutorService에 작업(translateTask 쓰레드)를 넘기고 결과를 Future(transPending)로 받음.

외부 스레드에서 Android GUI 스레드의 유저 인터페이스 업데이트 하기
   /**
     * 화면의 텍스트 수정하기(다른 스레드에서 호출됨)
     * @param text
     */
    public void setTranslated(String text) {

        guiSetText(transText, text);
    }

    /**
     * 화면의 텍스트 수정하기(다른 스레드에서 호출됨)
     * @param text
     */
    public void setRetranslated(String text) {

        guiSetText(retransText, text);
    }

   /**
     * GUI 관련한 변경은 모두 GUI스레드에서 이루어져야 한다.<br>
     * 외부 스레드(유저 인터페이스가 아닌)에서 유저 인터페이스 관련 함수를 호출할 수 없음. 외부 스레드에서 GUI스레드에게 유저 인터페이스를 업데이트하라고 요청.
     * @param view
     * @param text
     */
    private void guiSetText(final TextView view, final String text) {

        guiThread.post(new Runnable() {

            @Override
            public void run() {

                view.setText(text);
            }
        });
    }
setTranslated(), setRetranslated() 메소드가 외부 스레드에서 불림 -> guiSetText() 메소드가 실행됨. -> 유저 인터페이스 업데이트

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

[TDD] 안드로이드 TDD 개발하기  (0) 2010.11.15
[Hello,Android] Android <-> WebView 간 호출하기  (1) 2010.08.31
[Hello,World] Sudoku  (0) 2010.08.31
[Hello,Android] Audio, Video  (0) 2010.08.30
[tip] LogCat 문자깨짐  (0) 2010.08.18
Android쪽
public class LocalBrowser extends Activity {

    private static final String TAG = "LocalBrowser";
    private final Handler handler = new Handler();
    private WebView webView;
    private TextView textView;
    private Button button;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 화면에서 안드로이드 컨트롤 찾기
        webView = (WebView) findViewById(R.id.web_view);
        textView = (TextView) findViewById(R.id.text_view);
        button = (Button) findViewById(R.id.button);

        // 임베딩된 브라우저-WebView-에 자바스크립트 활성화하기
        webView.getSettings().setJavaScriptEnabled(true);

        // 자바 객체-AndroidBridge-를 브라우저의 자바 스크립트에 노출시키기
        // 객체, 노출할 DOM명칭
        webView.addJavascriptInterface(new AndroidBridge(), "android");

        // 임의의 WebChromeClient 객체를 생성하여 WebView에 등록.
        // 여기의 Chrome은 브라우저 창 주의를 정리하는 모든 작업을 일컬음. 즉, 브라우저 처리을 할 클라이언트를 등록
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
//                return super.onJsAlert(view, url, message, result);
                Log.d(TAG, "onJsAlert(" + view + ", " + url + ", " + message + ", " + result + ")");

                Toast.makeText(LocalBrowser.this, message, 3000).show();

                result.confirm(); // 결과 처리됨
                return true; // 여기서 처리했으므로 true 반환
            }
        });

        // 로컬 assets에서 웹 페이지 로딩하기
        webView.loadUrl("file:///android_asset/index.html");

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick(" + v + ")");

                // 자바스크립트 호출
                webView.loadUrl("javascript:callJS('Hello from Android')");
            }
        });
    }


    /**
     * 자바 스크립트에 노출된 객체
     *
     */
    private class AndroidBridge {
        public void callAndroid(final String arg) { // 반드시 final이어야 함

            handler.post(new Runnable() {

                @Override
                public void run() {
                    Log.d(TAG, "callAndroid(" + arg + ")");

                    textView.setText(arg);
                }
            });
        }
    }
}

WebView쪽
<html>
<head>
<script type="text/javascript">
    function callJS(arg) {
        document.getElementById("replaceme").innerHTML = arg;
    }
</script>
</head>
<body>
<h1>WebView</h1>
<p>
    <a href="#" onclick="window.alert('Alert from JavaScript');">Display JavaScript alert</a>
</p>
<p>
    <a href="#" onclick="window.andriod.callAndroid('Hello from Browser');"></a>
</p>
<p id="replaceme"></p>
</body>
</html>

addJavascriptInterface() 에서 설정한 DOM명칭 "android"로 WebView에서 호출가능하다.

- final 매개변수를 잘 사용하자. -> 메소드 내에서 변경하면 안되는 값(주소값)일 경우에 사용하면 유용할 듯

[Hello,World] Sudoku

프로그래밍/Android 2010. 8. 31. 00:01 Posted by galad
스도쿠 예제

Menu Activity

         I : 메뉴선택

Game Activity -> PuzzleView : 그래픽 처리
(게임 로직 처리)

[Hello,Android] Audio, Video

프로그래밍/Android 2010. 8. 30. 23:58 Posted by galad
Audio, Video 예제

Audio
- MediaPlayer 클래스를 사용.
- create한 개체를 release 안하면 런타임 에러 발생
- 실제론 하나의 소리에 대한 객체를 미리 모두 생성해놓고, 플레이하고, 어플 종료 시 릴리즈하는 식으로 사용하게 될 듯

        // 이전 MediaPlayer의 모든 리소스를 릴리스한다.
        // 아래의 릴리즈를 주석처리하면 사운드가 겹쳐서 들리게도 할 수 있으나, 릴리즈 안하고 계속 생성만 하다보면 런타임 오류 발생
        if(mp != null)
            mp.release();

        // 이 사운드를 재생하기 위해 새로운 MediaPlayer를 만든다.
        mp = MediaPlayer.create(this, resId);
        mp.start();

Video
- VideoView에 video파일 로드 후, start.
- 재생가능한 파일에 제약이 좀 있는 듯.

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

[Hello,Android] Android <-> WebView 간 호출하기  (1) 2010.08.31
[Hello,World] Sudoku  (0) 2010.08.31
[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17

[tip] LogCat 문자깨짐

프로그래밍/Android 2010. 8. 18. 18:14 Posted by galad
윈도우즈-이클립스에서 LogCat에 UTF-8로 로그를 찍으면 글자가 깨짐.
(우분투 등 OS자체가 UTF-8이면 문제가 없는 듯?)

해결방법은 없는 듯하고 임시방편으로 다음과 같이 처리

1. 이클립스 메뉴의 Run -> Externel Tools -> Externel Tools Configurations... 클릭
2. Program 선택하고 New Launch Configuration 클릭
3. Name에 LogCat(아무거나), Main탭의 Location에 안드로이드 툴의 adb.exe 선택, Arguments에 logcat 입력, Common탭의 Console Encoding에서 UTF-8 선택하고 적용
4. Run하면 이클립스 콘솔창에 LogCat이 실행됨. 보기에는 별로지만 한글 지원됨.

http://code.google.com/p/android/issues/detail?id=1590


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

[Hello,World] Sudoku  (0) 2010.08.31
[Hello,Android] Audio, Video  (0) 2010.08.30
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16

[Hello,Android] dip, sp

프로그래밍/Android 2010. 8. 17. 17:01 Posted by galad
px : 화면 위의 점. 디스플레이의 dpi(dots per inch)가 높아지면 그림이 작아짐.
dp : density-independent pixels. 밀도에 독립적인 화소. dpi가 높아지면 같이 커진다.
dip : 구글 예제에서 자주 쓰이는 dp와 동의어
sp : scale-independent pixels. 스케일에 독립적인 화소. 사용자의 글꼴 크기 설정에 따라서 확대/축소된다.

==> 인터페이스가 현재와 미래의 모든 디스플레이에 사용될 수 있으려면
텍스트 크기로는 sp 단위를, 그 외의 경우에는 dip 단위를 사용하고, 비트맵 보다는 벡터 그래픽을 사용하도록 한다.

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

[Hello,Android] Audio, Video  (0) 2010.08.30
[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
익명의 내부 클래스가 만들어질 때마다 1KB의 메모리가 소요된다고 한다...

주로 클릭 처리 등의 리스너에 많이 익명의 내부 클래스로 처리하는데, 가능한한 줄이는 것도 퍼포먼스를 위한 하나의 방법일 듯

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

[tip] LogCat 문자깨짐  (0) 2010.08.18
[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
[Hello,Android] Activity Lifecycle  (0) 2010.06.07

[eclipse] plug-ins

프로그래밍/Library 2010. 8. 17. 14:21 Posted by galad
AnyEdit Tools   http://andrei.gmxhome.de/eclipse/   공백문자 표시 등 에디팅 편의 기능 -> 이건 쓸만한 듯
Checkstyle Plug-in   http://eclipse-cs.sf.net/update/   Source Code Analyzer -> 이건 모르겠음 ㅡ.ㅡ;;

html 에디터만 추가하기
Go to "Help" > "Install New Software" Choose to work with the site "http://download.eclipse.org/releases/galileo", Expand "Web, XML and Java EE development", Check "Web Page Editor" and click Next to continue with the install

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

[정규표현식] 태그 제거하기  (0) 2010.10.19
[ftp] FTP/SFTP/FTPS 의 차이점  (0) 2010.10.18
[browser] MS Expension Web SuperView  (0) 2010.04.08
[program] 프로파일러  (0) 2009.12.03
[Eclipse] Aptana Studio  (0) 2009.11.30

UPDATE /*+ bypass_ujvc */

(

           SELECT A.CATEGORY_ID

           FROM DEPLOY_PRODUCT_CATEGORY A, PRODUCT_INFO B

           WHERE A.CATEGORY_ID LIKE '%DP070%'

                     AND A.PRODUCT_ID = B.PRODUCT_ID

                     AND B.STATUS LIKE '6%'

)

SET CATEGORY_ID = 'XXXXXXXX';

/*+ bypass_ujvc */ 이 부분 필수임.

다음과 같이 SELECT에서 2개의 컬럼을 가져다가 넣는 것도 가능

update /*+ bypass_ujvc */

(
   select e.PRODUCT_ID, e.PROD_DESC o_PROD_DESC,f.PROD_DESC N_PROD_DESC
   from (
     select b.CHANNEL_ID,c.PRODUCT_ID,max(d.PROD_DESC) PROD_DESC
     from PRODUCT_INFO a, PRODUCT_CATEGORY b, PRODUCT_INFO c, TBL_DP_PROD d
     where a.CONTENT_TYPE='09'
       and a.PRODUCT_ID = b.CHANNEL_ID
       and b.PRODUCT_ID = c.PRODUCT_ID
       and b.PRODUCT_ID <> b.CHANNEL_ID
       and b.CHANNEL_ID = d.PROD_ID
    group by b.CHANNEL_ID,c.PRODUCT_ID
  ) e, TBL_DP_PROD f
  where e.PRODUCT_ID = f.PROD_ID

    and f.PROD_DESC is null
)

set N_PROD_DESC = o_PROD_DESC



[Hello,Android] WebView 사용 시

프로그래밍/Android 2010. 8. 16. 15:41 Posted by galad
[7.2 뷰가 있는 웹]에서 WebView에 setWebViewClient() 를 실행하지 않으면 WebView에서 웹페이지가 열리지 않고,
그냥 브라우저가 실행된다.(Intent로 여는 것처럼)

안드로이드OS가 버젼업되면서 바뀐 것 같지는 않고, 저자의 미스인 듯?

소스는 다음과 같다.
    private void openBrowser() {
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(urlText.getText().toString());
        webView.setWebViewClient(new HelloWebViewClient());  // WebViewClient 지정
    }
   
   
    private class HelloWebViewClient extends WebViewClient {
       
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }



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

[Hello,Android] dip, sp  (0) 2010.08.17
[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] 기본팁  (0) 2010.06.08
[Hello,Android] Activity Lifecycle  (0) 2010.06.07
[설치] Hello, World!  (0) 2010.05.11
/**
     * byte 단위로 substring
     * @param str
     * @param beginIndex 0부터 시작
     * @param endIndex substr할 바이트 수. 2-byte문자의 경우 바이트가 부족하면 그 앞 글자까지만 자름.
     * @param bytesForDB 2-byte문자(한글 등)의 DB에서의 바이트 수. 예를들어 오라클/UTF-8이면 3바이트임
     * @return
     */
    public static String substrb(String str, int beginIndex, int endIndex, int bytesForDB) {
       
        if(str == null)
            return "";
       
        String tmp = str;
        int slen = 0, blen = 0;
        char c;
       
        if(tmp.getBytes().length > endIndex - 1) { // 0부터 카운트 되므로 endIndex - 1
           
            while(blen + 1 < endIndex - 1) {
               
                c = tmp.charAt(slen);
                blen++;
                slen++;
               
                if(c > 127)
                    blen = blen + (bytesForDB - 1); //2-byte character..
            }
           
            tmp = tmp.substring(beginIndex, slen);
        }
       
        return tmp;
    }

public void testStringUtil() {
       
        String str = "한글테스트";
        int bytesForDB = 3;
       
        System.out.println(StringUtil.substrb(str, 0, 9, bytesForDB));
        System.out.println(StringUtil.substrb(str, 0, 8, bytesForDB));
    }


[struts2] <s:if> 사용법2

프로그래밍/Framework 2010. 8. 4. 11:24 Posted by galad
<s:if test="%{contentType < 11}"><%--VOD면--%>
    <option value="2">2 일</option>
    <option value="7">7 일</option>
    <option value="30">30 일</option>
</s:if>
<s:else>
    <option value="7">7 일</option>
    <option value="30">30 일</option>
    <option value="60">60 일</option>
    <option value="90">90 일</option>
    <option value="120">120 일</option>
    <option value="365">365 일</option>
</s:else>

contentType은 String 인데도, %{} 안에서 숫자와의 비교가 가능
숫자로 변환해서 비교하는 건지, 문자열로 비교하는 건지...
저자: 캐서린 제이콥슨

중년의 저자가 겪은, 기억상실-인지장애와 관련된 체험담 및 극복기

- 단기기억 - 작동기억 - 장기기억
- 기억력 자체에는 문제가 없으나, 작동기억에 문제가 있어서 읽고 들은 것을 기억으로 전환하지 못하거나
역으로 기억에서 가져오지 못하는 경우
- 약물, 수면장애, 비만, Apo E4, 스트레스, 대형 물고기(참치 등), 알콜...
- 운동, 8시간 수면, 작은 등푸른 생선(오메가3), 하루 한잔의 술, 풍성한 두뇌창고 만들기...

저자는 자신의 기억력장애 문제를 해결하기 위해 10단계에 걸쳐서 조사/직접 치료받기 등을 거치는 노력을 기울였고,
마지막으로 80대에도 쌩쌩한 기억력을 유지하기 위한 방법으로 다음의 3가지를 제시.
1. 두뇌를 계속 사용할 것(등반을 멈추면 추락한다) -> 십자말풀이를 계속해온 사람들의 치매에 걸릴 확율이 47% 낮음
2. 익숙한 것과 결별하기 -> 지식에만 국한한 것이 아니라, 사회적으로도 사람들을 계속 만나야 함. 사회적 상호작용의 필요성.
3. 운동하기 -> 일주일에 2번 운동하면 알츠하이머병 발병확율 60% 저하

[java] 이미지 리사이즈

프로그래밍/Java 2010. 7. 23. 14:58 Posted by galad
ImageIO, BufferedImage 사용

private static BufferedImage createResizedCopy(Image originalImage, int scaledWidth, int scaledHeight, boolean preserveAlpha) {
       
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
       
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
                g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
        g.dispose();
       
        return scaledBI;
    }
   
    /**
     * 이미지 리사이즈
     * @param srcFile 원본 이미지
     * @param destFile 리사이즈 이미지
     * @param width 리사이즈될 가로 길이
     * @param height 리사이즈될 세로 길이
     * @param imageType 리사이즈될 이미지 타입(PNG/JPG 등)
     * @param preserveAlpha 투명화 여부
     * @throws IOException
     */
    public static void resizeImage(File srcFile, File destFile, int width, int height, String imageType, boolean preserveAlpha) throws IOException   {
       
        BufferedImage originalImage = ImageIO.read(srcFile);
        BufferedImage resizedImage = createResizedCopy(originalImage, width, height, preserveAlpha);
        ImageIO.write(resizedImage, imageType, destFile);
       
//        System.out.println(ImageIO.getReaderFormatNames().toString());
//        System.out.println(ImageIO.getWriterFormatNames().toString());
    }


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

[jar] jar 압축하기/해제하기  (0) 2010.09.10
[java] byte 단위로 문자열 잘라내기  (1) 2010.08.06
[java] 소수점 자리수 / 천단위 콤마  (0) 2010.05.18
[java] Convert Milliseconds to Date  (0) 2010.03.15
[java] invoke  (0) 2010.03.09

[Hello,Android] 기본팁

프로그래밍/Android 2010. 6. 8. 11:15 Posted by galad
- 프로젝트 만들고, 빌드 패스 오류라고 컴파일 되지 않을 때 -> Project > Clean 실행
- 시스템 환경설정에 android-sdk/tools 디렉토리를 path에 넣어둘 것
http://developer.android.com/reference/android/app/Activity.html

- Activity가 화면 전면에 있으면(activity stack의 최상위), active/running.
- Activity가 포커스를 잃었으나 여전히 보이면(풀사이즈가 아닌 창이 뜨거나, 반투명 창이 뜨면), paused.
   모든 상태값, 멤버정보는 유지됨.
   Paused Activity는 살아있으나 메모리가 극단적으로 부족하면 시스템이 프로세스를 죽일 수 있음.
- Activity가 다른 activity에 의해 완전히 가려지면 stopped.
   모든 상태값, 멤버정보는 유지되나, 더이상 사용자에게 보이지 않으며, 메모리가 필요하면 시스템이 종종 프로세스를 죽일 수 있음.
- Activity가 paused 또는 stopped 일 경우, 시스템의 종료 요청 또는 그냥 프로세스를 죽이는 방식으로 메모리에서 삭제될 수 있음.
   이 경우 사용자에게 다시 보여지려면 완전히 다시 시작해서 기존의 상태를 복원해야 함.

- entire lifetime은 onCreate(Bundle) ~ onDestroy()
   global을 onCreate()에서 설정하고, onDestroy()에서 리소스를 해제.
   ex) 쓰레드를 onCreate()에서 만들고, onDestroy()에서 정지
- visible lifetime은 onStart() ~ onStop()
   리소스를 유지하고 사용자에게 activity를 보여줘야함.
   ex) UI에 영향을 주는 변화를 모니터하기 위해 BroadcastReceiver를 onStart()에서 등록하고 onStop()에서 해제.
   onStart()와 onStop()은 여러번 불려질 수 있음.
- foreground lifetime은 onResume() ~ onPause()
   이 사이에 activity는 다른 모든 activity보다 상위에 있고 사용자와 상호작용함.
   activity는 빈번하게 resume/pause됨.
   ex) device가 sleep모드로 되는 때, activity 결과가 전달될 때, 새 intent가 전달될 때 등. 따라서 이 메소드의 코드는 가벼워야 함.

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

[Hello,Android] 익명의 내부 클래스  (0) 2010.08.17
[Hello,Android] WebView 사용 시  (1) 2010.08.16
[Hello,Android] 기본팁  (0) 2010.06.08
[설치] Hello, World!  (0) 2010.05.11
[설치] Android 개발 환경 설정하기  (0) 2010.04.21

[utils] 문자인식

사는 얘기 2010. 6. 3. 09:31 Posted by galad
스캔해서 문자 등을 인식하는 프로그램

http://rideup.tistory.com/249

아르미
네이버문자인식OCR


'사는 얘기' 카테고리의 다른 글

미칠듯한 디스크액세스  (0) 2011.03.11
ㅋㅋ  (0) 2011.02.14
고양이 이야기  (0) 2010.02.25
역시나 KT, 업계 1위는 절대 못하는구나....  (0) 2009.11.25
Developer Career Path  (0) 2009.11.11
http://mwultong.blogspot.com/2006/05/html-tooltip-tag.html

HTML에서는 title 속성으로 말풍선을 만듭니다.