2011년 6월 20일 월요일

Android - Activity에서 Service 호출하기

상황
어느 Activity 에서 특정 이벤트를 발생 시켰을때 자신이 생성한 Service를 호출 하고 싶은경우

예) 위젯 설정 Activity에서 위젯의 바탕화면 이나, 폰트 등을 설정하였을경우 이게 바로 위젯으로 적용되었으면 하는 경우


Activity와 Service와 호출 하기 위해 aidl 이란걸 사용한다.

1. aidl 정의 (jh/project/widget/digital/biorhythm/IBiorhythmClockService.aidl)


package jh.project.widget.digital.biorhythm;

interface IBiorhythmClockService {
void updateWidgetIF();
}



2. Service에서 aidl Interface 구현, onBind 구현

package jh.project.widget.digital.biorhythm;

public class BiorhythmClockService extends Service{
    ...
    ...
    ...
    public class BiorhythmClockServiceImple extends IBiorhythmClockService.Stub {
@Override
        public void updateWidgetIF() throws RemoteException {
readAgain = true;
updateWidget();
        }
    }

    public IBinder onBind(Intent intent) {
    return new BiorhythmClockServiceImple();
    }

    private void updateWidget() {
       //Do Something
    }
    ...
    ...
    ...
}



3. Activity에서 해당 Interface 호출

package jh.project.widget.digital.biorhythm;

public class Configuration extends{

//Interface, ServiceConnection 정의
private IBiorhythmClockService biorhythmClockService = null;
private ServiceConnection biorhythmClockConn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName p_name) {
biorhythmClockService = null;
}

public void onServiceConnected(ComponentName name, IBinder service) {
biorhythmClockService = IBiorhythmClockService.Stub.asInterface(service);
//callService();
}
};
      
        //binding 시작
protected void onStart() {
super.onStart();
bindService(new Intent(IBiorhythmClockService.class.getName()), biorhythmClockConn, Context.BIND_AUTO_CREATE);
}

        //binding 종료
protected void onStop() {
super.onStop();
unbindService(biorhythmClockConn);
}

//Interface 함수 호출하는 함수
private void callService() {
try {
biorhythmClockService.updateWidgetIF();
} catch(RemoteException e) {
Toast toast = Toast.makeText(this, "ERROR - " + e.getMessage(), Toast.LENGTH_SHORT);
toast.show();
}
}

// 뭔가 이벤트가 발생하면 위에서 만든 함수를 실행해서 Service에 함수를 호출한다.
//(Configuration.onClick() -> Configuration.callService() -> IBiorhythmClockService.updateWidgetIF() -> BiorhythmClockService.updateWidget() 순으로 실행된다.)

public void onClick(View v) {
...
...
...
callService();
...
...
...
}

}


※ 알고있는것을 말, 글로 표현한다는건 엄청 어려운일.
혹시 추가 코멘트나, 잘못된 정보 지적등 댓글 받습니다.

2011년 6월 14일 화요일

Item - 학교종이 땡땡땡

학교 생활에 필요한것들

시간표 (위젯)
과목관리(시험일정, 과제, 기타사항)
조원 관리(단체문자)
중요 메모(위젯)

또 뭐가 있을까...

Android - 어느 Widget에서 Configuration (Activity)를 호출하였나?

위젯을 생성할때 설정 화면(activity) 로 넘어가서 필요 한 데이터들을 설정한 다음에 위젯을 생성하는 경우가 있다.

manifast에

<activity android:name=".Configuration" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


그리고 앱 위젯 프로바이더에

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dip"
    android:minHeight="146dip"
    android:initialLayout="@layout/biorhythm_clock_widget"
    android:configure="jh.project.widget.digital.biorhythm.Configuration"/>

이렇게 설정 해주면 된다.

하지만 다양한 종류의 위젯에서 하나의 설정 화면을 호출하는경우, 필요에 따라서 어느 앱 위젯 프로바이더에서 설정 화면을 호출하였는가가 중요할 때도 있다.

이런 경우에는

설정 화면(activity)의 onCreate(Bundle savedInstanceState) 함수 안에


Intent intent = getIntent();
Bundle extras = intent.getExtras();
   if (extras != null) {
    widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);


      AppWidgetManager manager = AppWidgetManager.getInstance(this);
      String className = manager.getAppWidgetInfo(widgetId).provider.getClassName();
    }
해주면 어느 프로바이더를 통해서 해당 activity가 호출 되었는지 알 수 있다.

2011년 6월 8일 수요일

Java - 1000 단위마다 콤마(,) 삽입하는 펑션

public static String insertComma(String arg){
int j = 0;
String rtnValue = new String();

for (int i = arg.length() - 1 ; i >= 0; i--){
j++;

rtnValue = arg.charAt(i) + rtnValue;
if(i > 0){
if(j == 3){
rtnValue = "," + rtnValue;
j = 0;
}
}
}

return rtnValue;
}

2011년 6월 7일 화요일

SQLite - Date, Time Functions

Functions
date( timestring, modifier, modifier, ...)
time( timestring, modifier, modifier, ...)
datetime( timestring, modifier, modifier, ...)
julianday( timestring, modifier, modifier, ...)
strftime( format, timestring, modifier, modifier, ...)


timestring

YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDD.DDDD

modifier

NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
NNN months (see #551 and [1163] )
NNN years (see #551 and [1163] )
start of month
start of year
start of week (withdrawn -- will not be implemented)
start of day
weekday N (see #551 and [1163] )
unixepoch
localtime
utc



현재의 날짜를 알고 싶으면
select date('now');

현재 기준 20일 후의 날짜를 알고 싶으면
select date('now', '20 days');


현재 기준 20일 이전의 날짜를 알고 싶으면
select date('now', '-20 days');

이렇게 조회를 하면 'YYYY-MM-DD' 형태로 조회가 된다.

특정한 양식으로 조회 결과를 얻는다던가, 아니면 일자, 월, 년도만 따로 조회를 하고 싶다면, strftime을 사용하면 된다.

strftime 함수의 format 파라미터에 아래 파라 미터들을 조합해서 원하는 형태로 날짜, 시간을 조회 할 수 있다.

%d  day of month
%f  ** fractional seconds  SS.SSS
%H  hour 00-24
%j  day of year 001-366
%J  ** Julian day number
%m  month 01-12
%M  minute 00-59
%s  seconds since 1970-01-01
%S  seconds 00-59
%w  day of week 0-6  sunday==0
%W  week of year 00-53
%Y  year 0000-9999
%%  %

현재 일시를 'YYYY/MM/DD HH24:MI' 형태로 조회하고 싶다면
select strftime('%Y/%m/%d %H:%M', 'now');


2011년 6월 3일 금요일

Android - Custom ListView

use LayoutInflater


LayoutInflater


This class is used to instantiate layout XML file into its corresponding View objects. It is never be used directly -- usegetLayoutInflater() or getSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on.
(http://developer.android.com/reference/android/view/LayoutInflater.html)



아래 구성 요소들이 필요하다
1. LIST를 구성하는 ROW의 LAYOUT FILE(layout 폴더에 위치, XML)
2. LIST의 내용이 되는 데이터 클래스
3. LIST에 VIEW를 제공하는 ArrayAdapter 상속 클래스



각각 파일 예제


1. ROW의 LAYOUT(layout/add_row.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:minHeight="60dp"
android:orientation="horizontal"
>
    <LinearLayout android:layout_marginRight="10dp"
          android:layout_height="wrap_content"
          android:id="@+id/linearLayout2"
          android:layout_marginBottom="10dp"
          android:layout_marginTop="10dp"
          android:layout_width="fill_parent"
          android:orientation="horizontal">
        <ImageView android:src="@drawable/icon"
                  android:id="@+id/list_view_row_add_row_icon"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center_vertical"></ImageView>
        <TextView android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:id="@+id/list_view_row_add_row_name"
                  android:text="name"
                  android:layout_gravity="center_vertical"
                  android:textSize="25dp"
                  android:paddingLeft="5dp"></TextView>
    </LinearLayout>

</LinearLayout>

2. DATA 클래스(ActionDTO.java)

import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.view.View.OnClickListener;

public class ActionDTO {

private Drawable icon;
private String title;

public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}


3. ArrayAdapter(AddListViewAdapter.java)


import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AddListViewAdapter extends ArrayAdapter<ActionDTO>{
private Context context;
private int layout;
private ArrayList<ActionDTO> actionList;
private LayoutInflater layoutInflater;


public AddListViewAdapter(Context context, int textViewResourceId, ArrayList<ActionDTO> objects) {
super(context, textViewResourceId, objects);
// TODO Auto-generated constructor stub
this.context = context;
this.layout = textViewResourceId;
this.actionList = objects;
                //LayoutInflater 생성
this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ActionDTO action = actionList.get(position);

if(convertView == null){
                        //xml 파일로 정의된 layout 을 View 클래스로 변환
convertView = layoutInflater.inflate(layout, null);
}

if(action != null){
                        //convertView 라는 View 오브젝트를 이용해서 각각의 콤포넌트를 컨트롤
TextView tvName = (TextView) convertView.findViewById(R.id.list_view_row_add_row_name);
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.list_view_row_add_row_icon);

tvName.setText(action.getTitle());
imgIcon.setImageDrawable(action.getIcon());
}

return convertView;
}
}



4. 실제 사용 예제


//listview, arraylist, adapter 초기화
ListView lstActionList = (ListView)findViewById(R.id.list_add);
ArrayList<ActionDTO> arrActionList = new ArrayList<ActionDTO>();
AddListViewAdapter adptActionList = new AddListViewAdapter(this, R.layout.add_row, arrActionList);

//adapter 세팅
lstActionList.setAdapter(adptActionList);

//list의 내용을 채울 ArrayList 작성

res = this.getResources();
ActionDTO action = new ActionDTO();
action.setTitle("ADD");
action.setIcon(res.getDrawable(android.R.drawable.ic_input_add));
arrActionList.add(action);

//listview refresh(?)
adptActionList.notifyDataSetChanged();


Android - Icon Size



ldpi (120 dpi)
(Low density screen)
mdpi (160 dpi)
(Medium density screen)
hdpi (240 dpi)
(High density screen)
xhdpi (320 dpi)
(Extra-high density screen)
Launcher Icon Size36 x 36 px48 x 48 px72 x 72 px96 x 96 px



Download the Icon Templates Pack for Android 4.0

from http://developer.android.com/guide/practices/ui_guidelines/icon_design.html