programing

Android Application 클래스를 확장하는 이유는 무엇입니까?

skycolor 2023. 10. 29. 19:08
반응형

Android Application 클래스를 확장하는 이유는 무엇입니까?

확장된Applicationclass는 글로벌 변수를 선언할 수 있습니다.다른 이유가 있습니까?

소개:

enter image description here

  1. 만약 우리가 고려한다면.apk우리의 모바일에 있는 파일, 그것은 여러개의 유용한 블록들로 구성되어 있습니다.Activitys,Services와 다른 사람들
  2. 이러한 구성 요소는 서로 정기적으로 통신하지 않으며 고유한 수명 주기를 가지고 있다는 것을 잊지 않습니다.이는 한 순간에 활성화되고 다른 순간에는 비활성화될 수 있음을 나타냅니다.

요구사항:

  1. 때로는 전체적으로 변수와 해당 상태에 액세스해야 하는 시나리오가 필요할 수도 있습니다.Application여하를 막론하고Activity사용자가 사용하고 있는,
  2. 예를 들어, 사용자가 사용자의 인사 정보(예: 이름)를 보유한 변수에 액세스해야 할 수 있습니다.Application,
  3. 할 수 SQLite 를을 할 수 있습니다.Cursor몇 번이고 닫으면 성능이 좋지 않습니다.
  4. 우리는 사용할 수 있습니다.Intent데이터를 전달하는 것은 서툴지만 메모리 avail성에 따라 작업 자체가 특정 시나리오에서 존재하지 않을 수 있습니다.

응용 프로그램 클래스의 용도:

  1. 전세계의 변수에 대한 액세스Application,
  2. 사용할 수 있습니다.Application응용프로그램 수업이 시작되기 전에 분석 등과 같은 특정한 것들을 시작하는 것.ActivityServices운영되고 있고,
  3. onConfigurationChanged()라는 재정의된 메서드가 있으며 이 메서드는 응용 프로그램 구성을 변경할 때 트리거됩니다(수평에서 수직으로).
  4. Android 장치의 메모리 부족 시 트리거되는 on LowMemory()라는 이벤트도 있습니다.

응용프로그램 클래스는 응용프로그램의 전체 수명 주기를 가진 개체입니다.응용 프로그램으로서 가장 높은 계층입니다.사용 가능한 예:

  • 응용프로그램 클래스에서 Create를 재정의하여 응용프로그램을 시작할 때 필요한 것을 추가할 수 있습니다.

  • 활동에서 활동으로 점프하는 전역 변수를 저장합니다.비동기식 작업처럼.

    기타

여러 활동에서 액세스해야 하는 전역 변수와 같은 데이터를 저장하려는 경우도 있습니다. 때로는 응용 프로그램 내의 모든 곳에 액세스해야 하는 경우도 있습니다.이 경우 Application 개체가 도움이 됩니다.

예를 들어 각 http 요청에 대한 기본 인증 데이터를 가져오려면 응용 프로그램 개체에 인증 데이터에 대한 메서드를 구현할 수 있습니다.

이 후 다음과 같은 작업에서 사용자 이름과 암호를 얻을 수 있습니다.

MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();

마지막으로 Application 개체를 단일 톤 개체로 사용해야 합니다.

public class MyApplication extends Application {
    private static MyApplication singleton;

