---------
HTTP속성 - 레퍼럴 - 다이렉트로 접근시 레퍼럴 정보가 없으면 뜨지 않는 것
---------
롬복
저장소(리파지토리)추가
------------------------
Intent
Intent를 간단히 생각하면
트럭이라고생각하면된다
출발지와 목적지를 알려주고 내용을 싣는다
번들객체 - 오브젝트를 싣는 곳
입력시 put을 사용한다
shift 따닥
바이트로 바꾼다! (직렬화)
메인액티비티
안드로이드 내부에서는 Bundle을 사용하면 된다
--------------------------
TASK - 액티비티가 쌓이는 것
기본적으로 페이지이동시 액티비티를 날리고(finish), 데이터를 남기고 싶을 경우에는 종료를 시키지 않는다
TASK 설정에 따라 같은 액티비티가 뜨면 이전의 액티비티를 날릴 수 있다
Static저장소
-----------
앱 오류시
clean Rebuild
---------------
LayoutInflater
레이아웃 = 뷰그룹 = 컨테이너
브로드캐스팅
들어오는 모든데이터 중에서 취사선택
모든 방송사의 데이터 중 하나를 걸러내는 것 (TV로 데이터가 다오는데 채널하나 선택)
(카카오톡 메시지 수신 + 카카오톡에서 문자메시지 수신 - 권한)
컨텍스트
애플리케이션 컨텍스트 - 앱 자체의 컨텍스트
액티비티 컨텍스트 - 액티비티의 컨텍스트
액티비티 매니저 서비스
안드로이드 OS
포그라운드 앱 - 선택했을 경우에만 뜸
서비스 앱 (백그라운드 앱) - 서비스는 데몬으로 돈다
일반OS는 프로그램을 실행시키면 프로세스가 된다
즉 각각 다 작동되고 있는 상태이다
안드로이드OS는 액티비티 매니저 서비스 라는 앱이 있고 이 것이 모든 앱들을 관리한다
즉 안드로이드는 프로세스가 하나다
다른 앱들을 켜면 액티비티 매니저 서비스에서 관리하게 된다
화면에 보이는 앱들은 작동되고 화면 뒤로 간 앱들은 중지상태가 된다
(중지상태가 된 앱들은 메모리자원을 적게 차지하고 앱의 정보만 들고 있게된다- 이것을 context라고 한다)
contextId
다른앱으로 전환하면 컨텍스트 스위칭이 일어난다
앱들끼리는 매니저를 통해서 통신할 수 있다
--------------
앱은 스스로 액티비티 컨텍스트를 관리한다
A1.this
getContext()
getApplicationContext()
---------------
안드로이드 생명주기
책 277
ctrl + o
앱을 처음 켜면
앱을 다시 선택하면
앱을 끄면
체류시간은 onStart부터 onRestart까지로 잡으면됨
중요
시작! - onCreate
정지 - onPause
다시돌아올때 - onResume
종료할때 - onDestroy
더보기
package com.jaybon.lifecycleex01;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Main_Activity";
private String downloadData = ""; // 다운로드 데이터로 가정한다
private String currentState = "";
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
currentState = "에너지 50";
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
Log.d(TAG, "onResume: 현재 에너지는 "+currentState);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 다운로드 시작
new Thread(new Runnable() {
@Override
public void run() {
try {
for(int i=1; i<4; i++){
Thread.sleep(1000);
Log.d(TAG, "run: "+i+"초");
}
downloadData = "다운받은 데이터";
Log.d(TAG, "run: 다운로드 종료");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Log.d(TAG, "onCreate: ");
}
}
------
shared preferences
앱을꺼도 데이터를 남기고 싶을때
shared preferences - 내부 하드디스크에 저장하는 기술
앱은 스스로의 shared preferences가 있다
이런 값을 public으로 저장했다면 다른앱에 데이터 공유할 수 있다
웹브라우저의 쿠키개념과 비슷하다
하지만 앱을 지우거나 휴대폰을 바꿀 때 사라지므로 DB에 데이터를 저장하는 것이 좋다
종료시 저장
시작시 가져오기
------------------
MainActivity
더보기
package com.jaybon.lifecycleex02;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Main_Activity";
//메인 액티비티의 전역변수, 걸어두고 사용하는 것이 편리하다
//메인 액티비티의 모든 것이 담겨있다
private Context mContext = MainActivity.this;
private Button btnNum, btnEmail;
private TextView tvNum, tvEmail;
// 콜백함수
// 어떤화면이 꺼지면 데이터값을 가져오는 것?
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult: 콜백받음");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvNum = findViewById(R.id.tv_num);
tvEmail = findViewById(R.id.tv_email);
btnEmail = findViewById(R.id.btn_email);
btnNum = findViewById(R.id.btn_num);
// 리스너
btnNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 트럭 생성 getBaseContext() 또는 MainActivity.this 또는 전역변수로 등록하여 사용
// 출발지 MainActivity.this, 목적지 Sub2Activity.class
Intent intent = new Intent(mContext, SubActivity.class);
// startActivity(intent); 이동만 할때 사용
// 이동 및 응답을 받을 수 있는 것
// 나를 띄운 페이지 확인 requestCode (enum 등을 사용하자)
startActivityForResult(intent, 1);
}
});
}
}
SubActivity
더보기
package com.jaybon.lifecycleex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SubActivity extends AppCompatActivity {
private Button btnSubNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
btnSubNum = findViewById(R.id.btn_sub_num); // 버튼이름을 같게 해도 충돌안남
btnSubNum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
Sub2Activity
더보기
package com.jaybon.lifecycleex02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class Sub2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub2);
}
}
MainActivity
261 271
---------------
플래그와 부가 데이터
액티비티는 [액티비티 매니저] 라는 객체에 의해 [액티비티 스택]이라는 것으로 관리됨
액티비티를 차곡차곡 쌓아두고 상위에 있는 액티비티가 없어지면 이전의 액티비티가 화면에 보임
순서
액티비티 생성
매니페스트 파일 등록
startActivity() 또는 startActivityForResult() 메서드를 사용해 실행
새로운 액티비티가 화면에 띄워짐
이전 액티비티는 액티비티 스택에 저장
액티비티가 없어지면 스택 최상위에 있는 액티비티가 노출
(동일한 액티비티를 여러번실행하면 스택에 계속 쌓여 데이터를 여러번 접근하거나 리소스 문제 발생)
NO_FLAG
FLAG_ACTIVITY-SINGLE-TOP
FLAG_ACTIVITY-NO_HISTORY
FLAG_ACTIVITY-CLEAR_TOP
NO_FLAG 일 경우 같은 액티비티가 계속 해서 쌓인다
FLAG_ACTIVITY-SINGLE-TOP 일 경우 같은 액티비티는 하나만 쌓인다
새로운 액티비티를 띄워주는 액티비티를 부모 액티비티라고 할경우
전달하는 인텐트는 새로 만들어진 인텐트의 onCreate()메서드 안에서 getIntent()메서드로 참조 할 수있다
onNewIntent()메서드를 재정의 하면 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달 받을 수 있음
액티비티가 이미 메모리에 객체로 만들어져 있다면 액티비티를 다시 띄우더라도 onCreate()가 실행되지 않기 때문에
onNewIntent()를 재정의 해서 사용해야한다
브로드캐스트 수신자?
FLAG_ACTIVITY-NO_HISTORY
항상 맨처음의 액티비티가 보이게된다 알림 메시지등 한번화면에 보여줄 때 좋음
FLAG_ACTIVITY-CLEAR_TOP
는 되돌아갈 때 스택에 상위 액티비티를 다 제거하고 메인 액티비티로 가게됨
부가데이터
Intent Bundle
번들 객체는 해시테이블과 유사
기본자료형을 넣고 뺄수 있지만 Serializable 객체도 사용가능
안드로이드는 객체를 전달할때 Serializable 보다 Parcelable인터페이스 권장