본문 바로가기
Android

IntentFlag

by hiro1983 2016. 8. 8.

IntentFlag는 Activity간의 이동시 Activity 스택을 컨트롤(?) 하기 위해 사용한다.


Flag의 종류는 엄청 많기에 자세한 내용은 아래 사이트를 참조하자.

https://developer.android.com/reference/android/content/Intent.html


많은 Flag 중 2가지 FLAG_ACTIVITY_SINGLE_TOP과 FLAG_ACTIVITY_CLEAR_TOP에 대해 메모를 하고자 한다.


FLAG_ACTIVITY_SINGLE_TOP

자기 자신을 호출시(새로고침) 새로운 Activity를 스택에 올리지 않는다. (본인을 재사용한다.)


FLAG_ACTIVITY_CLEAR_TOP

호출 된 Activity를 제외한 모든 Activity를 스택에서 삭제한다. (단, MainActivity는 삭제하지 않는다.)


기본적으로 FLAG를 비선언시 Activity는 계속 스택에 쌓인다.

(심지어 같은 Activity를 계속 호출하면 중복으로 계속 쌓인다...)


눈으로 보기에는 실행시 별문제는 없지만..

스택에는 계속 쓰레기가 쌓여서 성능에 좋지 않은 영향을 미친다.


간단한 예제를 만들어보자.

MainActivity와 SubActivity 2개의 Activity가 존재하는 예제이다.


MainActivity.java

package net.hellohiro.intentflag;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private static int mCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCount++;
    }

    public void onSubActivity(View v) {
        Intent intent = new Intent(getBaseContext(), SubActivity.class);
        intent.putExtra("mCount", mCount);
        startActivity(intent);
    }
}


activity_main.xml



    



SubActivity.java

package net.hellohiro.intentflag;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        TextView textView = (TextView)findViewById(R.id.tvCount);
        Intent intent = getIntent();
        int mCount = intent.getIntExtra("mCount", 0);

        textView.setText("mCount : " + mCount);
    }

    public void onMainActivity(View v) {
        Intent intent = new Intent(getBaseContext(), MainActivity.class);
        startActivity(intent);
    }
}


activity_sub.xml




    


위는 NoFlag의 상태이다. 앱을 실행해서 MainActivity와 SubActivity를 왔다, 갔다하면 Activity 스택에 중복으로 계속 쌓이는 것을 확인 할 수 있다.  (Activity 스택의 확인 방법은 아래와 같다.)


 1. cmd창을 열고 adb.exe 경로로 이동한다. (SDK 하위 디렉토리 중 platform-tools에 존재한다.)

 2. adb shell dumpsys activity activities 입력 후 엔터.


이런 저런 내용이 있는데...그 중 우리가 궁금한건 아래의 빨강박스를 보자.


Activity들이 중복되서 스택에 올라간 것을 확인이 가능하다.


SubActivity 이동시 Flag값을 추가해보자.

    public void onSubActivity(View v) {
        Intent intent = new Intent(getBaseContext(), SubActivity.class);
        intent.putExtra("mCount", mCount);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

NoFlag 상태와 별반 다를 것이 없다. (adb shell dumpsys activity activities를 다시 실행해보면 확인 가능하다.)


Flag를 FLAG_ACTIVITY_CLEAR_TOP으로 변경해보자.

중복으로 생성되던 Activity들이 사라졌다. (기능적으로는 변동 된 것은 없다.)


FLAG_ACTIVITY_CLEAR_TOP에 대한 설명처럼 실행이 되었다.

여기서 주의해야 할 것은 MainActivity는 기존에 있던 것을 재사용 하는 것이 아닌 새로 생성하는 것이다.

mCount의 숫자가 올라간다는 것은 MainActivity의 onCreate가 호출 된다는 뜻 이다.


그럼 MainActivity의 onCreate가 실행되지 않게 하려면 (기존 MainActivity를 재사용 하려면...) 어떻게 해야 하나?

아래와 같이 Flag값을 수정하자.

    public void onSubActivity(View v) {
        Intent intent = new Intent(getBaseContext(), SubActivity.class);
        intent.putExtra("mCount", mCount);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

mCount의 숫자가 더 이상 올라가지 않는다. (MainActivity의 onCreate 호출 되지 않는다.)


제일 간단한 방법은 SubActivity에서 finish()를 호출하면 된다...(하지만 난 Intent 공부 중 이니까 ~~)


'Android' 카테고리의 다른 글

Spinner  (0) 2016.08.10
ListView  (0) 2016.08.10
Extra - PutExtra, getExtra  (0) 2016.08.05
startActivityForResult  (0) 2016.08.05
IntentFilter - 전화걸기  (0) 2016.08.05