본문 바로가기
App/Android Studio

Android Studio - 태스크, 인텐트 플래그

by 코젼 2022. 8. 10.
728x90
반응형

2022-08-10(38일차)



💡태스크

◾ 액티비티들은 시작되면서 태스크라고 불리는 액티비티 스택에 쌓이게 되고 BackKey로 이전으로 이동하면 최상위 액티비티는 스택에서 빠져나오면서 소멸된다.

📌launchMode 속성
🔸standard
◾ 기본, 여러 개의 인스턴스가 하나의 태스크에 생길 수도 있고 다른 태스크에 생길 수도 있다.

🔸singleTop
◾ 액티비티가 현재 태스크 최상위일 때 새로 인스턴스가 생기지 않고 onNewIntent()가 호출된다.

🔸singleTask
◾새 태스크의 루트 액티비티로 인스턴스를 새롭게 생성한다. 하지만 다른 태스크에 해당 액티비티가 있다면 기존 액티비티의 onNewIntent()가 호출된다.

🔸singleIntance
◾singleTask와 같다. 다만 본인의 태스크 안에 다른 액티비티를 실행하지 않는 점이 예외이다.

💡인텐트 플래그

◾ 인텐트 플래그를 지정해 액티비티의 태스크 동작을 조정할 수 있다.

📌setFlags 속성
🔸FLAG_ACTIVITY_SINGLE_TOP
◾ 시작되고 있는 액티비티가 현재 액티비티라면 새 인스턴스를 생성하지 않고 기존 액티비티 인스턴스의 onNewIntent()가 호출된다.
◾ launchMode 속성 값이 "singleTop"일 때와 같은 동작이다.

🔸FLAG_ACTIVITY_NEW_TASK
◾ 액티비티를 새 태스크에서 시작합니다.
◾ 이 액티비티가 이미 실행 중인 태스크에 있다면 태스크를 복원해 포그라운드로 불러오고 기존 액티비티의 onNewIntent()가 호출된다.
◾ "singleTask"와 같은 동작이다.

🔸FLAG_ACTIVITY_CLEART_TOP
◾  시작되고 있는 액티비티가 이미 현재 작업에서 실행중이라면, 해당 액티비티의 새 인스턴스를 시작하지 않고, 그 위의 모든 다른 액티비티를 소멸해 해당 액티비티를 가장 상위로 올린 후 onNewIntent()를 호출한다.
◾ launchMode가 standard면 새 인스턴스가 생성된다.
◾ 이 플래그와 동일한 동작을 하는 launchMode 속성값은 없다.

📃인텐트 플래그 예제


📝AndroidManifest.xml

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.project.test03">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Day38">
        <activity
            android:name=".MainActivity3"
            android:exported="false" />
        <activity
            android:name=".MainActivity2"
            android:exported="false" />
        <activity
            android:name=".MainActivity" android:launchMode="singleTask"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

📝activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="당신의 스트레스 위험도를 알아봅시다"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="테스트 시작"
        android:id="@+id/btn_start"
        android:onClick="onClickStart"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="15dp"
        android:text="테스트를 마친 후 결과가 나타납니다"

        android:gravity="center"
        android:background="#f4e3a2"
        android:id="@+id/tv_result"/>
</LinearLayout>

📝activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity2"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="스트레스 레벨"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RadioGroup
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:layout_centerInParent="true"
            android:id="@+id/rg_level">

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="가끔 스트레스를 받습니다"
                android:id="@+id/rb_1"/>

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="자주 스트레스를 받습니다"
                android:id="@+id/rb_2"/>

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="매우 자주 스트레스틀 받습니다"
                android:id="@+id/rb_3"/>

        </RadioGroup>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:text="다음"
            android:onClick="onClickNext"
            android:id="@+id/btn_next"/>

    </RelativeLayout>

</LinearLayout>

 


📝activity_main3.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity3">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="스트레스 푸는 법"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RadioGroup
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:layout_centerInParent="true"
            android:id="@+id/rg_refresh">

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="운동으로 해결합니다"
                android:id="@+id/rb_sport" />

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="술을 마십니다"
                android:id="@+id/rb_drink"/>

        </RadioGroup>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:text="결과 보기"
            android:onClick="onClickResult"
            android:id="@+id/btn_next"/>

    </RelativeLayout>

</RelativeLayout>

 


📝MainActivity.java

package com.project.test03;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

    public void onClickStart(View v) {
        startActivity(new Intent(MainActivity.this, MainActivity2.class));
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        String str = intent.getStringExtra("result");
        if(str.length()>0) {
            ((TextView)findViewById(R.id.tv_result)).setText(str);
        }
    }
}

📝MainActivity2.java

package com.project.test03;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }
    public void onClickNext(View v) {
        Intent intent = new Intent(MainActivity2.this, MainActivity3.class);
        startActivity(intent);
    }
}

📝MainActivity3.java

package com.project.test03;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity3 extends AppCompatActivity {

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

    public void onClickResult(View v) {
        Intent intent = new Intent(MainActivity3.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("result", "스트레스 점수 : " + 10);
        startActivity(intent);
    }
}

launchMode로 singleTop속성을 주면 다시 똑같은 액티비티가 실행되지 않는다.
◾ BackKey로 되돌아갈 수 있다.
◾ 설정하게 되면, onCreate가 실행되지 않고 onNewIntent 메소드가 실행된다.

 

◾ 해당 소스를 추가하면, 액티비티가 계속 쌓이지 않고 BackKey도 눌리지 않는다. (처음 액티비티 빼고 모두 삭제)


◾ 전달하고 싶은 값을 전달한다.


◾ putExtra로 값을 넣고 던져준 intent를 매개변수로 가지면 지정한 결과값을 받을 수 있다.


 

728x90
반응형

댓글