안드로이드에서 전역 변수를 선언하는 방법?


595

로그인이 필요한 응용 프로그램을 만들고 있습니다. 기본 및 로그인 활동을 작성했습니다.

주요 활동 onCreate방법에서 다음 조건을 추가했습니다.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    loadSettings();
    if(strSessionString == null)
    {
        login();
    }
    ...
}

onActivityResult로그인 폼이 종료 될 때 실행 되는 방법은 다음과 같습니다.

@Override
public void onActivityResult(int requestCode,
                             int resultCode,
                             Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case(SHOW_SUBACTICITY_LOGIN):
        {
            if(resultCode == Activity.RESULT_OK)
            {

                strSessionString = data.getStringExtra(Login.SESSIONSTRING);
                connectionAvailable = true;
                strUsername = data.getStringExtra(Login.USERNAME);
            }
        }
    }

문제는 로그인 양식이 때때로 두 번 나타나고 ( login()메소드가 두 번 호출 됨) 전화 키보드가 미끄러지면 로그인 양식이 다시 나타나고 문제가 변수 인 것 같습니다 strSessionString.

사용자가 이미 성공적으로 인증 한 후 로그인 양식이 표시되지 않도록 변수 전역을 설정하는 방법을 아는 사람이 있습니까?


저장된 인스턴스 상태 번들 quicktips.in/…을
Deepak Swami

답변:


954

나는 안드로이드가 상대적으로 새로운 것이었던 09 년에이 답변을 썼고, 안드로이드 개발에 잘 확립되지 않은 영역이 많았다. 이 게시물의 맨 아래에 긴 비평을 추가하여 비판을 언급하고 Application을 서브 클래 싱하는 것이 아니라 Singleton을 사용하는 것에 대한 철학적 불일치를 자세히 설명했습니다. 자신의 책임하에 읽으십시오.

원래 답변 :

가장 일반적인 문제는 여러 활동과 애플리케이션의 모든 부분에서 상태를 저장하는 방법입니다. 정적 변수 (예 : 싱글 톤)는이를 달성하는 일반적인 Java 방법입니다. 그러나 Android에서보다 우아한 방법은 상태를 응용 프로그램 컨텍스트와 연결하는 것입니다.

아시다시피, 각 활동은 컨텍스트입니다. 컨텍스트는 가장 넓은 의미에서 실행 환경에 대한 정보입니다. 애플리케이션에는 컨텍스트가 있으며 Android는 애플리케이션 전체에서 단일 인스턴스로 존재 함을 보장합니다.

이를 수행하는 방법은 android.app.Application 의 자체 서브 클래스를 작성한 후 매니페스트의 애플리케이션 태그에서 해당 클래스를 지정하는 것입니다. 이제 Android는 해당 클래스의 인스턴스를 자동으로 생성하여 전체 애플리케이션에서 사용할 수있게합니다. 메소드를 context사용하여 액세스 할 수 있습니다 Context.getApplicationContext()( 똑같은 효과를 갖는 Activity메소드도 제공 getApplication()). 다음은주의해야 할 매우 간단한 예입니다.

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

이것은 본질적으로 정적 변수 또는 싱글 톤을 사용하는 것과 동일한 효과가 있지만 기존 Android 프레임 워크에 상당히 잘 통합됩니다. 이것은 여러 프로세스에서 작동하지 않습니다 (앱이 여러 프로세스를 가진 드문 앱 중 하나 여야 함).

위의 예에서 참고할 사항 대신 다음과 같은 작업을 수행했다고 가정합니다.

class MyApp extends Application {

  private String myState = /* complicated and slow initialization */;

  public String getState(){
    return myState;
  }
}

