Notice
Recent Posts
Recent Comments
Link
관리 메뉴

설.현.아빠

안드로이드를 종료시키는 여러가지 방법 테스트. 본문

안드로이드/Kill Process

안드로이드를 종료시키는 여러가지 방법 테스트.

설.현.아빠 2011. 2. 11. 10:43



<테스트한 코드>

 

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

 

[출처] http://www.androidpub.com/1187851 안드로이드펍-아나포콜라님 강좌

Comments