obtenez de l'Activité de référence à partir d'un Service
J'ai besoin d'obtenir une référence à l'Activité principale d'un Service.
C'est ma conception:
MainActivity.java
public class MainActivity extends Activity{
private Intent myIntent;
onCreate(){
myIntent=new Intent(MainActivity.this, MyService.class);
btnStart.setOnClickListener(new OnClickListener(){
public void onClick(View V){
startService(myIntent);
});
}}
MyService.java
class MyService extends Service{
public IBinder onBind(Intent intent) {
return null;
}
onCreate(){
//Here I need to have a MainActivity reference
//to pass it to another object
}
}
Comment puis-je faire cela?
[MODIFIER]
Merci à tous pour les réponses!
Cette application est un serveur web, qui à ce moment ne fonctionne qu'avec les fils, et je veux utiliser un service au lieu de cela, pour le faire fonctionner en arrière-plan.
Le problème est que j'ai une classe qui est responsable de l'obtention de la page d'actifs, et de faire cette opération, j'ai besoin d'utiliser cette méthode:
InputStream iS =myActivity.getAssets().open("www/"+filename);
En ce moment, mon projet n'a qu'une seule Activité et de l'absence de services, afin que je puisse passer l'activité principale de référence directement à partir de lui-même:
WebServer ws= new DroidWebServer(8080,this);
Afin de faire de cette application fonctionne avec un service, que dois-je changer dans ma conception?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas d'expliquer pourquoi vous avez besoin de cela. Mais ce n'est certainement mauvais de conception. Le stockage références de l'Activité est la première chose que vous ne devrait pas voir avec les activités. Eh bien, vous pouvez, mais vous devez suivre l'Activité du cycle de vie et de libération de la référence après son
onDestroy()
est appelé. Si vous ne le faites pas, vous obtiendrez une fuite de mémoire (lorsque des modifications de configuration, par exemple). Et, eh bien, aprèsonDestroy()
est appelée, l'Activité est considérée comme morte et est probablement inutile de toute façon.Donc il suffit de ne pas stocker la référence dans le Service. Décrivez ce que vous avez besoin pour obtenir à la place. Je suis sûr qu'il y a de meilleures alternatives là-bas.
Mise à JOUR
Ok, donc vous n'avez pas réellement besoin de référence à l'Activité. Vous devez plutôt référence au Contexte (ce qui, dans votre cas doit être ApplicationContext de ne pas garder de référence à l'Activité ou à tout autre composant de la matière).
En supposant que vous avez une classe séparée qui gère WebService demande:
Maintenant, vous pouvez créer & utilisation d'un WebService instance de
Service
(ce qui est recommandé pour de telles tâches en arrière-plan), ou même deActivity
(qui est beaucoup plus délicat à obtenir le droit lorsque les appels de service web ou à long tâches en arrière-plan sont impliqués).Un exemple avec
Service
:final Cursor photo = activity.managedQuery(Data.CONTENT_URI, new String[] {Photo.PHOTO}, Data._ID + "=?", new String[]{photoId}, null);
mContext.getContentResolver().query(...)
et n'oubliez pas de fermer le curseur retourné parquery()
après que vous avez terminé.De communiquer entre votre service et votre activité, vous devez utiliser AIDL.
Plus d'infos sur ce lien:
EDIT: (Merci Renan Malke Stigliani)
http://developer.android.com/guide/components/aidl.html
L'AIDL est exagéré, à moins que l'activité et le service sont à séparer les apk.
Il suffit d'utiliser un classeur vers un service local.
(exemple complet ici: http://developer.android.com/reference/android/app/Service.html)
D'accord avec inazaruk commentaires. Mais, En termes de communication entre une Activité et un Service, vous avez un peu de choix - AIDL (comme mentionné ci-dessus), le Messager, BroadcastReicever, etc. Le Messager méthode est similaire à AIDL mais ne vous obligent pas à définir les interfaces. Vous pouvez commencer ici:
http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html