이제 응용 프로그램이 인스턴스화 될 때마다이 느린 초기화 (예 : 디스크 치기, 네트워크 치기, 차단 등)가 수행됩니다! 당신은 생각할지도 모릅니다. 이것은 프로세스에 대해 한 번만 발생합니다. 어쨌든 비용을 지불해야합니다. 예를 들어 Dianne Hackborn이 아래에 언급 한 것처럼 백그라운드 브로드 캐스트 이벤트를 처리하기 위해 프로세스를 인스턴스화 할 수 있습니다. 방송 처리가이 상태를 필요로하지 않는다면, 당신은 단지 일련의 복잡하고 느린 작업을 전혀하지 않았을 것입니다. 게으른 인스턴스화는 여기서 게임의 이름입니다. 다음은 응용 프로그램을 사용하는 약간 더 복잡한 방법으로 가장 간단한 용도 이외의 용도에 더 적합합니다.

class MyApp extends Application {

  private MyStateManager myStateManager = new MyStateManager();

  public MyStateManager getStateManager(){
    return myStateManager ;
  }
}

class MyStateManager {

  MyStateManager() {
    /* this should be fast */
  }

  String getState() {
    /* if necessary, perform blocking calls here */
    /* make sure to deal with any multithreading/synchronicity issues */

    ...

    return state;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyStateManager stateManager = ((MyApp)getApplicationContext()).getStateManager();
    String state = stateManager.getState();
    ...
  }
}

여기서는 응용 프로그램 하위 클래스를보다 우아한 솔루션으로 사용하는 것보다 단일 응용 프로그램을 선호하지만 개발자는 응용 프로그램 하위 클래스와 상태를 연결하는 성능 및 멀티 스레딩 영향을 전혀 생각하지 않고 단일 톤을 사용하는 것이 좋습니다.

참고 1 : 안티 카페 (Anticafe)에서 언급 한 것처럼 애플리케이션 재정의를 애플리케이션에 올바르게 연결하려면 매니페스트 파일에 태그가 필요합니다. 자세한 내용은 Android 문서를 참조하십시오. 예를 들면 :

<application
     android:name="my.application.MyApp" 
     android:icon="..."
     android:label="...">
</application>

참고 2 : user608578은 아래에서 기본 개체 수명주기 관리에 대한 작동 방식을 묻습니다. 나는 안드로이드에서 네이티브 코드를 사용하는 데 약간의 시간이 걸리지 않으며 솔루션과의 상호 작용 방식에 대답 할 자격이 없습니다. 누군가가 이것에 대한 답변을 가지고 있다면, 나는 그것들을 신용하고 최대한의 가시성을 위해이 게시물에 정보를 넣을 것입니다.

추가:

일부 사람들이 지적했듯이, 이것은 지속적인 상태에 대한 해결책 이 아니며 원래의 대답에서 더 강조했을 것입니다. 즉, 이것은 응용 프로그램 수명 기간 동안 유지되어야하는 사용자 또는 기타 정보를 저장하기위한 솔루션이 아닙니다. 따라서 디스크에 유지해야 할 것은 응용 프로그램 하위 클래스를 통해 저장해서는 안되기 때문에 언제든지 종료되는 응용 프로그램 등과 관련하여 아래의 대부분의 비판을 고려합니다. 이는 (예를 들어 사용자가 로그인했는지 여부에 관계없이) 일시적이고 쉽게 재현 가능한 응용 프로그램 상태 및 단일 인스턴스 (예 : 응용 프로그램 네트워크 관리자) ( 싱글 톤이 아님 ) 인 구성 요소를 저장하기위한 솔루션입니다 .

Dayerman은 Reton Meier 및 Dianne Hackborn과 의 흥미로운 대화 를 지적하기에 충분히 친절 했습니다. 여기서 응용 프로그램 서브 클래스 사용은 싱글 톤 패턴을 선호하지 않습니다. 소마 틱은 또한 당시에는 보지 못했지만이 특성을 더 일찍 지적했다. 안드로이드 플랫폼을 유지하는 데있어 Reto와 Dianne의 역할 때문에, 나는 그들의 조언을 무시할 것을 선의로 권고 할 수 없습니다. 그들이 말하는 것은 간다. Singleton over Application 서브 클래스를 선호하는 것과 관련하여 표현 된 의견에 동의하지 않습니다. 동의하지 않을 때는 Single Stack 디자인 패턴에 대한이 StackExchange 설명 에서 가장 잘 설명 된 개념을 사용할 것 입니다.이 답변에서 용어를 정의 할 필요가 없습니다. 계속하기 전에 링크를 감추는 것이 좋습니다. 포인트 별 :

