서비스에서
Intent intent = new Intent(mService.this, intentShow.class);
startActivity(intent);
방법 알고 계신분 해결방법좀 알려주세요~
public class mService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Intent intent = new Intent(mService.this, intentShow.class);
startActivity(intent);
}
Service 에서 Activity 를 Launch 하기 위해서는 FLAG_ACTIVITY_NEW_TASK 를 사용하셔야 합니다. (기존에 존재하는 Task가 없음으로...)
Intent intent = new Intent(mService.this, intentShow.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
2011년 2월 14일 월요일
2011년 2월 10일 목요일
jpa blob 저장
지난 번에 "Spring과 Hibernate에서 Blob Object 처리하기"에서 파일같은 바이너리를 database에 blob으로 저장하기 위한 방법을 살펴봤습니다. 이 글에서 왜 파일같은 바이너리를 java 객체의 멤버로 byte[]를 쓰면 위험한지도 설명했습니다. 그런데 Spring에서 hibernate를 JPA로 사용하려다보니, hibernate sessionFactory에 lobHandler를 설정(inject)해야 하는데 JPA에서는 entityManager 설정만 있어 lobHandler를 JPA 엔진인 hibernate에 전달할 방법이 마땅치 않았습니다.
JPA 표준 API로 작업하려다 보니 hibernate와 같은 벤더 특정 기능이나 API를 사용하는데 어려움이 있네요. 그래서 JPA에서 blob을 스트림으로 처리하기 위해서 다음과 같이 했습니다.
표준 API를 이용하자
Java 객체(JPA를 사용하니 entity bean이 되겠네요)의 binary 부분을 Blob 타입으로 정의합니다.
@Lob
@Column(name = "PHOTO")
private Blob photo;
/**
* @return the photo
*/
public Blob getPhoto() {
return photo;
}
/**
* @param photo the photo to set
*/
public void setPhoto(Blob photo) {
this.photo = photo;
}
/**
* Returns the photo Input Stream.
* @return InputStream
* @throws SQLException e
*/
public InputStream getPhotoContent() throws SQLException {
if (getPhoto() == null) {
return null;
}
return getPhoto().getBinaryStream();
}
/**
*
* @param sourceStream - Photo source input stream
* @throws IOException e
*/
public void setPhotoContent(InputStream sourceStream) throws IOException {
setPhoto(Hibernate.createBlob(sourceStream));
}
EntityManager로 저장합니다.
...
MyFileContent fileContent = new MyFileContent();
fileContent.setPhotoContent(new FileInputStream(file));
em.persist(fileContent);
...
도메인 객체에 java.sql 패키지라니...
POJO를 지향하는 사람들은 위의 Java 객체의 멤버로 java.sql.Blob 타입을 사용하는 것에 불편함을 느낄수도 있을 겁니다. 그 이유는 JPA나 hibernate와 같이 저장을 위한 객체를 순수한 도메인 객체로 보는 시각때문인데, 도메인 객체에 java.sql 과 같은 기술적인 패키지가 들어와 오염시키는 것 때문에 불편할 겁니다.
그러나 저장을 위한 객체를 진정한 의미의 도메인 객체인지 생각해 볼 필요가 있습니다. 그리고 도메인 객체가 뭘 의미하는 것도 생각해 볼 필요가 있습니다.
Entity Bean이나 hibernate annotation이 잔뜩 붙은 java 객체는 database 저장이 주 목적인 객체입니다. 특히 관계형 DB에 저장하는 것이 주된 목적이죠. 이런 객체에 더 많은 의미(핵심 비즈니스)를 넣으려는 시도는 슈퍼 울트라 객체를 하나 더 탄생시킬 뿐입니다. 그냥 그 목적에 충실하게 쓰는 편이 좋습니다.
JPA 표준 API로 작업하려다 보니 hibernate와 같은 벤더 특정 기능이나 API를 사용하는데 어려움이 있네요. 그래서 JPA에서 blob을 스트림으로 처리하기 위해서 다음과 같이 했습니다.
표준 API를 이용하자
Java 객체(JPA를 사용하니 entity bean이 되겠네요)의 binary 부분을 Blob 타입으로 정의합니다.
@Lob
@Column(name = "PHOTO")
private Blob photo;
/**
* @return the photo
*/
public Blob getPhoto() {
return photo;
}
/**
* @param photo the photo to set
*/
public void setPhoto(Blob photo) {
this.photo = photo;
}
/**
* Returns the photo Input Stream.
* @return InputStream
* @throws SQLException e
*/
public InputStream getPhotoContent() throws SQLException {
if (getPhoto() == null) {
return null;
}
return getPhoto().getBinaryStream();
}
/**
*
* @param sourceStream - Photo source input stream
* @throws IOException e
*/
public void setPhotoContent(InputStream sourceStream) throws IOException {
setPhoto(Hibernate.createBlob(sourceStream));
}
EntityManager로 저장합니다.
...
MyFileContent fileContent = new MyFileContent();
fileContent.setPhotoContent(new FileInputStream(file));
em.persist(fileContent);
...
도메인 객체에 java.sql 패키지라니...
POJO를 지향하는 사람들은 위의 Java 객체의 멤버로 java.sql.Blob 타입을 사용하는 것에 불편함을 느낄수도 있을 겁니다. 그 이유는 JPA나 hibernate와 같이 저장을 위한 객체를 순수한 도메인 객체로 보는 시각때문인데, 도메인 객체에 java.sql 과 같은 기술적인 패키지가 들어와 오염시키는 것 때문에 불편할 겁니다.
그러나 저장을 위한 객체를 진정한 의미의 도메인 객체인지 생각해 볼 필요가 있습니다. 그리고 도메인 객체가 뭘 의미하는 것도 생각해 볼 필요가 있습니다.
Entity Bean이나 hibernate annotation이 잔뜩 붙은 java 객체는 database 저장이 주 목적인 객체입니다. 특히 관계형 DB에 저장하는 것이 주된 목적이죠. 이런 객체에 더 많은 의미(핵심 비즈니스)를 넣으려는 시도는 슈퍼 울트라 객체를 하나 더 탄생시킬 뿐입니다. 그냥 그 목적에 충실하게 쓰는 편이 좋습니다.
2011년 2월 8일 화요일
안드로이드 진동 처리
먼저 각 모드에 대한 이벤트를 받기 위해서는AudioManager를 사용하여야 합니다.
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
switch(aaudioManagerm.getRingerMode()){
case AudioManager.RINGER_MODE_SILENT:
//무음 모드
break;
case AudioManager.RINGER_MODE_VIBRATE:
//진동 모드
break;
case AudioManager.RINGER_MODE_NORMAL:
//벨소리 모드
break;
}
위와 같이 각 모드일때 이벤트를 받아서 원하시는 동작을 하시면 됩니다.
여기에 추가적으로 특정 이벤트에서 진동을 하기위한 방법을 하나더 적어봅니다.
Vibrator를 이용하여 진동이벤트를 줄 수 있습니다.
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(시간);
시간은 1000이 1초의 값을 나타냅니다.
Vibrator에 원하는 시간값을 주면 그 '시간'만큼 진동이 울리게 됩니다.
[출처] 안드로이드사이드 - http://www.androidside.com/B46/13214
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
switch(aaudioManagerm.getRingerMode()){
case AudioManager.RINGER_MODE_SILENT:
//무음 모드
break;
case AudioManager.RINGER_MODE_VIBRATE:
//진동 모드
break;
case AudioManager.RINGER_MODE_NORMAL:
//벨소리 모드
break;
}
위와 같이 각 모드일때 이벤트를 받아서 원하시는 동작을 하시면 됩니다.
여기에 추가적으로 특정 이벤트에서 진동을 하기위한 방법을 하나더 적어봅니다.
Vibrator를 이용하여 진동이벤트를 줄 수 있습니다.
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(시간);
시간은 1000이 1초의 값을 나타냅니다.
Vibrator에 원하는 시간값을 주면 그 '시간'만큼 진동이 울리게 됩니다.
[출처] 안드로이드사이드 - http://www.androidside.com/B46/13214
피드 구독하기:
글 (Atom)