수십개의 액티비티가 같이쓴는 변수같은걸 모아놓는 기능을 구현할려고 합니다.
조건이 데이터 특성상 db Data , File , SharedPreferences 와 같이 물리적으로 데이터를 폰내에서 기록하면 안되구요.
즉 메모리 변수로 가지고 있어야 되는 조건이 있습니다.(보안관련이라서요)
변수 종류가 가지수가 좀 많아서 일일이 intent에 주서담고 빼고 하기기 힘들어서
이런경우 전역변수처럼 쓸수있는 방법이 없나요?
아래처럼 sharedata클래스로 static클래스를 써서 프로그램이 변수를 설정하고 다른 액티비티에서 사용하는걸 생각햇습니다.
public class ShareData {
public static String key = null;
......
}
작동은 잘되지만 프로그램이 [홈]버튼으로 패시브되고 다른 어플을 수많이 띄우고 다시 돌아오면
static 변수가 null로 가비지가 생기는걸 확인했습니다.(이건 생각해보니 웹에서도 그랬던거가 뒤늦게 생각났습니다)
웹에서는 static을 유지하기 위해서 Singleton으로 설계했던 기억이 있습니다.
인스턴스1개로 가비지대상을 피해가는...
이런 전역변수를 앱에서 쓸수있는 방법없을까요?
램이 작은 테스트 폰에서 확연하게 눈에 띄게 나오는 현상이라서
절대 File로 데이터를 남길순없습니다(중요조건)
statice을 singleton으로 바꿔볼까합니다만..이건 개념이 좀 다른얘기라서 ....우선 테스트는 진행할려고합니다.
전역변수같은거 어떻게 쓰시나요?
http://theeye.pe.kr/entry/how-to-use-global-variables-with-application-instance-on-android
전에 블로그에 써놨던건데 참고하세요. 근데 위의 방법은 태스크킬러 어플 한방에 데이터를 손실하게 됩니다.
intent로 값을 가지고 다닐 경우에는 OS가 복구해 주고요.
구자춘님
ShareData는 한번더 호출하진않구요
A activity에서 설정하고 다른 activity에서 사용하다 바꿀수도 있고 읽기만할수도 있고 그럽니다.
아님 intent 외에는 그럼 방법이 없다는건가요?
블러그 어플리케이선 객체를 상속받는건 생각 못했는데 아주 좋아보이는데요
xml에서 이부분을 고치란 말인거죠?
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
위 방법도 상당히 좋은거같은데 태스크킬러 어플 한방에 데이터를 손실하게 되면..
다른 방법을 결국 써야하나요?
태스크 킬러에 의 해 죽는다는 말의 의미를 잘이해못하겠습니다.
A 액티비티에서 B액티비티로 가서 정지했을때
여기서에서 세가지 일을 했다고 가정해볼께요
1) intent로 데이터를 넘겼다고 가정 합니다 즉 String 데이터를 넘겼습니다. > "가나다라마:
2) 아까처럼 static클래스로 A에서 set하고 B에서 get하는 > "홍길동"
3)말씀하신 Application 으로 넘겨주는. > "아자자 화이팅"
B상태에서 [홈]버튼으로 어플이 패시브되고 엄청 다른 어플을 실행하고 난뒤 돌아왔을떄
(2)번 static은 null되는걸 확인했습니다.
말씀하신 태스크 킬러로 죽는다는건 결국 어플( finish() )이 다죽는다는 뜻아닌가요?
데이터만 남아있다는건가요?
이해를 잘못하겠는데요...
아이님 답변감사합니다.
그런데 소스를 짜서 직접 테스트해보니깐 둘다 Null 로 초기화 되는 현상을 발견했습니다.
[실험 방법]
테스트는 A ativity에서 변수를 저장합니다.
1) static class 에 set
2) Singleton으로 설계된 static class
3) A activity안에 local변수 (Intent로 전달할예정)
4) 알려주신 Application 저장방법
여기서 변수를 각기 저장하고 B activity로 갑니다.
3)에 로컬변수는 B에서 intent로 받습니다.
- B에서 값조회시 4가지 모두 잘나옴.
- B상태에서 [홈]버튼으로 패시브시키고
- 미친듯이 메모리를 누수시킬 다른 어플을 마구 실행합니다.
(정말 많이 실해야함 , 실험폰 모토로이는 금방 누수됬지만 갤럭시는 상당히 힘들었음)
- 다시 B를 실행합니다.
- B에서 변수를 찍어보는 함수를 재 실행결과
1) static class 에 set > NULL
2) Singleton으로 설계된 static class > NULL
3) A activity안에 local변수 (Intent로 전달할예정) > 값 나옴
4) 알려주신 Application 저장방법 > NULL
즉 Intent 외에는 값이 복원되지 않았습니다.
알려주신 어플리케이션 상속은 비슷하게 만들었구요 속성도 추가해봤지만 복원불가...
<application android:name=".SuperApplication"
android:alwaysRetainTaskState="true" ....
Intent에 담았다 뺐다가 수인듯 합니다.




저는 static을이용 전역변수를 설정하는데요 어플 초기 실행부분에서 초기화를 시켜준후 사용하고있습니다.
혹시 어플이 pause됫다가 다시 돌아올때 ShareData를 한번더 호출하시나요?