Dianne은 "애플리케이션에서 서브 클래스를 만들 이유가 없습니다. 싱글 톤을 만드는 것과 다르지 않습니다 ..."이 첫 번째 주장은 잘못되었습니다. 여기에는 두 가지 주요 이유가 있습니다. 1) 응용 프로그램 클래스는 응용 프로그램 개발자에게 더 나은 평생 보증을 제공합니다. 응용 프로그램의 수명을 보장합니다. 싱글 톤은 응용 프로그램의 수명과 명시 적으로 연결되어 있지 않습니다 (실제로 효과적 임). 이것은 일반적인 응용 프로그램 개발자에게는 문제가 아닐 수 있지만 이것이 Android API가 제공 해야하는 계약 유형이며, 관련 수명을 최소화하여 Android 시스템에 훨씬 더 많은 유연성을 제공한다고 주장합니다. 데이터. 2) Application 클래스는 애플리케이션 개발자에게 상태에 대한 단일 인스턴스 홀더를 제공합니다. 이것은 싱글턴 상태 보유자와는 매우 다릅니다. 차이점 목록은 위의 싱글 톤 설명 링크를 참조하십시오.

Dianne은 "... 응용 프로그램 객체가 독립적 인 응용 프로그램 로직이 무엇인지에 대한 큰 혼란을 겪고 있다는 것을 알게되면서 미래에 당신이 후회하게 될 것"이라고 계속 말했다. 이것은 확실히 부정확하지는 않지만 Singleton over Application 서브 클래스를 선택하는 이유는 아닙니다. Diane의 주장 중 어느 것도 Singleton을 사용하는 것이 Application 하위 클래스보다 낫다는 이유를 제공하지 않으며, Singleton을 사용하는 것이 Application 하위 클래스보다 나쁘지 않다는 것입니다.

그녀는 계속해서 "그리고 이것은 자연스럽게 이러한 것들을 어떻게 관리해야하는지에 따라 더욱 필요할 때마다 초기화합니다." 이것은 Application 서브 클래스를 사용하여 요청시 초기화 할 수없는 이유가 없다는 사실을 무시합니다. 또 차이는 없습니다.

Dianne은 "프레임 워크 자체에는로드 된 리소스의 캐시, 객체 풀 등과 같이 앱을 위해 유지 관리하는 모든 작은 공유 데이터에 대해 톤과 톤의 싱글 톤이 있습니다. 나는 Singleton을 사용하는 것이 잘 작동하지 않거나 합법적 인 대안이 아니라고 주장하지 않습니다. Singletons는 Application 하위 클래스를 사용하는 것만 큼 Android 시스템과 강력한 계약을 제공하지 않으며 Singletons를 사용하면 일반적으로 쉽게 수정할 수없는 융통성없는 디자인을 가리키며 많은 문제가 발생한다고 주장합니다. 안드로이드 API가 개발자 애플리케이션에 제공하는 강력한 계약 인 IMHO는 안드로이드 프로그래밍의 가장 매력적이고 즐거운 측면 중 하나이며, 초기 개발자 채택으로 이어져 오늘날 Android 플랫폼을 성공으로 이끌었습니다.

