2011년 5월 31일 화요일

Android - Quick Action Dialog

Check below
http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/

2011년 5월 30일 월요일

잡담 - 과유불급(過猶不及)

과유불급 [過猶不及]

 - 지나친 것은 미치지 못한 것과 같다는 뜻. (출처 : 네이버 백과사전)


무엇이든 항상 극으로 치닫는 시대
"적당히"의 미덕이 필요한시기

2011년 5월 26일 목요일

Java - java.util.Calendar

Calendar c = Calendar.getInstance(); 


// how to get current date
int year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH);
//JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER

int day = c.get(Calendar.DATE); 

int week = c.get(Calendar.DAY_OF_WEEK); 
//SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, and SATURDAY. 

int hour = c.get(Calendar.HOUR); 

int minute = c.get(Calendar.MINUTE); 

int ampm = c.get(Calendar.AM_PM); 
//AM, PM
....
....
....



//how to calculate days between from date and to date

Calendar c2 = Calendar.getInstance();

c2.set(Calendar.YEAR, 1980);
c2.set(Calendar.MONTH, 9);
c2.set(Calendar.DATE, 17); // my BirthDay!!!!

//void set(int field, int value) 
//can use other "set" method (e.g. set(int year, int month, int day), ...)

long gap = c.getTimeInMillis() - c2.getTimeInMillis();
// "getTimeInMillis" returns milliseconds


System.out.println(String.valueOf((int)(gap / 86400000)));
// 1day = 86400000 milliseconds


can use when calculate D-Day, Biorhythm...

2011년 5월 23일 월요일

Java -Thread

자세한 개념은 생략

1. 구현 방법 두가지가 있음
  (1) Thread 클래스 상속
     public MyThread extends Thread{
          public voic run(){
               System.out.println("Hello World");
          }

          public static void main(String[] args){
               (new MyThread()).start();
          }
     }

  (2) Runnable 인터페이스 구현
     public MyRunnable implements Runnable{

          public voic run(){
               System.out.println("Hello World");
          }

          public static void main(String[] args){
               (new Thread(new MyRunnable())).start();
          }

     }

   공통점 - run() 에 구현하고  start()로 실행한다.
   차이점 - (1)은 상속 (2)는 구현, 다른 클래스를 상속하는 Thread를 사용하고 싶으면 (2)번 방법을 쓸 수 밖에 없다.


2. 주요 method
  (1) sleep(int millisec)
    millisec( 1/1000초 1초 = 1000 밀리세컨즈) 만큼 thread를 재우고 다른 thread를 수행한다.
    e.g. for (int i = 0; i < importantInfo.length; i++) {
         try {
             Thread.sleep(4000);
         } catch (InterruptedException e) {
             //We've been interrupted: no more messages.
             return;
         }
         //Print a message
         System.out.println(importantInfo[i]);
     }
    출처 - http://download.oracle.com/javase/tutorial/essential/concurrency/sleep.html


  (2) join()
     해당 thread가 완료될때까지 기다리게 한다. 시간을 설정 할 수도 있다.
     e.g. myThread.join(); // myThread가 완료될때까지 다른  thread는 멈춘다.

2011년 5월 20일 금요일

Item - 바이오리듬

1906년 독일의사 프리즈가 발견
출생일을 기점으로 신체리듬, 감성리듬, 지성리듬 세가지가 변화를 보임으로써 인간의 컨디션 및 삶에 영향을 미친다는 것을 발견

1. 신체리듬(physical) - 신체가 얼마나 외부의 물리적인 변화에 잘 적응하고 이겨내는가, 질병에 대한 면역력, 체내 기관의 기능(23일 주기)
0, 26, 51, 73, 88, 97, 99, 94, 81, 63, 39, 13, -13, -39, -63, -81, -94, -99, -97, -88, -73, -51, -26


2. 감성리듬(emotional) - 인간의 감성을 나타냄, 자신의 기분이나 기분을 좌우하는 신경계 상태 (28일 주기)
0, 22, 43, 62, 78, 90, 97, 100, 97, 90, 78, 62, 43, 22, 0, -22, -43, -62, -78, -90, -97, -100, -97, -90, -78, -62, -43, -22

