728x90
반응형
💡태스크
◾ 액티비티들은 시작되면서 태스크라고 불리는 액티비티 스택에 쌓이게 되고 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
반응형
'App > Android Studio' 카테고리의 다른 글
Android Studio - 프로그레스바와 핸들러 (0) | 2022.08.11 |
---|---|
Android Studio - 초 타이머 만들기 (0) | 2022.08.10 |
Android Studio - 사용 권한 (0) | 2022.08.10 |
Android Studio - 인텐트 필터와 암시적 인텐트 수신 (0) | 2022.08.10 |
프로필 수정 📌미완성 (0) | 2022.08.09 |
댓글