Dianne은 응용 프로그램 서브 클래스를 사용하는 것에 대한 추가적인 단점을 언급하면서 아래에 주석을 달았으므로 성능이 떨어지는 코드를 작성하거나 쉽게 작성할 수 있습니다. 이것은 매우 사실이며 여기에서 성능을 고려하고 응용 프로그램 하위 클래스를 사용하는 경우 올바른 접근 방식을 취하는 것이 중요하다는 것을 강조하기 위해이 답변을 편집했습니다. Dianne이 말했듯이 프로세스가 백그라운드 브로드 캐스트에만로드되는 경우에도 프로세스가로드 될 때마다 (클래스가 여러 프로세스에서 실행될 경우 한 번에 여러 번 발생할 수 있음) Application 클래스가 인스턴스화된다는 점을 기억해야합니다. 행사. 따라서 응용 프로그램 클래스를 처리하는 장소가 아니라 응용 프로그램의 공유 구성 요소에 대한 포인터의 저장소로 사용하는 것이 중요합니다!

이전 StackExchange 링크에서 도난당한 다음 싱글 톤 단점 목록을 남겨 둡니다.

  • 추상 또는 인터페이스 클래스를 사용할 수 없음
  • 서브 클래스 불가능
  • 응용 분야에서 높은 커플 링 (수정하기 어려움);
  • 테스트하기 어려움 (단위 테스트에서 위조 / 조롱 할 수 없음);
  • 변경 가능한 상태의 경우 병렬화하기 어려움 (광범위한 잠금이 필요함);

내 자신을 추가하십시오.

  • 안드로이드 (또는 대부분의 다른) 개발에 적합하지 않은 불분명하고 관리 불가능한 평생 계약;

93
곧 감사합니다-이러한 종류의 답변은 내가 스택 오버플로를 너무 좋아하는 이유입니다. 잘 했어!
JohnnyLambada

5
"매니페스트의 응용 프로그램 태그에서 해당 클래스를 지정하는 방법"을 궁금해하는 사람은이 글을 쓰는 동안 ebuprofen이 하나씩 수행하는 방법 (Android : name 사용)을 설명하는이 질문에 대한 다른 두 가지 답변이 있습니다. 마이크 브라운.
Tyler Collier

9
곧 답변이 옳지 만 Android Manifest 파일에 <application android : name = ". MyApp"... />를 추가해야한다는 것을 알 수 있습니까?
anticafe

12
한 번 더 반복하겠습니다. 전역 응용 프로그램을 사용해서는 안됩니다. 사용하지 않고 싱글 톤에 비해 이점이 없으며 프로세스 실행 성능을 저하시키는 등 적극적으로 해로울 수 있습니다. 응용 프로그램을 만들 때 프로세스가 무엇을 만들고 있는지 전혀 모릅니다. 필요에 따라 싱글 톤을 느리게 초기화하면 필요한 작업 만 수행하면됩니다. 예를 들어 일부 백그라운드 이벤트에 대한 브로드 캐스트를 처리하기 위해 프로세스를 시작하는 경우 UI에 필요한 전역 상태를 초기화 할 이유가 없습니다.
hackbod

14
또한 싱글 톤과 글로벌이 아닌 다른 접근법 중에서 실제로 선택하는 상황에 대해 이야기 할 때 싱글 톤에 대한 모든 주장은 완벽하게 유효합니다. 싱글 톤은 글로벌이며 적용되는 글로벌에 대한 모든 경고가 있습니다. 그러나 응용 프로그램도 싱글 톤 입니다. 응용 프로그램을 서브 클래 싱으로 전환하여 이러한 문제를 피할 수는 없습니다. 응용 프로그램은 싱글 톤과 정확히 동일하지만 (더 나쁜 것은), 더 깨끗한 일을하고 있다는 사실을 스스로에게 속일 수 있습니다. 그러나 당신은 그렇지 않습니다.
hackbod

153

이 서브 클래스 만들기

public class MyApp extends Application {
  String foo;
}

AndroidManifest.xml에서 android : name을 추가하십시오.

<application android:name=".MyApp" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">

1
고마워 나는 그것을 매니페스트에서 선언하는 방법을 궁금해했다
누군가 어딘가에

3
그것이 나를 위해 작동하려면 "."을 제거해야했습니다. ".MyApp"내
누군가 어딘가에

3
주요 활동 후에 선언하면 설치 / 배포되지 않을 수 있습니다
sami

