Porquê prolongar uma aula de Aplicação?
li que pode ser usado para declarar variáveis globais, é que todas ou existem outras aplicações?
13 answers
Prefiro passar dados da actividade para a actividade com intentos explícitos, ou usar Partedpreferências. Há também maneiras de passar dados de um fragmento para a sua atividade-mãe usando interfaces.
Introdução:
- se considerarmos um ficheiro {[[0]} no nosso telemóvel, é composto de
vários blocos úteis tais como,
Activity
s,Service
s e outro. - estes componentes não comunicam entre si regularmente e não se esqueça que eles têm o seu próprio ciclo de vida. o que indica que eles podem estar ativos em um momento e inativos no outro momento.
Requisitos:
-
Por vezes, podemos precisar de um cenário em que precisamos de ter acesso a
variável e seus estados em todo o
- um exemplo é que um utilizador pode precisar de aceder a uma variável que mantém a sua
informações sobre o pessoal (por exemplo, nome) a que tem de ser acedido através do
Application
, - podemos usar o SQLite mas criar um
Cursor
e fechá-lo novamente e mais uma vez não é bom no desempenho,
Podemos usar os dados para passar, mas é desajeitado e activo.
pode não existir em um certo cenário dependendo da disponibilidade de memória.
Application
independentemente de
o Activity
que o Utilizador está a usar,
Utilizações da classe de Aplicação:
- acesso a variáveis através do
Application
, - Você pode usar o
Application
para começar certas coisas como análise etc. dado que a classe de aplicação é iniciada antes deActivity
ouServices
estão a ser executados, - existe um método sobreposto chamado onconfiguration changed() que é despoletado quando a configuração da aplicação é alterada (horizontal para vertical & vice-versa),
- existe também um evento chamado onLowMemory () que é despoletado quando o dispositivo Android tem pouca memória.
A classe de aplicação é o objecto que tem o ciclo de vida completo da sua aplicação. É a sua camada mais alta como uma aplicação. exemplo de usos possíveis:
- pode adicionar o que precisa quando a aplicação é iniciada anulando o oncreato na classe de Aplicação.
-
Armazenar variáveis globais que saltam da actividade para a actividade. Como Uma Máscara.
Etc
Às vezes você quer armazenar dados, como variáveis globais que precisam ser acessadas a partir de múltiplas atividades - às vezes em todos os lugares dentro da aplicação. Neste caso, o objeto da aplicação irá ajudá-lo.
Por exemplo, se quiser obter os dados básicos de autenticação para cada pedido http, poderá implementar os métodos para os dados de autenticação no objecto da aplicação.
Depois disso, você pode obter o nome de usuário e senha em qualquer uma das atividades como isto:MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
E finalmente, lembre-se de usar o objecto da aplicação como um objecto singleton:
public class MyApplication extends Application {
private static MyApplication xxx;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
A classe de aplicação é um singleton a que pode aceder a partir de qualquer actividade ou em qualquer outro local onde tenha um objecto de contexto.
Também tens um pouco de ciclo de vida.Você poderia usar o método de oncreato da aplicação para instanciar objetos caros, mas frequentemente usados como um auxiliar de análise. Então você pode acessar e usar esses objetos em todos os lugares.
Melhor utilização da classe de Aplicação. Exemplo: suponha que você precisa reiniciar o seu gestor de alarmes no arranque terminado.
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);
}
Não uma resposta, mas uma observação: mantenha em mente que os dados no aplicativo estendido objeto não deve ser amarrado a uma instância de uma atividade, como é possível que você tenha duas instâncias de uma mesma atividade em execução ao mesmo tempo (um no primeiro plano e não sendo visível).
Por exemplo, você inicia sua atividade normalmente através do lançador, e então "minimiza". Você então iniciar outro aplicativo (ou seja, Tasker) que inicia outra instância do seu ativitiy, por exemplo, a fim de criar um atalho, porque o seu aplicativo suporta android.intencao.accao.CREATE_SHORTCUT. Se o atalho for então criado e este atalho-criando invocação da atividade modificar os dados o objeto da aplicação, então a atividade em execução em segundo plano começará a usar este objeto de Aplicação modificado, uma vez que ele seja trazido de volta para o primeiro plano.Fonte: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
Em muitos aplicativos, não há necessidade de trabalhar diretamente com uma classe de Aplicação. No entanto, existem alguns usos aceitáveis de uma classe de Aplicação personalizada:- Tarefas especializadas que precisam ser executadas antes da criação da primeira
actividade
Inicialização Global que precisa ser compartilhada em todos os componentes
(relatório do estoiro, persistência)
Métodos estáticos para fácil acesso a dados imutáveis estáticos, tais como:
objecto do cliente de rede partilhada
Você nunca deve armazenar dados de instância mutáveis dentro do objecto da aplicação porque se assumir que os seus dados ficarão lá, a sua aplicação irá inevitavelmente estoirar em algum ponto com uma definição de ponto null. O objeto de aplicação não é garantido para ficar na memória para sempre, ele vai ser morto. Ao contrário da crença popular, o aplicativo não será reiniciado a partir de zero. Android irá criar um novo objeto de aplicação e iniciar a atividade onde o usuário estava antes para dar a ilusão de que o aplicativo nunca foi morto em primeiro lugar.
Application
porque eu uso Bill Pugh Singleton implementação ( ver referência ) e alguns dos meus singletons precisam de contexto. A classe Application
parece-se com isto:
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;
}
}
E os singletons são assim:
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();
}
}
Assim não preciso de ter um contexto cada vez que uso um singleton e fico preguiçoso de inicialização sincronizada com uma quantidade mínima de código.
Dica: a actualizar o Android Studio singleton template economiza muito tempo.
O uso de estender a aplicação apenas certifique - se de qualquer tipo de operação que deseje durante todo o período de execução da sua aplicação. Agora pode ser qualquer tipo de variáveis e suponha que se você quiser obter alguns dados do servidor então você pode colocar sua asynctask na aplicação para que ele irá buscar cada vez e continuamente, de modo que você vai obter um dados atualizados automaticamente.. Use este link para mais conhecimento....
Http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
Você pode acessar variáveis a qualquer classe sem criar objetos, se for estendido por aplicação. Eles podem ser chamados globalmente e seu estado é mantido até que a aplicação não seja morta.
Typeface.createFromAsset()
De todas as actividades para obter referências para as minhas fontes a partir da pasta de activos (isto é mau porque irá resultar numa fuga de memória, uma vez que está a manter uma referência aos activos sempre que chama a esse método), faço isto a partir do onCreate()
Método na minha classe de Aplicação:
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
Também tenho um método definido como este:
public static App getAppInstance() {
return appInstance;
}
E isto:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
Então, de qualquer lugar da minha aplicação, tudo o que tenho de fazer é:
App.getAppInstance().getQuickSandRegular()
Outro uso para a classe de Aplicação para mim é verificar se o dispositivo está conectado à Internet antes de atividades e serviços que exigem uma conexão realmente começar e tomar as medidas necessárias.