출처 : 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번은 어떠한 시점에서도 종료가 된다. 한마디로 강제종료다!

<이클립스 디버그 방법>


1. 톰켓서버를 먼저 실행


2. 라인에 더블클릭하면 파란 동그라미 생긴다. 여기서 부터 디버그를 하겠다는 표시


3. 웹어플사이트에 액션을 수행하면
    창이 뜨고 확인 누르면된다.
    그러면 디버그 모드로 간다


4. F6은 한줄씩디버그 하기

   오른쪽 위에 variable 과 병행하면서 코드를 본다.


5. F5는 안에 있는 메소드로 들어가고 싶을때 사용.
    그리고 들어가면 다시 F6으로 한줄씩 디버깅체크


6. F7은 중도에 다시 돌아가고 싶을 때

    F8은 한번에 검사하고 싶은곳을 같이 보고싶을 때


7. 한가지 변수에만 검사하고싶다.

    블럭해서 오른쪽 마우스클릭 후 watch 선택


--------------------------------------------


<이클립스 자주쓰는 단축키 및 기술>


 Code Assist :  Ctrl + Space (자동으로 이클립스 코드 보여주는 기능)

 Quick Fix : Ctrl + 1 (에러시 빨간에러표시시 Ctrl + 1 을 누르면 방법 제시)

 Quick Hierarchy : Ctrl + T (계층 구조 보기)
 
 Quick Outline : Ctrl + O (아웃라인구조 보기)

 Source Code Navigation : F3, Alt + Forward

    메소드를 들어가 보고싶을때(ctrl을 누르고 클릭해도가능)
    Alt + Back 다시 돌아갈때

 Line move : Ctrl + L (라인 이동)
 
 Mark Occurrences : 형광등 기능. 관련된 것에 같은색으로 표시됨.

 Search : Ctrl + F (소스내 검색기능)
   Ctrl + H (파일이나 자바나 플러그인 등 검색시)

 Comment : Ctrl + /   (블럭 지정하여 자동으로 주석 처리하기)

 Import : Ctrl + Shift + O (import 에러시 필요한 정보를 제시하여준다)

출처 : Tong - icircle님의 프로그램통

'C/C++언어' 카테고리의 다른 글

ASSERT(), VERIFY(), TRACE()  (0) 2008.03.04
템플릿 사용한 max 만들기  (0) 2008.03.03
printf 문을 만들어보자  (0) 2008.01.28
여러 C++ 컴파일러  (0) 2007.09.06
함수포인터란 ?  (0) 2007.09.06

+ Recent posts