11
그냥 말하고 싶습니다. 이것은 이미 존재하는 MAIN 응용 프로그램 태그에 들어갑니다 ... 이것은 두 번째 것은 아닙니다 :) 어려운 방법을 배워야했습니다.
bwoogie

java.lang.IllegalAccessException: access to class is not allowed
랩터

142

Soonil이 제안한 애플리케이션 상태를 유지하는 것이 좋지만 한 가지 단점이 있습니다. OS가 전체 애플리케이션 프로세스를 종료하는 경우가 있습니다. 다음은이 프로세스와 수명주기 에 대한 설명서입니다 .

누군가 전화를 걸기 때문에 앱이 백그라운드로 이동하는 경우 (전화 앱이 현재 포 그라운드에 있음)를 생각해보십시오. 이 경우 && 다른 조건 (위의 링크를 확인하십시오)에서 Application서브 클래스 인스턴스를 포함하여 애플리케이션 프로세스가 종료 될 수 있습니다 . 결과적으로 상태가 손실됩니다. 나중에 애플리케이션으로 돌아 오면 OS가 해당 활동 스택 및 Application서브 클래스 인스턴스를 복원 하지만 myState필드는입니다 null.

상태 안전을 보장하는 유일한 방법은 상태 파일을 유지하는 유일한 방법입니다. 예를 들어 응용 프로그램 파일 SharedPrefernces에 개인용을 사용 하거나 결국 내부 파일 시스템의 응용 프로그램 파일에 개인용을 사용합니다.


10
에 대한 지속 +1 SharedPreferences; 이것이 내가 본 방법입니다. 저장된 상태에 대한 환경 설정 시스템을 남용하는 것이 이상하다고 생각하지만 문제가 용어의 문제가 될 정도로 잘 작동합니다.
Cheezmeister 2012

1
당신은 코드를 게시 (또는 설명에 대한 링크를 제공) 된 SharedPreferences는 Arhimed에서 설명하는 문제 해결하는 데 사용되는 방법으로하시기 바랍니다 수
어딘가의 누군가가

2
기본 설정, 데이터베이스, 파일 직렬화 등 .
대런 힌 더러

1
이 동작은 매우 성가시다-애플리케이션의 onTerminate () 메소드가 호출되어 상황을 우아하게 처리 할 수 ​​있다면 그렇게 나쁘지 않을 것이다.
Dean Wild

2
이것이 제 의견으로는 정답입니다. 활동 전반에 존재하는 동일한 애플리케이션 인스턴스에 의존하는 것은 버그입니다. 내 경험상 Android가 백그라운드에서 전체 프로세스를 완전히 분해하고 다시 만드는 것이 일반적입니다. 배경 지식은 카메라 의도, 브라우저 의도 또는 전화 수신을 의미 할 수 있습니다.
Jared Kells

26

그냥 메모 ..

더하다:

android:name=".Globals"

또는 기존 <application> 태그 의 하위 클래스 이름을 지정하십시오 . <application>매니페스트 에 다른 태그를 계속 추가하려고했지만 예외가 발생합니다.


안녕, 김블 나는 같은 문제가 있었다. 나 자신의 <application> 태그가 있었고 다른 <application> 태그를 추가하려고 할 때 나는 당신과 같은 문제가 있었다 (예외 메시지). 그러나 나는 당신이 언급 한 것을했는데 효과가 없었습니다. 내 <application> 태그에 android : name = ". GlobalClass"를 추가했지만 작동하지 않습니다. 어떻게 해결했는지 완전히 설명해 주시겠습니까?
Sonhja

3
좋은 <manifest> <application android : name = ". GlobalData"> </ application> </ manifest>입니다. 잘못된 <manifest> <application> </ application> <application android : name = ". GlobalData"> </ application> </ manifest>
Gimbl

13

응용 프로그램 태그를 지정하는 방법을 찾을 수 없었지만 많은 인터넷 검색 후에 매니페스트 파일 docs에서 분명해졌습니다. 응용 프로그램 스탠자의 기본 아이콘 및 레이블 외에도 android : name을 사용하십시오.