    public MyApplication getInstance(){
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}

자세한 내용은 Application Class(애플리케이션 클래스)를 클릭하십시오.

당장은 애플리케이션을 확장하는 것이 다른 접근 방식보다 바람직하거나 무언가를 달성하기 위해 필요한 실제 시나리오를 생각할 수 없습니다.값비싸고 자주 사용하는 개체가 있는 경우 개체가 현재 존재하지 않는 것을 감지하면 IntentService에서 초기화할 수 있습니다.애플리케이션 자체는 UI 스레드에서 실행되는 반면 IntentService는 자체 스레드에서 실행됩니다.

저는 명확한 의도를 가지고 활동에서 활동으로 데이터를 전달하거나 공유 환경설정을 사용하는 것을 선호합니다.인터페이스를 사용하여 프래그먼트에서 상위 액티비티로 데이터를 전달하는 방법도 있습니다.

응용프로그램 클래스는 모든 활동 또는 컨텍스트 개체가 있는 다른 곳에서 액세스할 수 있는 단일 클래스입니다.

라이프사이클의 일부도 얻을 수 있습니다.

Application's onCreate 메서드를 사용하여 분석 도우미와 같이 값이 비싸지만 자주 사용하는 개체를 인스턴스화할 수 있습니다.그러면 어디서나 이 객체들에 접근하여 사용할 수 있습니다.

응용 프로그램 클래스를 가장 잘 사용합니다.예:부팅이 완료되면 경보 관리자를 다시 시작해야 한다고 가정합니다.

public class BaseJuiceApplication extends Application implements BootListener {

    public static BaseJuiceApplication instance = null;

    public static Context getInstance() {
        if (null == instance) {
            instance = new BaseJuiceApplication();
        }
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();


    }

    @Override
    public void onBootCompleted(Context context, Intent intent) {
        new PushService().scheduleService(getInstance());
        //startToNotify(context);
    }

답변이 아닌 관찰: 동일한 활동의 인스턴스가 두 개(하나는 전경에 있고 하나는 보이지 않음) 동시에 실행될 수 있으므로 확장된 응용 프로그램 개체의 데이터를 활동 인스턴스에 연결해서는 안 됩니다.

예를 들어, 실행기를 통해 활동을 정상적으로 시작한 다음 "최소화"합니다.그런 다음 다른 앱(즉, 태스커)을 시작하면 단축키를 만들기 위해 다른 활동 인스턴스가 시작됩니다. 왜냐하면 앱이 안드로이드를 지원하기 때문입니다.의도적인 행동CREATE_바로가기.그런 다음 바로 가기가 생성되고 활동의 바로 가기 생성 호출이 응용 프로그램 개체를 수정한 경우 백그라운드에서 실행 중인 활동이 수정된 응용 프로그램 개체를 다시 포그라운드로 가져오면 이 수정된 응용 프로그램 개체를 사용하기 시작합니다.

저는 이 질문이 답을 놓치고 있다고 봅니다.나는 연장합니다ApplicationBill Pugh Singleton 구현을 사용하기 때문에(참조참조), 일부 싱글톤은 컨텍스트가 필요합니다.Application클래스는 다음과 같습니다.

public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();

    private static MyApplication sInstance;

    @Contract(pure = true)
    @Nullable
    public static Context getAppContext() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate() called");
        sInstance = this;
    }
}

싱글톤들은 이렇게 생겼습니다.

public class DataManager {

    private static final String TAG = DataManager.class.getSimpleName();

    @Contract(pure = true)
    public static DataManager getInstance() {
        return InstanceHolder.INSTANCE;
    }

    private DataManager() {
        doStuffRequiringContext(MyApplication.getAppContext());
    }

    private static final class InstanceHolder {
        @SuppressLint("StaticFieldLeak")
        private static final DataManager INSTANCE = new DataManager();
    }
}

이렇게 하면 싱글톤을 사용할 때마다 컨텍스트를 가질 필요가 없고 최소한의 코드로 게으른 동기화 초기화를 할 수 있습니다.

팁: Android Studio singleton 템플릿을 업데이트하면 많은 시간이 절약됩니다.

출처 : https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

많은 앱에서 애플리케이션 클래스를 직접 사용할 필요가 없습니다.그러나 사용자 지정 응용프로그램 클래스를 사용할 수 있는 몇 가지 용도가 있습니다.

  • 첫 번째 활동을 작성하기 전에 실행해야 하는 전문화된 작업
  • 모든 구성 요소(충돌 보고, 지속성) 간에 공유해야 하는 글로벌 초기화
  • 공유 네트워크 클라이언트 개체와 같은 정적 불변 데이터에 쉽게 접근하기 위한 정적 방법

