예전 일본에서 한 2~3주 정도 짬짬히 만들어 본 안드로이드 프로그램입니다.

(이미지 저작권 피하려고, 개인적으로 찍은 사진과, 위키의 타로카드 이미지를 사용했었죠 ㅠㅠ)

 

오랫만에 기억나서 https://play.google.com/apps/publish 로 그동안 통계를 다시 봤는데... 아직 몇몇 분들이 설치해주셔 있군요..

(설치해서 쓰고 있는지, 그냥 설치된채로 버려진 폰인지는... 잘.. ㅠㅠ)

  

아쉽게도 지금 제 현업은 서버프로그래머라, 그냥 옛날에 안드로이드 공부 했다는거에 의의를 두고 있는 작품입니다.

일본에서 밤 12시에 퇴근해서, 이후 새벽 3시까지 저거 혼자 만들면서 즐거워 한 기억이 있네요 (출근이 10시까지였던게..)

 

개발 당시 안드로이드 2.3이 주류 였고, (위의 오른쪽 사진 보시면 ㅠㅠ)

NDK나 그런거 없이 순수 Java 안드로이드 API 작성했었습니다.

 

아마 지금 화면으로 보면 앵크가 깨지고 난리 나지 않았을까 하네요.
하지만 Java , 안드로이드로 뭔가 하나 냈다는거에 의의 두는 앱이였습니다.

 

 

평가를 읽어보니 가슴이 아프더군요... 
그런데... 저걸 공부하기 위해서, 안드로이드 API 익힐겸 만든거라....퀄리티는 제가 생각해도 많이 떨어져요 ㅠㅠ

 

 

 

 

'모바일 프로그래밍 > 안드로이드' 카테고리의 다른 글

안드로이드 종료하는 방법  (0) 2011.07.07
출처 : http://www.androidpub.com/index.php?document_srl=1187851&act=trackback&key=169

<테스트한 코드>

1번> this.finish()

- AndroidManifest.xml 설정 필요 없음

2번> System.out(0)

- AndroidManifest.xml 설정 필요 없음

3번> android.os.Process.killProcess(android.os.Process.myPid());

- AndroidManifest.xml 설정 필요 없음

4번> ActivityManager am = (ActivityManager)activity.getSystemService(Activity.ACTIVITY_SERVICE);
am.restartPackage(activity.getPackageName());

- <uses-permission android:name="android.permission.RESTART_PACKAGES"/>

5번> ActivityManager am = (ActivityManager)activity.getSystemService(Activity.ACTIVITY_SERVICE);
am.killBackgroundProcesses(activity.getPackageName());

- <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

<코드 설명>

1번 2번 3번은 테스트를 해본 결과 똑같은 종료방법이다.

하지만 종료되는 시점에 따라 종료가 될 수 있고 안될 수 있다.

ex1)

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//여기서 1번 2번 3번은 절대 동작 안한다.

onstart에서도 마찬가지이다.

1번 2번 3번으로 종료시키기 위해서는 어떠한 이벤트나 동작이 이루어져야만 작동한다.

한마디로 종료시키는 시점이 중요하다.

ex2)

//A 액티비티

public class A extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent intent = new Intent(this, B.class);
startActivity(intent);

//B 액티비티

public class B extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

//여기서 1번 2번 3번은 절대 동작 안한다.

ex2의 예제는 ex1의 예제와 별다를 것이 없다.

하지만 만약 다른 액티비티를 불러와서 종료시킬 경우

1번 2번 3번을 B의 액티비티에서 쓰려하면 B의 액티비티만 종료된다.

자 그러면 B의 액티비티를 종료시켜보자.

ex3)

public class B extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

Button myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//1번 2번 3번으로 종료가 된다!!!!
}
});

ex3의 코드를 보면 B액티비티(2번째)만 종료가 된다. 클릭 이벤트를 발생시켰기 때문에

시점이란 것이 생겼다. 클릭 이벤트가 종료하게 도와준 것이다.

A의 액티비티도 똑같이 종료시키면 된다.

ex4)

public class A extends Activity {

private int a=1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

if(a==1){
//1번 2번 3번 종료가 된다.
}

ex4번 예제는 if문을 통하여 a변수를 확인하는 시점을 만들어줬다.

A는 종료가 된다.

이런식으로 종료하고 시키고 싶다면 boolean으로 하는것을 추천한다.

true와 false로 선택이 필요한 2가지이니 딱이고,

다른 여러 개발자가 볼때의 입장으로서도 확실하게 이해시키기 편하기 때문이다.

ex5)

//A액티비티

public class A extends Activity {

public static Activity activity; //<==주목하라

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

activity=this;

Intent intent = new Intent(this, B.class);
startActivity(intent);

//B액티비티

public class B extends Activity {

private boolean isB=true;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);

if(isB==true){

A.activity.finish(); //<==1번만 가능. A액티비티만 종료된다.

}

Button myButton = (Button) findViewById(R.id.myButton);
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

//버튼 누르면 1번 2번 3번으로 B액티비티 종료시키기
}
});

ex5예제는 많은 분들이 질문하던 현재의 B액티비티안에서 뒤에 있는 액티비티

죽이는 방법이다. 1번만이 가능할 것이다.

1번 2번 3번으로 종료시켜 여러 어플을 만들다보면 분명 다 종료되고 위젯으로

나왔는데 남아있는 경우가 있다. 특히 Service를 extends 하여 사용하면 무조건

남는 경우가 있다.

남는지 안남는지 확인은 여러 방법이 있겠지만 간편한 마켓무료어플인

advanced task killer free를 써서 확인하고 있다.

이 어플은 어떤 어플이 백그라운드에서 살아있는지 이름을 가르켜준다.

이렇게 남아있으면 socket통신할 때 문제가 생기고(접속을 끊었는데 연결이 계속되있는 현상)

스마트폰에도 프로세스를 계속 읽고 있으니 별로 안좋을 것이다.

이럴 때 4번 5번을 쓰면 해결이 된다.

필자는 보통 마지막 종료되는 액티비티나 서비스의 ondestroy에 항상 써주고 있다.

4번은 2.1버전용(ver7)이고, 5번은 2.2버전용(ver8)이다.

그렇다면 매니패스트에서 <uses-sdk android:minSdkVersion="7" /> 에 따라

써야하나?

답은 NO다.

// 7버전 : <uses-permission android:name="android.permission.RESTART_PACKAGES"/>
// 8버전 : <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

이 2개의 퍼미션은 같이 써도 무방하다.

그렇다면 4번과 5번의 차이점은 무엇인가?

일단 4번은 2.2버전(ver8)에서도 작동한다.

한마디로 4번만 써도 된다.

5번은 한가지 문제가 있다.

2.1버전 API에는 5번의 함수가 없다.

이클립스에서 new->new android project해서 만들때 Build Target 설정할 때의 버전차이에서 나타난다.

2.1버전으로할 경우 5번의 함수는 없다고 나온다.

5번을 쓸 수 있는 방법은 Build target를 2.2이상으로 바꾸면된다.

이클립스에서 default.properties를 열면 target=android-8로 바꾸면된다.

<uses-sdk android:minSdkVersion="8" /> 이 것도 쓸것이면 같은 8로 바꿔줘야한다.

(에러는 안 나지면 다르면 다르다고 표시는 날것이다.)

ex6)

public class A extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//4번 5번은 여기서도 종료가 된다.

4번과 5번은 어떠한 시점에서도 종료가 된다. 한마디로 강제종료다!

+ Recent posts