android : name 응용 프로그램에 대해 구현 된 응용 프로그램 하위 클래스의 정규화 된 이름입니다. 응용 프로그램 프로세스가 시작되면이 클래스는 응용 프로그램의 구성 요소보다 먼저 인스턴스화됩니다.

서브 클래스는 선택 사항입니다. 대부분의 응용 프로그램은 필요하지 않습니다. 하위 클래스가없는 경우 Android는 기본 Application 클래스의 인스턴스를 사용합니다.


13

그러한 전역 구조로 원시 메모리를 수집하는 것은 어떻습니까?

활동에는 onPause/onDestroy()소멸시 호출 되는 메소드가 있지만 Application 클래스에는 동등한 메소드가 없습니다. 응용 프로그램이 종료되거나 작업 스택이 백그라운드에 배치 될 때 전역 구조 (특히 기본 메모리에 대한 참조를 포함하는 구조)가 적절하게 가비지 수집되도록하려면 어떤 메커니즘이 권장됩니까?


1
확실한 해결책은 네이티브 리소스를 담당하는 개체에 대해 Closeable 인터페이스 를 구현하고 try-with-resources 문이나 다른 방법으로 관리되도록하는 것입니다. 최악의 경우 항상 객체 파이널 라이저를 사용할 수 있습니다.
sooniln

5

아래처럼 응용 프로그램 이름을 정의하면됩니다.

<application
  android:name="ApplicationName" android:icon="@drawable/icon">
</application>

4

위에서 설명한 것처럼 OS는 아무런 통지없이 응용 프로그램을 종료 할 수 있으므로 (onDestroy 이벤트가 없음) 이러한 전역 변수를 저장할 방법이 없습니다.

SharedPreferences는 COMPLEX STRUCTURED 변수를 제외하고는 해결책이 될 수 있습니다 (제 경우에는 사용자가 이미 처리 한 ID를 저장하는 정수 배열이 있습니다). SharedPreferences의 문제점은 필요할 때마다 이러한 구조를 저장하고 검색하기 어렵다는 것입니다.

내 경우에는 배경 SERVICE가 있으므로이 변수를 거기로 옮길 수 있으며 서비스에 onDestroy 이벤트가 있기 때문에 해당 값을 쉽게 저장할 수 있습니다.


서비스에 대해서도 onDestroy ()가 호출되는 것은 아닙니다.
OpenGL ES 배우기

그렇습니다. 이것은 중요한 상황에서만 발생할 수 있습니다.
Adorjan Princz

4

일부 변수가 sqlite에 저장되어 있고 앱의 대부분의 활동에서 사용해야하는 경우. 그런 다음 응용 프로그램은 그것을 달성하는 가장 좋은 방법 일 것입니다. 응용 프로그램이 시작될 때 데이터베이스에서 변수를 쿼리하여 필드에 저장하십시오. 그런 다음 활동에 이러한 변수를 사용할 수 있습니다.

따라서 올바른 길을 찾으십시오. 최선의 길은 없습니다.


3

이런 종류의 상태를 저장하는 정적 필드를 가질 수 있습니다. 또는 자원 번들에 넣고 onCreate (Bundle savedInstanceState)에서 복원하십시오. Android 앱 관리 수명주기 (예 : 키보드 방향 변경시 login ()이 호출되는 이유)를 완전히 이해해야합니다.


2

<application>매니페스트 파일에 다른 태그를 사용 하지 마십시오 . 기존 <application>태그 에서 한 번만 변경 하고이 행을 추가하십시오. android:name=".ApplicationName"여기서 생성 하려는 ApplicationName하위 클래스의 이름 (전역 저장에 사용)이됩니다.

따라서 마지막으로 매니페스트 파일 의 ONE AND ONLY <application> 태그는 다음과 같아야합니다.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:name=".ApplicationName"
        >

1