3. 지성리듬(intellectual) - 인간의 두뇌활동을 알아 볼 수 있음 (33일 주기)
0, 18, 37, 54, 69, 81, 90, 97, 99, 98, 94, 86, 75, 61, 45, 28, 9, -9, -28, -45, -61, -75, -86, -94, -98, -99, -97, -90, -81, -69, -54, -37, -18


참고 http://60gabja.com/bio/013_modujobio.php3

Android - Mastering Android Widget Development

WHAT A NICE !

from - http://www.helloandroid.com/tutorials/mastering-android-widget-development-part1
from - http://www.helloandroid.com/tutorials/mastering-android-widget-development-part2

2011년 5월 19일 목요일

Android - about Battery BroadcastReceiver...

public void onReceive(Context arg0, Intent intent){
  int level = intent.getIntExtra("level", 0);
  int scale = int.getIntExtra("scale", 100);

  System.out.println(String.valueOf((level / scale) * 100) + "%");


  int plugType = intent.getIntExtra("plugged", 0);

  /*
  plugType is
     BatteryManager.BATTERY_PLUGGED_AC
     or  BatteryManager.BATTERY_PLUGGED_USB
  */

  int status = intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN);

  /*
  status is
     BatteryManager.BATTERY_STATUS_CHARGING
     or BatteryManager.BATTERY_STATUS_DISCHARGING
     or BatteryManager.BATTERY_STATUS_FULL
     or BatteryManager.BATTERY_STATUS_NOT_CHARGING
     or BatteryManager.BATTERY_STATUS_UNKNOWN
  */

  int temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
/*
temp / 10 = degrees celsius
*/
}

2011년 5월 18일 수요일

Android - Widget(Remoteview)에 onClick 적용하기

AndroidManifest.xml - intent-filter에 해당 액션을 정의 해준다.

<intent-filter>

                <action android:name="jh.project.widget.digital.third.action.CLICK" />
</intent-filter>



source.java (AppWidgetProvider 에서 돌릴 service) - Remoteview에 onClick시 Pending Intent를 정의하고, onStart에 구현한다.

        static final String ACTION_CLICK = "jh.project.widget.digital.third.action.CLICK";

    public void onCreate() {
        RemoteViews views = new RemoteViews(getPackageName(), R.layout.main);

        Intent newIntent = new Intent();
        newIntent.setAction(ACTION_CLICK);
        PendingIntent pIntent = PendingIntent.getService(this, 0, newIntent, 0);
        views.setOnClickPendingIntent(R.id.imgin /*(event를 적용할 componet - e.g. ImageView)*/, pIntent);
    }


    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
     
        if (ACTION_CLICK.equals(intent.getAction())) {
         updateWidget();
        }
     
     
    }


맞나?? ㅋㅋ

Android - Battery 잔량 표시

private TextView contentTxt;

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        
        contentTxt = new TextView(this);
                
        setContentView(layout);
        layout.addView(contentTxt);
        
      this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    }

    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
  int ratio = (level * 100) / scale;
contentTxt.setText(String.valueOf(ratio) + "%");
}
};

Android - File 접근 및 한글 깨짐문제

File 위치 - res/raw
raw폴더는 새로 만들어야 한다.
나중에 파일에 접근할때는 "R.raw.파일명" 으로 Resource ID를 구할 수 있다.

한글 깨짐 - InputStreamReader 생성시 뒤에 인코딩 타입을 적어주면 된다.



try{
  //파일명 : raw/code.csv
InputStream in = getResources().openRawResource(R.raw.code);
InputStreamReader inr = new InputStreamReader(in, "euc-kr");
BufferedReader reader = new BufferedReader(inr);
String str;
int i;
StringBuffer buf = new StringBuffer();
try{
while((str = reader.readLine()) != null){
buf.append(str + "\n");
}
}catch(IOException e1){
e1.printStackTrace();
}

try{
in.close();
Log.w("TEXT", buf.toString());
}catch(IOException e){
e.printStackTrace();
}
}catch(Exception e){
Log.w("ERROR", e.toString());
}

Android - android:gravity / android:layout_gravity


