답변:
나는 응용 프로그램 확장이 다른 접근 방식보다 선호되거나 무언가를 달성하는 데 필요한 실제 시나리오를 생각할 수 없습니다. 값 비싸고 자주 사용되는 객체가있는 경우 객체가 현재 존재하지 않음을 감지하면 IntentService에서 객체를 초기화 할 수 있습니다. 응용 프로그램 자체는 UI 스레드에서 실행되는 반면 IntentService는 자체 스레드에서 실행됩니다.
명시 적 인 텐트를 사용하여 Activity에서 Activity로 데이터를 전달하거나 SharedPreferences를 사용하는 것을 선호합니다. 인터페이스를 사용하여 Fragment에서 상위 활동으로 데이터를 전달하는 방법도 있습니다.
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
. 우리는 항상 가능한 한 많은 글로벌 상태를 제거하고 정적
apk
모바일에서 파일을 고려하면 파일은 Activity
s, Service
s 및 기타와 같은 여러 유용한 블록으로 구성 됩니다.Application
하는 Activity
것과 상관없이 변수와 그 상태에 액세스해야하는 시나리오가 필요할 수 있습니다.Application
.Cursor
다시 닫는 것은 성능에 좋지 않습니다.Intent
s를 사용 하여 데이터를 전달할 수는 있지만 메모리 사용 가능 여부에 따라 특정 시나리오에서 서투른 활동 자체가 존재하지 않을 수 있습니다.Application
,Application
응용 프로그램 클래스가 먼저 시작되기 때문에 등을 분석 같은 특정 일을 시작하는 Activity
s 또는
Services
S가 실행되고있다,응용 프로그램 클래스는 응용 프로그램의 전체 수명주기가있는 개체입니다. 응용 프로그램으로 가장 높은 계층입니다. 가능한 사용법 예 :
Application 클래스에서 onCreate를 재정 의하여 응용 프로그램을 시작할 때 필요한 것을 추가 할 수 있습니다.
활동에서 활동으로 이동하는 전역 변수를 저장하십시오. 비동기 작업처럼.
기타
때로는 여러 활동에서 액세스 해야하는 전역 변수와 같이 데이터를 저장하려고 할 때가 있습니다. 이 경우 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 클래스는 모든 활동 또는 Context 객체가있는 다른 곳에서 액세스 할 수있는 싱글 톤입니다.
또한 약간의 수명주기가 있습니다.
Application의 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);
}
답이 아니라 관찰 : 확장 응용 프로그램 객체의 데이터 는 동일한 활동의 두 인스턴스가 동시에 실행될 수 있기 때문에 활동의 인스턴스와 연결되어서는 안됩니다 . 전경과 보이지 않는 것) .
예를 들어 실행기를 통해 정상적으로 활동을 시작한 다음 "최소화"합니다. 그런 다음 앱이 android.intent.action.CREATE_SHORTCUT을 지원하기 때문에 바로 가기를 생성하기 위해 다른 앱 (예 : Tasker)을 시작하여 다른 액티비티 인스턴스를 시작합니다. 그런 다음 바로 가기가 작성되고 활동의이 바로 가기 작성 호출이 데이터를 애플리케이션 오브젝트로 수정 한 경우, 백그라운드에서 실행중인 활동이이 수정 된 애플리케이션 오브젝트가 포 그라운드로 다시 돌아 오면 사용을 시작합니다.
이 질문에 답이 없습니다. Application
Bill Pugh Singleton 구현 ( reference 참조 )을 사용하고 일부 싱글 톤에는 컨텍스트가 필요 하기 때문에 확장 합니다. 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 싱글 톤 템플릿을 업데이트하면 많은 시간이 절약됩니다.
나는 당신이 많은 것들을 위해 Application 클래스를 사용할 수 있다고 생각하지만, 활동이나 서비스가 시작되기 전에 어떤 것들을해야 할 필요성에 묶여 있습니다. 예를 들어, 내 응용 프로그램에서 사용자 정의 글꼴을 사용합니다. 전화하는 대신
Typeface.createFromAsset()
자산 폴더에서 내 글꼴에 대한 참조를 (당신이 자산에 대한 참조 해당 메서드를 호출 할 때마다 유지되는대로 메모리 누수가 발생합니다 때문에 나쁜) 얻을 수있는 모든 활동에서, 난에서 이렇게 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()
나를 위해 Application 클래스를 사용하는 또 다른 용도는 연결이 필요한 활동 및 서비스가 실제로 시작되고 필요한 조치를 취하기 전에 장치가 인터넷에 연결되어 있는지 확인하는 것입니다.
출처 : https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
많은 앱에서 애플리케이션 클래스로 직접 작업 할 필요가 없습니다. 그러나 사용자 정의 응용 프로그램 클래스는 몇 가지 허용되는 용도로 사용됩니다.
- 첫 번째 활동을 만들기 전에 실행해야하는 전문화 된 작업
- 모든 구성 요소에서 공유해야하는 전역 초기화 (충돌보고, 지속성)
- 공유 네트워크 클라이언트 객체와 같은 정적 불변 데이터에 쉽게 액세스 할 수있는 정적 메소드
변경 가능한 인스턴스 데이터를 Application 객체 내에 저장해서는 안됩니다. 데이터가 그대로 있다고 가정하면 NullPointerException이 발생하는 시점에서 애플리케이션이 필연적으로 충돌하기 때문입니다. 응용 프로그램 객체가 메모리에 영원히 남아 있다고 보장되지는 않으며 죽습니다. 일반적인 믿음과는 달리 앱은 처음부터 다시 시작되지 않습니다. Android는 새로운 Application 객체를 생성하고 사용자가 이전에 애플리케이션을 종료 한 적이 없다는 착각을주기 위해 사용자가 활동했던 활동을 시작합니다.
응용 프로그램 확장을 사용하면 응용 프로그램 실행 기간 동안 원하는 모든 종류의 작업을 수행 할 수 있습니다. 이제는 모든 종류의 변수가 될 수 있으며 서버에서 일부 데이터를 가져 오려는 경우 asynctask를 응용 프로그램에 배치하여 매번 지속적으로 가져 오므로 업데이트 된 데이터를 자동으로 가져올 수 있습니다 ..이 링크를 사용하십시오. 더 많은 지식을 얻으려면 ....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
활동을 사용하지 않는 응용 프로그램에 바인딩 해야하는 장기 실행 스레드 또는 기타 객체 (응용 프로그램은 활동이 아님)에 대해 응용 프로그램 범위에서 저장 변수를 원할 수 있다는 다른 대답을 추가합니다. 바인드 된 서비스를 요청할 수없는 것과 같이. 애플리케이션 인스턴스에 바인딩하는 것이 바람직합니다. 이 접근 방식의 유일한 확실한 경고는 응용 프로그램이 존재하는 한 객체가 존재한다는 것이므로 메모리에 대한 암시 적 제어가 필요합니다. 그렇지 않으면 누출과 같은 메모리 관련 문제가 발생합니다.
유용한 다른 작업은 작업 순서에서 응용 프로그램이 활동보다 먼저 시작된다는 것입니다. 이 기간 동안 원하는 경우 첫 번째 활동 전에 발생할 수있는 하우스 키핑을 준비 할 수 있습니다.
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created