Intents, Sqlite 또는 Shared Preferences를 사용할 수 있습니다. 문서, 사진 및 비디오와 같은 미디어 저장소와 관련하여 새 파일을 대신 만들 수 있습니다.


1

두 가지 접근 방식을 사용하여이 작업을 수행 할 수 있습니다.

  1. 응용 프로그램 클래스 사용
  2. 공유 환경 설정 사용

  3. 응용 프로그램 클래스 사용

예:

class SessionManager extends Application{

  String sessionKey;

  setSessionKey(String key){
    this.sessionKey=key;
  }

  String getSessisonKey(){
    return this.sessionKey;
  }
}

위 클래스를 사용하여 아래와 같이 MainActivity에서 로그인을 구현할 수 있습니다. 코드는 다음과 같습니다.

@override 
public void onCreate (Bundle savedInstanceState){
  // you will this key when first time login is successful.
  SessionManager session= (SessionManager)getApplicationContext();
  String key=getSessisonKey.getKey();
  //Use this key to identify whether session is alive or not.
}

이 방법은 임시 저장에 효과적입니다. 메모리가 부족하기 때문에 운영 체제가 응용 프로그램을 종료시킬 때 어떤 생각도하지 않습니다. 응용 프로그램이 백그라운드에 있고 사용자가 실행하기 위해 더 많은 메모리를 요구하는 다른 응용 프로그램을 탐색하는 경우 운영 체제가 백그라운드보다 전경 프로세스보다 우선 순위가 높기 때문에 응용 프로그램이 종료됩니다. 따라서 사용자가 로그 아웃하기 전에 응용 프로그램 개체가 null이됩니다. 따라서이를 위해 위에서 지정한 두 번째 방법을 사용하는 것이 좋습니다.

  1. 공유 환경 설정 사용

    String MYPREF="com.your.application.session"
    
    SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE);
    
    //Insert key as below:
    
    Editot editor= pref.edit();
    
    editor.putString("key","value");
    
    editor.commit();
    
    //Get key as below.
    
    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    
    String key= getResources().getString("key");

0

재개 전에 활동 결과가 호출됩니다. 따라서 이력서에 로그인 확인을 이동하면 secomd 활동이 긍정적 인 결과를 반환하면 두 번째 로그인을 차단할 수 있습니다. 처음에는 이력서가 호출되지 않으므로 걱정하지 않아도됩니다.


0

BARACUS 프레임 워크에서도 서브 클래 싱 접근 방식을 사용했습니다. 내 관점에서 서브 클래 싱 Application은 Android의 라이프 사이클과 작동하도록 설계되었습니다. 이것은 무엇을 어떤 응용 프로그램 컨테이너가 않습니다. 전역을 갖는 대신, 나는이 컨텍스트에 Bean을 등록하여 컨텍스트가 관리 가능한 클래스에 주입되도록합니다. 주입 된 모든 빈 인스턴스는 실제로 싱글 톤입니다.

자세한 내용은이 예를 참조하십시오

더 많은 것을 가질 수 있다면 왜 수동 작업을합니까?


0
class GlobaleVariableDemo extends Application {

    private String myGlobalState;

    public String getGlobalState(){
     return myGlobalState;
    }
    public void setGlobalState(String s){
     myGlobalState = s;
    }
}

class Demo extends Activity {

@Override
public void onCreate(Bundle b){
    ...
    GlobaleVariableDemo appState = ((GlobaleVariableDemo)getApplicationContext());
    String state = appState.getGlobalState();
    ...
    }
}

0

클래스를 확장하는 Application클래스를 만든 다음 변수를 해당 클래스의 필드로 선언하고 getter 메서드를 제공 할 수 있습니다.

public class MyApplication extends Application {
    private String str = "My String";

    synchronized public String getMyString {
        return str;
    }
}

그런 다음 활동에서 해당 변수에 액세스하려면 다음을 사용하십시오.

MyApplication application = (MyApplication) getApplication();
String myVar = application.getMyString();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.