android:gravity 또는 android:layout_gravity 속성은 다음과 같은 값으로 설정이 가능하다. 복수의 값을 설정할 시 | 사용. (ex. right|bottom)
  • top: 객체를 컨테이너 위쪽 한계로 밀기. 객체의 사이즈 변동 없음.
  • bottom: 개체를 컨테이너 밑 한계로 밀기. 객체의 사이즈 변동 없음.
  • left: 객체를 컨테이너 왼쪽 한계로 밀기. 객체 사이즈 변동 없음.
  • right: 객체를 컨테이너 오른쪽 한계로 밀기. 객체 사이즈 변동 없음.
  • center_vertical: 객체를 컨테이너의 수직 중심에 배치. 사이즈 변동 없음.
  • fill_vertical: 객체를 컨테이너 높이만큼 상하 확대해 상하로 꽉 차게 배치.
  • center_horizontal: 객체를 컨테이너의 수평 중심에 배치. 사이즈 변동 없음.
  • fill_horizontal: 객체를 컨테이너 넓이만큼 좌우 확대하여 좌우로 꽉 차게 배치.
  • center: 객체를 컨테이너의 수직/수평 중심에 배치. 사이즈 변동 없음.
  • fill: 객체를 컨테이너의 크기만큼 수직/수평 확대하여 컨테이너를 완전히 꽉 채우도록 함.
  • clip_vertical: 객체의 상하 길이가 컨테이너보다 클 경우. 위아래로 튀어나오는 부분을 잘라냄. top|clip_vertical의 경우 아래쪽에 튀어나오는 객체가 잘려짐. bottom|clip_vertical의 경우 위쪽에 튀어나오 객체가 잘려짐. center_vertical|clip_vertical의 경우 위, 아래 튀어나온 부분 모두 잘림.
  • clip_horizontal: 객체가 좌우 길이가 컨테이너보다 클 경우, 좌우로 튀어나오는 부분을 잘라냄. right|clip_horizontal의 경우 왼쪽으로 튀어나온 부분이 잘리며, left|clip_horizontal의경우 오른쪽으로 튀어나온 부분이 잘린다. center_horizontal|clip_horizontal의 경우 컨테이너 좌우로 튀어나온 부분 모두 잘라냄.


Android - 유료 어플 등록 (유료 개발자 등록)

google 계정, adsense 계정 있어야함

1. 안드로이드 개발자 등록 -> https://market.android.com/publish/signup

2. Edit Profile로 이동 하여 Account Type 항목에 "Setup a Merchant Account..." 클릭

3. 정보 입력 후 adsense id 입력

끝~

2011년 5월 17일 화요일

Android - Eclipse 에서 proguard 사용하기

eclipse에서 엄청 간단하게 사용 가능함

자세히 알고 싶으면  http://developer.android.com/guide/developing/tools/proguard.html


ADT를 8.0.1 이후 버전으로 업그레이드

프로젝트를 생성하면 자동으로 생성되는 default.properties 를 열어서

 proguard.config=proguard.cfg

를 추가해주면 된다




.......고 한다.

간혹 소스 상태에선 잘 돌아가던 프로젝트가 apk 파일로 export 후 에러가나는 경우가 있는데

요 프로 가드란 놈이 난독화, 최적화 하는 과정에서 실제 사용하는 코드를  제거하는 경우가 발생하여 문제가 되기도 한다.

아래 글은 본인이 겪은 aidl을 사용했을경우 nullpointerexception 이 발생하는 경우를 정리한 내용이다.
http://purepleya.blogspot.com/2011/07/android-apk-export.html



귀찮아서 아직 안해봤음.

Java - String.substring Method

1. public String substring(int startIndex)
   - startIndex 부터 끝까지의 문자열을 반환 한다.

    String a = "1234567";

    System.out.println(a.substring(2));
    ==>>"34567"

    String a = "1234567";
    System.out.println(a.substring(3));
    ==>>"4567"



    String a = "1234567";
    System.out.println(a.substring(4));
    ==>>"567"




2. public String substring(int startIndex, int endIndex)

   - startIndex 부터 endIndex 까지(endIndex를 포함하지 않음) 문자열을 반환한다.
    String a = "1234567";
    System.out.println(a.substring(1, 3));
    ==>>"23"



    String a = "1234567";
    System.out.println(a.substring(4, 5));
    ==>>"5"

    String a = "1234567";
    System.out.println(a.substring(0, 5));
    ==>>"12345"