메인말고 하나 더 SubActivity만든다.
밑줄과 같이 쌍으로 생긴다
위와 같이 AndroidManifest파일에서 앱 실행되면 처음 나오는 화면이 MainActivity라는 걸 볼 수 있고 새로 만든 SubActivity도 볼 수 있다.
버튼 달아서 화면 전환해보자!
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"
android:orientation="vertical"
tools:context=".MainActivity"
android:background="@android:color/holo_green_light">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8"
android:textSize="25sp"
android:text="메인 액티비티"
android:gravity="center"/>
<Button
android:id="@+id/btn_move_sub"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:text="서브로 이동"/>
</LinearLayout>
activity_sub.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"
android:orientation="vertical"
tools:context=".SubActivity"
android:background="@android:color/holo_orange_light">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="25sp"
android:text="서브 액티비티"
android:gravity="center"/>
</LinearLayout>
이벤트 - Intent 객체가 있다!
Activity전환을 서버에 html 화면은 요청할 필요 없고
데이터가 필요할 때 스프링한테 물어보고 새로운 화면에 이동해서 그림 그려지기(OnCreate) 직전에 데이터를 통신으로 데이터를 다운 받아서 전역 변수도 딱 등록해놓고!
디버그 레벨로 로그!
Intent를 트럭이라고 생각
출발지
목적지
객체를 데이터를 주고 받을 때
Bundle객체에 Object담아서
Bundle객체에 어떤 메서드가 있는데 타입을 Serializable으로 맞춰줘서 뭐가 들어올지 모르는 문제를 해결.
String으로 json으로 gson으로 객체 주고 받는 방법으로 통일하는 것 추천!
User객체 만들자
Task 설정! - 똑같은 Activity를 new해서 task를 쌓으면 먼저 것을 날려주도록 설정 할 수 있음.
Task Activity
Activity를 new하면 Task가 쌓임.
공유 데이터 영역처럼 static저장소에! 안드로이드에 기능 있음
버튼을 생성하고 서브 액티비티를 finish로 종료가 가능하다.
SUB를 MAIN으로 이동안하고 종료하는 이유
안드로이드는 TASK를 들고 있다.
액티비티가 하나 있는데 화면전환 했을때 바뀌는게 아니라
위에 겹쳐지는 것이다. 그러면 TASK가 쌓인다고 하는데
이때 intent로 new해서 새로운 액티비티로 전환하면 TASK가 또 쌓인다.
->TASK가 쌓일때 이전에 있던 main과 새로생긴 main은 다른것이다.
new해서 전환하는 방식보다는 쌓여있는것을 finish 시키면 된다.
간혹 finish를 안하고 액티비티의 데이터를 보존하고 싶으면
static 저장소라는 공유 데이터 저장소를 만든다. -> 안드로이드에 기능 있음
핸드폰
안드로이드 OS가 돌고 있다.
foreground app
서비스 app (background)
안드로이드 특이한점
데스크탑(컴퓨터)에서는 각 어플(카카오톡, 인스타그램, 어라운드)를 실행하면
foreground로 각각 어플들은 메모리를 그대로 잡아먹는다.
ex) 카카오톡 100MB, 인스타그램 100MB, 어라운드 100MB
총 300MB를 그대로 사용함
프로세스가 되어서 id를 찾아서 종료도 가능하다.
안드로이드에서는 액티비티 서비스 매니저라는 앱이 있는데
이 앱이 다른 모든 앱들을 관리를 한다.
예를들면 카카오톡을 실행했을때 데스크탑처럼 카카오톡 프로세서가 생기는게 아니라
액티비티 서비스 매니저가 프로세서들을 관리해준다.
->초기에 휴대폰의 적었던 메모리때문
용량은 예시이다.
그리고 두번째로 카카오톡 어플을 실행하면 메모리를 100MB 사용하고 있다가
홈버튼이나 다른기능을 사용할때 100MB를 계속 사용하는게 아니라 적은 용량 1MB을 차지하게하고
인스타를 실행하면 인스타 메모리 100MB를 사용하다가 중지하면 1MB를 차지한다.
여기서 1MB는 가장 마지막 상태에대한 정보만 들고 있으며
중지된 앱을 실행하면 그 정보를 다시 보여준다.
여기서 정보란 context라고 불린다.
중지되었던 앱이 새로 동작하는게 아니라 Thread 전환하는 것이라고 볼 수 있다.
메모리가 여유롭게 남아 돌면 1MB가 아니라 더 차지한다.
즉, 안드로이드에서 100개 이상의 어플을 켜놔도 1개 킨거와 비슷한 효과를 가진다.
이 context에는 id값이 있는데 이걸로 다른 앱에 접근도 가능하다.
context는 각 액티비티마다 context가 있다.
화면을 항상 왔다갔다 하기때문에 찾을 수 있어야한다.
->그래서 context가 중요함
->Fragment를 이용하면 덜해진다.
요약을 하자면
안드로이드는 프로세스가 한개다.
안드로이드 매니저 서비스 = 액티비티 매니저 서비스
액티비티 자체에 컨텍스트가 있다.
자세한 내용은 밑의 블로그 참고
OS 안드로이드
포그라운드 앱 (내가 앱 클릭했을 때만)
서비스 앱(백그라운드 앱) - 데몬으로 내가 앱을 눌리지 않아도 계속 서비스에 등록되어있음. 계속 서비스가 돌아가고 있음.
브로드캐스트 통신
예) 카카오 앱 자체가
카카오 메세지가 들어왔을 때 카카오 서비스앱이 브로드캐스팅해서 낚아채서 가져감.
다른 어플끼리 서로 액티비티 매니져서비스를 통해서 권한 허락 받고 데이터를 공유할 수 있다.
보통 프로세스를 관리하기 위해서 다 아이디가 있음. 컴퓨터에는.
근데 안드로이드는 안드로이드 내부에 액티비티 매니져 서비스라는 앱이 하나 있음. 이 앱이 전체 앱을 관리함. 용량을 관리.
메모리 문제 때문에 이 하나의 앱이 서비스에 등록되어 다른 모든 앱들을 관리하고 있습니다.
카카오톡 실행하면 항상 프로세스가 되야하는데 메모리 부하 때문에 ActivityManagerService 앱이 내가 실행한 앱(또 다른 인스타 등등) 전부다 서비스에 등록하는게 아니라(항상 프로세스가 하나) 지금 내 화면에 띄워지는 앱만 oncreat함. 그리고 화면에서 이 앱을 내리면 ActivityManagerService 앱이 이 앱을 중지시킴. 그럼 가장 마지막 상태를 context=1MG에 들고 있다가 다시 이 앱을 화면에 띄울 때 context Id를 통해서 접근해서 앱들을 띄운다.
앱들끼리 매니져를 통해서 통신 할 수 있다.
ActivityManagerService
앱에 여러개의 Activity가 있고 Activity Context.
앱이 Activity Id 를 참고해서 Activity 를 전환한다.
https://blog.naver.com/getinthere/221695412324
내 context 에 접근하는 방법
A1.this
getContext()
getApplicationContext()
내 A1말고 다른 A2에 .xml파일에 context를 통해서 접근한다.
Activity의 생명주기가 있음.
https://github.com/Moonseonhyeon/Android-LifeCycle
275p
ctrl+o
해도 쭉나오는데 아래와 같이 적어서 자동완성
logt
onCreact
시작
onStart : 여기서 다운받기
onRestart 채류시간
onStop
onPause
정지
onResume
다시 돌아올 때
onDestory
종료
앱을 정지했을 때 그 상태를 그대로 들고 있다가 다시 켰을 때
SharedPreferences - 내부 하드디스크에 저장하는 기술
각 앱마다 SharedPreferences 를 들고 있음.
그리고 데이터는 private말고 public으로 접근지정자를 해놓으면 앱들끼리 데이터 공유한다.
프로토콜이 있는 거도 있고 인터페이스로 하기도 하고 서로 약속해서 공유한다.
디비없이 크롤링한 앱 -> 월요일마다 디비에 업데이트하다가 -> SharedPreferences 저장하는 방법으로
SharedPreferences 영원히 데이터가 남아 있는게 아님. 앱을 지웠다가 다시 깔아도 데이터가 계속 남아 있게 하고 싶으면 디비에 저장해야 함 그러면 회원가입 로그인 해서 각 유저마다 데이터 저장해 줄 수 밖에 없다!
정리
1. Intent - 트럭 (출발지, 목적지) .put~으로!
2. Activity manager Service
안드로이드에는 프로세스가 하나만 있다. 이름은 Activity manager Service 앱!
이 앱이 앱들의 Application context들을 관리한다.
앱에서 화면전환될때 Activity context 로 한다.
3. Inflater
LayoutInflater객체에 접근해서 사용.
Inflator.inflate();
252 끌때 데이터 받기
261 플래그 부가 데이터 사용하기
'안드로이드' 카테고리의 다른 글
SDK버전 설정하기 (0) | 2020.07.21 |
---|---|
Intent마무리 - Activity전환+데이터 가지고 콜백 (0) | 2020.07.21 |
toolbar+tab (0) | 2020.07.16 |
Bottom Navigation (0) | 2020.07.16 |
TabLayout, Viewpager(슬라이딩), Fragment (0) | 2020.07.15 |