분류 전체보기
- 빛 되신 주 2016.08.24
- SharedPreferences 2016.08.24
- Context 2016.08.24
- Activity 생명주기 2016.08.24
- Fragment 2016.08.24
- permission 2016.08.24
- Httppost 전송하기 2016.08.24
빛 되신 주
SharedPreferences
0. 사용용도
- 초기 설정값이나 자동로그인 여부, 진동 유무등 간단한 값을 저장하고 싶을때 사용
- 어플리케이션 파일형태로 데이터를 저장
- 어플리케이션이 삭제 전까지 보존
- 간단하게 Key, Value 형태의 파일로 저장되므로 앱이 종료되어도 기억
- 불러오려는 Key값이 없는 경우 공백문자열을 return.
1. 데이터 얻기
- getPreferences(int mode)
하나의 액티비티에서만 사용하는 SharedPreferences를 생성
생성되는 SharedPreferences 파일은 해당 액티비티이름으로 생성
하나의 액티비티에서만 사용할 수 있지만 getSharedPreferences()를 사용하면 다른 액티비티에서도 사용가능
- getSharedPreferences(String name, int mode)
특정 이름을 가진 SharedPreferences를 생성
주로 애플리케이션 전체에서 사용
2. 데이터 저장
먼저 데이터를 기록하기 위해 SharedPreferences.Editor 인스턴스를 얻어야 함
1 2 3 4 5 6 7 8 9 | SharedPreferences test = getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor editor = test.edit(); editor.putString("ID", Strid); editor.putString("Password", Strpw); editor.commit(); //완료한다. | cs |
저장 가능한 데이터 타입 Boolean / String / Int / Float / Long |
※ MODE 설정파일을 불러올때의 모드
- MODE_PRIVATE : 자기 app 내에서 사용할때, 기본값
- MODE_WORLD_READABLE : 다른 app에서 읽기 가능
- MODE_WORLD_WRITEABLE : 다른 app에서 쓰기 가능
3. 데이터 불러오기
데이터를 불러오기 위해서 getInt()나 getString() 메서드를 사용
getInt(KEY, VALUE)
첫번째 인자는 데이터의 키, 두번째 인자는 해당값이 없을경우 반환할 값을 넣어준다.
1 2 3 | SharedPreferences test = getSharedPreferences("test", MODE_PRIVATE); int firstData = test.getInt("ID", 0); | cs |
4. 데이터 삭제
1) 특정 데이터 삭제
1 2 3 4 5 6 7 | SharedPreferences test = getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor editor = test.edit(); editor.remove("test"); editor.commit(); | cs |
2) 모든 데이터 삭제
1 2 3 4 5 6 7 | SharedPreferences test = getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor editor = test.edit(); editor.clear(); editor.commit(); | cs |
5. Context와 함께 사용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // 선언 public class PreferencesUtil{ public static void setPreferences(Context context, String key, String value) { SharedPreferences pref = context.getSharedPreferences("pref", context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putString(key, value); editor.commit(); } public static String getPreferences(Context context, String key) { SharedPreferences pref = context.getSharedPreferences("pref", context.MODE_PRIVATE); pref = context.getSharedPreferences("pref", context.MODE_PRIVATE); return pref.getString(key, ""); } } //저장 PreferencesUtil.setPreferences(context, "ID", Strid); PreferencesUtil.setPreferences(context, "PW", StrPw); //불러오기 String ID= PreferencesUtil.getPreferences(context, "ID"); String Pw= PreferencesUtil.getPreferences(context, "Pw"); Log.d("PreferencesUtil", "ID: " + ID); Log.d("PreferencesUtil", "Pw: " + Pw); | cs |
'Programming > Android' 카테고리의 다른 글
ProgressDialog 와 Toast (0) | 2016.08.25 |
---|---|
HttpURLConnection (0) | 2016.08.25 |
Context (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
Fragment (0) | 2016.08.24 |
Context
Context 개념
- Application Context는 안드로이드 어플리케이션의 핵심 기능을 위한 중심부
- Context는 여러 Activity 인스턴스들 간에 리소스를 공유하거나 설정등에 접근하기 위해 사용
- 현재의 프로세서에서 Application Context는 getApplicationContext() 메서드를 사용하여 얻음
- Activity는 Context 클래스를 상속 확장한 것
1 | Context context = getApplicationContext(); |
어플리케이션 리소스 얻기
Context의 getResources() 메서드를 이용하여 어플리케이션의 리소스를 얻을 수 있음
1 | String greeting = getResources().getString(R.string.hello); |
Application Preferences 이용하기
Context의 getSharedPreferences 메서드를 이용하면 SharedPreferences 클래스를 사용
SharedPreferences 클래스는 어플리케이션의 환결설정과 같은 간단한 데이터들을 저장.
아래는 SharedPreferences를 이용하여 사용자 이름과 성별을 저장하는 간단한 예제 입니다.
1 2 3 4 5 6 7 8 9 | SharedPreferences settings = getSharedPreferences(“User”, MODE_PRIVATE); SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(“UserName”, “Spunky”); prefEditor.putString(“SEX”, "Man"); prefEditor.commit(); |
preference 세팅을 얻으려면 아래와 같이 해줄 수 있습니다.
1 2 3 4 | SharedPreferences settings = getSharedPreferences(“User”, MODE_PRIVATE); String userName = settings.getString(“UserName”, “androidnote (Default)”); |
Contexts를 이용하여 다른 어플리케이션의 기능을 접근하기
- Activity 실행
- System-level 서비스 프로바이더 요청 ( ex : location service )
- Application의 파일, 폴더, 데이터베이스 다루기
- Application permission 검사
'Programming > Android' 카테고리의 다른 글
HttpURLConnection (0) | 2016.08.25 |
---|---|
SharedPreferences (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
Fragment (0) | 2016.08.24 |
permission (0) | 2016.08.24 |
Activity 생명주기
액티비티는 다음 그림과 같은 생명주기(LifeCycle)를 가지고 있다. 이 생명주기에 따라 적절한 메소드가 호출되므로 이를 숙지해서 액티비티를 작성해야 한다. 물론 다음 내용은 안드로이드 개발을 어느 정도 해봐야 감이 오는 부분이니 지금은 잠시 눈요기만 하고 나중에 다시 살펴보기 바란다.
액티비티 생명주기는 onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestory()순으로 실행되며, 경우에 따라서 onRestart() 메소드가 호출되기도 한다. 이에 대한 자세한 설명은 다음의 액티비티 생명주기 표를 참고하기 바란다.
API 액티비티 생명주기
메소드 | 설명 | 다음 메소드 |
---|---|---|
onCreate() | 액티비티가 생성될 때 호출되며 사용자 인터페이스 초기화에 사용됨. | onStart() |
onRestart() | 액티비티가 멈췄다가 다시 시작되기 바로 전에 호출됨. | onStart() |
onStart() | 액티비티가 사용자에게 보여지기 바로 직전에 호출됨. | onResume() 또는 onStop() |
onResume() | 액티비티가 사용자와 상호작용하기 바로 전에 호출됨. | onPause() |
onPause() | 다른 액티비티가 보여질 때 호출됨. 데이터 저장, 스레드 중지 등의 처리를 하기에 적당한 메소드. | onResume() 또는 onStop() |
onStop() | 액티비티가 더이상 사용자에게 보여지지 않을 때 호출됨. 메모리가 부족할 경우에는 onStop() 메소드가 호출되지 않을 수도 있음. | onRestart() 또는 onDestroy() |
onDestroy() | 액티비티가 소멸될 때 호출됨. finish() 메소드가 호출되거나 시스템이 메모리 확보를 위해 액티비티를 제거할 때 호출됨. | 없음 |
※ onStop(), onDestory()는 호출되지 않을 수도 있음
출처 : https://kairo96.gitbooks.io/android/content/ch2.4.1.html
'Programming > Android' 카테고리의 다른 글
SharedPreferences (0) | 2016.08.24 |
---|---|
Context (0) | 2016.08.24 |
Fragment (0) | 2016.08.24 |
permission (0) | 2016.08.24 |
Httppost 전송하기 (0) | 2016.08.24 |
Fragment
프래그먼트
조각(fragment)
액티비티보다 더 작은 화면 단위를 정의하고 프래그먼트를 조합하여 완성된 화면표현
액티비티에 비해 동적이고 유연한 화면 구현 가능
자신만의 레이아웃, 동작, 생명주기를 가진 독립적인 모듈
Fragment는 Activity가 아니기 때문에 context를 가지지 않는다.
생명주기
1. onAttach(Activity activity)
Fragment가 Activity에 붙을때 호출 된다.
Fragment는 혼자 사용될수 없고 항상 액티비디의 한부분으로 사용된다.
* activity – Host Activity
2. onCreate(Bundle savedInstanceState)
Fragment가 생성될 때 호출된다.
초기화할 것이 있으면 사용(없으면 생략가능)
Activity의 onCreate()와 비슷하나, UI 관련 작업은 할 수 없다.
이 단계에서는 호스트 액티비티도 초기화중이라서 액티비티 컨트롤을 안정하게 참조할 수 없다.
만약 참조하고싶으면, onActivityCreated 콜백을 사용한다.
* savedInstanceState – 프래그먼트가 재생성될때의 이전상태이며, 이 값을 참조하여 이전상태로 복구한다.
3. onCreateView
(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
Fragment 와 관련 되는 View 계층을 inflater을하여 View작업을 하여 리턴합니다.
*** UI관련 작업을 하는 부분
View root = inflater.inflate(R.layout.conterfragment, container, false)
Button btn = (Button)root.findViewById(R.id.btn)
View view = inflater.inflate(R.layout.fragment, container, false);
return view;
* inflater – xml파일을 전달함,
ex) 같은 xml이라도 setContentview를 사용하면 액티비티에, inflater를 사용하면 프래그먼트.
* cotainer – 프래그먼트가 배치될 액티비티의 부모 뷰, 액티비티의 이 위치에 프래그먼트가 생성, 배치된다.
4. onActivityCreated()
Activity에서 Fragment를 모두 생성하고 난다음 호출 된다.
초기화 완료된 상태
- UI변경작업이 가능
5. onStart()
Fragment가 화면에 표시될때 호출된다. 사용자의 Action과 상호 작용 할 수 없다.
6. onResume()
Fragment가 화면에 완전히 그렸으며, 사용자의 Action과 상호 작용이 가능하다.
– 다른 Fragment가 추가 되었을때
1. onPause()
Fragment가 사용자의 Action과 상호 작용을 중지한다.
2. onStop()
Fragment가 화면에서 더이상 보여지지 않게 되며, Fragment기능이 중지 되었을때 호출 된다.
3. onDestoryView()
View 리소스를 해제 할수 있도록 호출된다.
backstack을 사용 했다면 Fragment를 다시 돌아 갈때 onCreateView()가 호출 된다.
– Fragment가 replace or backward로 제거되는 경우
4. onDestory()
Fragment상태를 완전히 종료 할 수 있도록 호출 한다.
5. onDetach()
Fragment가 Activity와 연결이 완전히 끊기기 직전에 호출 된다.
6. onSaveInstanceState(Bundle outState)
생명주기 메서드는 아니지만, onPause()와 함꼐 호출되며 임시정보를 저장한다.
상태저장
스마트폰 회전시 데이테 손실됨 이유: 화명 방향이 바뀌면 액티비티가 새로 생성되고, 그에따라 소속된 프래그먼트도 새로 생성된다. 정보를 저장해 놓지 않았기 때문에, 초기값으로 리셋된다.
onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
TextView TextCounter = (TextView)getview().findViewById(R.id.txtconter);
int a = Integer.parseInt(TextCounter.getText().toString());
outState.putInt("Counter", a);
}
장비의 설정상태변경, 화면방향변경 등의 변화에 의해 프래그먼트가 정지할 때, 변경된 값을 Bundle에 저장해 놓은 onSaveInstanceState 메서드가 호출된다.
저장된 번들은 onCreate, onCreateView, onActivityCreated콜백의 savedInstanceState 인수로 전달되므로 언제든지 복구에 사용 할 수 있다.
if(onSaveInstanceState == null) // 변경된 값이 없을 때,
프래그먼트 관리자
레이아웃과 마찬가지로 프래그먼트도 실행중에 편집이 가능하다. 필요할 때 추가하거나 다 사용한후 제거 할 수 있으며, 다른 프래그먼트로 교체 할 수도 있다.
또한 교체하기위해서는 액티비티내에 Layout을 지정해주고 거기다가 replace, add 등을 해야한다.
Activity.getFragmentManager()
Fragment.getFragmentManager()
findFragmentByid(int id), findFragmentByTag(String tag) : 프래그먼트 검색
/*
When you are using android.support.v4.app.FragmentManager then you should use getSupportFragmentManager() and if you are using android.app.FragmentManager then use getFragmentManager()
*/
switch(fragmentId){
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | case FRAGMENT_ADD: getSupportFragmentManager() .beginTransaction() .add(R.id.fl_activity_main, dashboardFragment).commit(); break; case FRAGMENT_REPLACE: getSupportFragmentManager() .beginTransaction() .replace(R.id.fl_activity_main, patientListFragment).commit(); break; case FRAGMENT_REMOVE: getSupportFragmentManager() .beginTransaction() .remove(locationFragement).commit(); break; case FRAGMENT_SHOW: getSupportFragmentManager() .beginTransaction() .show(scheduleFragement).commit(); break; case FRAGMENT_HIDE: getSupportFragmentManager() .beginTransaction() .hide(R.id.fl_activity_main, boundaryFragement).commit(); break; | cs |
인수전달
프래그먼트는 액티비티의 작업 일부를 전담하는 서브 모듈이다. 메서드가 작업 거리를 인수로 전달받는 것과 마찬가지로 프래그먼트로 액티비디의 요구에 따라 조금씩 다르게 동작하기 위해 인수를 받아 들인다. 이때 프래그먼트는 인수 저장을 위해 argument를 사용한다.
void setArguments(Bundle args);
Bundle args = new Bundle();
args.putInt(“start”, start);
fragment.setArguments(args);
Bundle getArguments();
Bundle args = getArguments();
백스택
여러개의 프래그 먼트로 구성된 액티비티는 실행중인 프래그먼트를 스택으로 저장한다. 또한 자동으로 관리해주는 액티비티와 달리 명시적인 요구가 있을때만 저장한다. 현재 상태를 스택에 저장하려면, 트랜잭션의 다음 메서드를 호출한다.
addToBackStack(String name);
스택에 프래그먼트를 저장한 상태에서 사용자가 Back버튼을 누르면 액티비티가 종료되는 것이 아니라 스택의 최상위에 있는 프래그먼트를 꺼내 원래 상태로 복귀한다.
Fragment 종류
- DialogFragment : 떠다니는 다이얼로그를 보여주는 Fragment. Fragment는 백스택에 넣어둘 수 있기 때문에 사용자가 다시 Fragment로 복귀하고자 할 때에 Activity에 기본적으로 들어있는 다이얼로그 대신에 사용 할 수 있는 좋은 대체제이다.
- ListFragment : Adapter를 통해서 List를 보여주는 Fragment로 ListActivity와 비슷하고, list view에서 다룰 수 있는 onListItemClick()과 같은 콜백 함수들도 제공한다.
- PreferenceFragment: Preference 객체들을 목록으로 보여주는 PreferenceActivity와 비슷하며, 앱의 Settings를 만들 때에 유용하게 사용할 수 있다.
'Programming > Android' 카테고리의 다른 글
SharedPreferences (0) | 2016.08.24 |
---|---|
Context (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
permission (0) | 2016.08.24 |
Httppost 전송하기 (0) | 2016.08.24 |
permission
1. 퍼미션 위치
- 퍼미션은 <application> 전에 쓴다
2. 사용법
<uses-permission android:name="android.permission./*HERE!*/"/>
3. 퍼미션 종류
ACCESS_CHECKIN_PROPERTIES | 체크인데이터베이스의_속성테이블로_액세스 |
ACCESS_COARSE_LOCATION | 코스_로케이션_액세스_(Cell-ID/WiFi) |
ACCESS_FINE_LOCATION | 파인로케이션_액세스(GPS) |
ACCESS_LOCATION_EXTRA_COMMANDS | 로케이션_옵션_커맨드_액세스 |
ACCESS_MOCK_LOCATION | 목_로케이션_프로바이더_생성_(테스트용) |
ACCESS_NETWORK_STATE | 네트워크_상태_접근 |
ACCESS_SURFACE_FLINGER | 서피스_플링거_접근 |
ACCESS_WIFI_STATE | WiFi상태_접근 |
ADD_SYSTEM_SERVICE | 시스템서비스_추가 |
BATTERY_STATS | 배터리_상태 |
BLUETOOTH | 블루투스 |
BLUETOOTH_ADMIN | 블루투스_어드민 |
BRICK | 디바이스_실효성_지정 |
BROADCAST_PACKAGE_REMOVED | 제거된_패키지에_대한_notification_브로드캐스트 |
BROADCAST_SMS | SMS에_대한_브로드캐스트 |
BROADCAST_STICKY | 인텐트_브로드캐스트 |
CALL_PHONE | 통화 |
CALL_PRIVILEGED | 통화(긴급전화_포함) |
CAMERA | 카메라 |
CHANGE_COMPONENT_ENABLED_STATE | 컴포넌트의_실효성_변경 |
CHANGE_CONFIGURATION | 컨피그_변경 |
CHANGE_NETWORK_STATE | 통신상태_변경 |
CHANGE_WIFI_STATE | WiFi상태_변경 |
CLEAR_APP_CACHE | 어플리케이션_캐시_클리어 |
CLEAR_APP_USER_DATA | 어플리케이션의_유저데이터_클리어 |
CONTROL_LOCATION_UPDATES | 위치정보_갱신 |
DELETE_CACHE_FILES | 캐시파일_제거 |
DELETE_PACKAGES | 패키지_제거 |
DEVICE_POWER | 전원상태에_대한_로우레벨_접근 |
DIAGNOSTIC | 진단리소스_읽고쓰기 |
DISABLE_KEYGUARD | 키_가드_끄기_DUMP_덤? |
EXPAND_STATUS_BAR | 상태표시줄_확장 |
FACTORY_TEST | 팩토리_테스트 |
FLASHLIGHT | 플래시라이트 |
FORCE_BACK | 포스백 |
GET_ACCOUNTS | 어카운트_획득 |
GET_PACKAGE_SIZE | 패키지_획득 |
GET_TASKS | 태스크_획득 |
HARDWARE_TEST | 하드웨어테스트 |
INJECT_EVENTS | 유저이벤트_키/트랙볼 |
INSTALL_PACKAGES | 패키지_인스톨 |
INTERNAL_SYSTEM_WINDOW | 내부_시스템윈도_활용 |
INTERNET | 인터넷 |
MANAGE_APP_TOKENS | 어플리케이션_토큰관리 |
MASTER_CLEAR | 마스터_클리어 |
MODIFY_AUDIO_SETTINGS | 오디오설정_편집 |
MODIFY_PHONE_STATE | 전화상태_편집 |
MOUNT_UNMOUNT_FILESYSTEMS | 파일시스템_편집 |
PERSISTENT_ACTIVITY | 액티비티_지속 |
PROCESS_OUTGOING_CALLS | 전화_발신처리_접근 |
READ_CALENDAR | 캘린더_읽어오기 |
READ_CONTACTS | 주소록_읽어오기 |
READ_FRAME_BUFFER | 프레임버퍼_읽어오기 |
READ_INPUT_STATE | 입력상태_읽어오기 |
READ_LOGS | 로그_읽어오기 |
READ_OWNER_DATA | owner_data읽어오기 |
READ_PHONE_STATE | 통화상태_읽어오기_READ_SMS_SMS읽어오기 |
READ_SYNC_SETTINGS | 동기설정_읽어오기 |
READ_SYNC_STATS | 동기상태_읽어오기 |
REBOOT | reboot |
RECEIVE_BOOT_COMPLETED | boot완료 |
RECEIVE_MMS | MMS수신 |
RECEIVE_SMS | SMS수신 |
RECEIVE_WAP_PUSH | WAP수신 |
RECORD_AUDIO | 오디오_수신 |
REORDER_TASKS | 태스크_Z오더 |
RESTART_PACKAGES | 패키지_리스타트 |
SEND_SMS | SMS송신 |
SET_ACTIVITY_WATCHER | 액티비티_왓쳐지정 |
SET_ALWAYS_FINISH | 액티비티_전체_종료 |
SET_ANIMATION_SCALE | 스케일_애니메이션_지정 |
SET_DEBUG_APP | 디버그어플리케이션_지정 |
SET_ORIENTATION | 스크린_로테이션지정 |
SET_PREFERRED_APPLICATIONS | 자주_사용하는_어플리케이션_지정 |
SET_PROCESS_FOREGROUND | 포어그라운드_처리지정 |
SET_PROCESS_LIMIT | 제한처리_지정 |
SET_TIME_ZONE | 타임존_지정 |
SET_WALLPAPER | 배경화면_지정 |
SET_WALLPAPER_HINTS | 배경화면_힌트_지정 |
SIGNAL_PERSISTENT_PROCESSES | 지속처리_시그널_지정 |
STATUS_BAR | 상태표시줄_지정 |
SUBSCRIBED_FEEDS_READ | 서브스트립드_피즈_읽어오기 |
SUBSCRIBED_FEEDS_WRITE | 서브스트립드_피즈_쓰기 |
SYSTEM_ALERT_WINDOW | 알림_윈도우 |
VIBRATE | 진동 |
WAKE_LOCK | 알람 |
WRITE_APN_SETTINGS | APN설정_쓰기 |
WRITE_CALENDAR | 캘린더_쓰기 |
WRITE_CONTACTS | 주소록_쓰기 |
WRITE_GSERVICES | G서비스_쓰기 |
WRITE_OWNER_DATA | owner_data쓰기 |
WRITE_SETTINGS | 설정_쓰기 |
WRITE_SMS | SMS쓰기 |
WRITE_SYNC_SETTINGS | 동기설정_쓰기 |
'Programming > Android' 카테고리의 다른 글
SharedPreferences (0) | 2016.08.24 |
---|---|
Context (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
Fragment (0) | 2016.08.24 |
Httppost 전송하기 (0) | 2016.08.24 |
Httppost 전송하기
안드로이드 6.0이 되면서 더이상 Apache Http를 지원하지 않게 되었다.
이제 HttpURLconnection사용을 권장하고 있다.
그래서 이제 httppost를 사용하려면 다음과 받은 방법을 사용하여서 apache http 를 설치해야한다.
/app/gradle 에 useLibarry 'org.apche.http.legacy'를 추가시킨다.
android {
useLibrary 'org.apache.http.legacy'
그러면 http post를 사용할 수있다.
INTERNET 퍼미션!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | try { URI url = new URI(params[0]); String data = params[1]; DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(); httpPost.setURI(url); StringEntity entity = new StringEntity(data, HTTP.UTF_8); httpPost.setEntity(entity); HttpResponse httpResponse = httpClient.execute(httpPost); responseString = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8); } catch (Exception e) { e.printStackTrace(); } return responseString; } | cs |
Async를 사용하여 json 형식으로 데이터를 전송하고, 데이터를 받는다.
'Programming > Android' 카테고리의 다른 글
SharedPreferences (0) | 2016.08.24 |
---|---|
Context (0) | 2016.08.24 |
Activity 생명주기 (0) | 2016.08.24 |
Fragment (0) | 2016.08.24 |
permission (0) | 2016.08.24 |