가변 인스턴스 데이터를 응용 프로그램 개체 내부에 저장해서는 안 됩니다. 데이터가 해당 개체에 머무른다고 가정하면 응용 프로그램이 NullPointer와 함께 충돌할 수밖에 없기 때문입니다.예외.응용 프로그램 개체는 영원히 메모리에 저장되지 않을 것이며, 이 개체는 삭제될 것입니다.일반적인 생각과는 달리, 앱은 처음부터 다시 시작되지 않을 것입니다.Android는 새로운 Application 개체를 생성하고 사용자가 이전에 있었던 곳에서 활동을 시작하여 처음부터 어플리케이션이 종료되지 않았다는 착각을 불러일으킬 것입니다.

애플리케이션 클래스는 여러 가지 용도로 사용할 수 있다고 생각합니다만, 활동이나 서비스를 시작하기 전에 먼저 몇 가지 작업을 수행해야 합니다.예를 들어, 애플리케이션에서 사용자 지정 글꼴을 사용합니다.전화 대신

Typeface.createFromAsset()

모든 액티비티에서 Assets 폴더에서 글꼴에 대한 참조를 가져옵니다(이 메서드를 호출할 때마다 자산에 대한 참조를 유지하므로 메모리 누수가 발생하므로 좋지 않음).onCreate()내 응용프로그램 클래스의 메서드:

private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
    super.onCreate();

    appInstance = this;
    quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
                       "fonts/Quicksand-Regular.otf");
   ...
   }

자, 저도 이렇게 정의된 방법이 있습니다.

public static App getAppInstance() {
    return appInstance;
}

그리고 이것:

public Typeface getQuickSandRegular() {
    return quicksandRegular;
}

따라서 애플리케이션의 어느 곳에서든 다음과 같은 작업만 수행하면 됩니다.

App.getAppInstance().getQuickSandRegular()

애플리케이션 클래스의 또 다른 용도는 장치가 인터넷에 연결되어 있는지 확인하고 연결이 필요한 서비스를 실제로 시작하고 필요한 작업을 수행하는 것입니다.

활동을 사용하지 않는(응용프로그램이 활동이 아님) 애플리케이션에 바인딩해야 하는 모든 오래 실행 중인 스레드 또는 기타 개체에 대해 애플리케이션 범위에 변수를 저장할 수 있음을 나타내는 다른 답변에 추가합니다.바인딩된 서비스를 요청할 수 없는 경우와 같이..애플리케이션 인스턴스에 바인딩하는 것이 좋습니다.이 접근 방식의 유일한 분명한 경고는 응용 프로그램이 활성화되어 있는 동안 개체가 수명을 유지하기 때문에 메모리에 대한 보다 암묵적인 제어가 필요하며 그렇지 않으면 누출과 같은 메모리 관련 문제가 발생할 수 있습니다.

그 밖에 유용한 것은 작업 순서대로 작업 전에 애플리케이션을 먼저 시작한다는 것입니다.이 기간 동안, 원하는 경우 첫 번째 활동 전에 발생할 필요한 모든 살림을 준비할 수 있습니다.

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created

Application에 의해 확장된 경우 개체를 만들지 않고도 클래스에 대한 변수에 액세스할 수 있습니다.이들은 전역적으로 호출될 수 있으며 애플리케이션이 종료되지 않을 때까지 상태가 유지됩니다.

확장 응용프로그램을 사용하면 응용프로그램 실행 기간 동안 원하는 모든 종류의 작업을 확실하게 수행할 수 있습니다.이제 어떤 종류의 변수가 될 수도 있고, 서버에서 데이터를 가져오려면 비동기식 작업을 응용 프로그램에 넣어서 매번 계속해서 데이터를 가져오므로 자동으로 업데이트된 데이터를 얻을 수 있다고 가정합니다.자세한 내용을 보려면 이 링크를 사용하십시오.

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android

언급URL : https://stackoverflow.com/questions/18002227/why-extend-the-android-application-class

반응형