안드로이드 개발2011.02.17 15:56
안드로이드 어플을 개발하면서

Activity중 어느 Activity가 현재 최상위에 나와있는지 조건문으로 확인을 하려고 했는데,

어디서 봐야할지를 몰라서 고민하던중 찾은 방법이다.

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> Info = am.getRunningTasks(1);
ComponentName topActivity = Info.get(0).topActivity;
String topactivityname = topActivity.getPackageName();

해당 소스를 작성한뒤

Log.d(TAGNAME, topactivityname);

위와 같이 로그를 찍어보면 최상위 Activity 명이 나오게 된다.

p.s : 위의 사항을 그냥 실행하려고 하면 에러가 발생하게 된다.
        Manifest 에서 아래의 user permission을 추가해 주어야 한다.
        android.permission.GET_TASKS
Posted by 해악사마
안드로이드 개발2011.02.16 15:30
안드로이드 앱을 만들면서 앱자체가 죽어버리지는 않는데, LogCat 상에서 붉은색 글씨로

Finalizing a Cursor that has not been deactivated or closed. 이라는 메시지가 나왔다.

검색을 해보았더니 메모리 릭이 발생하는 부분이라서 어찌되었든 수정이 필요한 부분이었다.


처음에는 단순히

try {
} catch(SQLException e){} 정도로만 처리해주면 될 줄 알았는데, try 문 안에 넣어줘도 결과는 마찬가지였다.

소스를 전체적으로 다시 보면서

커서 사용시 닫아줘야 하는데 실제로 안닫아 주고 그냥 넘어간 부분들이 많았다.

예를 들면
Cursor mCursor = null;
mCursor = mDb.query(true, DATABASE_TABLE, new String[]{"test"},"test" + "=" + 'hi', null, null, null, null, null);
mCursor.close();

이런식으로 그냥 Cursor 사용이 끝났으면 .close();로 닫아주기만 하면 된다.

일단 해당 에러로 어플이 죽지 않는다면 자칫 넘어가기 쉬운 일이지만 차후에 메모리 릭이라던가 하는 부분으로 귀찮을 수

있는 부분이니 잘 꼭 잡고 넘어가야겠다.
Posted by 해악사마
안드로이드 개발2011.02.08 13:22
이미지 기본상태와 Press 상태에 따라서 다른 효과를 보여주고 싶었는데,
소스에서 하나하나 조건식으로 하려니까 별로 좋은거 같지 않았는데,
쉬운 방법을 찾았다.

xml 파일을 drawable 폴더쪽에 하나 생성해서 쓰면 되는데

아래와 같은 방식으로 만들어서 넣으면 되고, 이후에 이미지 버튼을 선언할때
ImageButton btn = (ImageButton) findViewById(R.id.생성한xml파일) 식으로 선언해 주면 된다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Pressed -->
    <item android:state_pressed="false" android:drawable="@drawable/누르지 않았을때 보여질 이미지" />
    <item android:state_pressed="true" android:drawable="@drawable/Press시 보여질 이미지" />
</selector>
Posted by 해악사마
안드로이드 개발2011.02.01 14:07
안드로이드를 개발하면서, 당연스럽게도 Thread를 사용하여 패킷을 일정간격으로 체크해서
패킷이 들어왔을때 동작하도록 프로그램을 짰다.

당연히 잘 될줄 알았는데... 에러를 뿜으면서 전혀 되지를 않는것이었다..

무엇때문인지 보았더니 Thread 내부에서 변경된 내용을 UI에 보여주는 부분에서
계속 프로그램이 죽어버렸다.

인터넷 서핑을 통해서 왜 그런지 알게 되었는데

"안드로이드 에서는 UI Thread 이외의 Thread 에서 UI를 바꿀수 없다" 라는게 문제같았다...

결국 찾은 방법은 unOnUiThread 를 사용하는 방법이었는데.. 해당 내용을 Thread 내부에 넣고
UI 변경하는 부분을 해당 구문 안에서 실행하게 했더니 에러가 없이 잘 돌아가게 되었다.


runOnUiThread(new Runnable(){ // 안드로이드에서 Ui 쓰레드에서만 UI를 바꿀 수 있음.
@Override
public synchronized void run(){
// 실제 UI 뿌리는 과정
}
});


아직도 갈길이 멀기만한 안드로이드 ~!
Posted by 해악사마