Comment instancier android avec un constructeur?
J'ai un service avec un constructeur suivant:
public ShimmerService(Context context, Handler handler) {
mHandler = handler;
}
Je veux instancier cette classe de service. J'ai code suivant mais, je ne suis pas sûr où passer la paramater:
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder)
.getService();
Toast.makeText(ConfigureShimmer.this,
"Shimmer service has succesfully started.",
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
mShimmerService = null;
}
};
J'ai tout le reste de l'installation, y compris la liaison, entre le début et ainsi de suite. Mais j'obtiens l'erreur dans le code ci-dessus:
04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor
Comment puis-je résoudre ce problème? Où vais-je avoir besoin pour passer des paramètres? Code suivant fonctionne mais, il utilise plutôt le service de classe comme une classe, plutôt que de service:
mShimmerService = new ShimmerService(this, mHandler);
OriginalL'auteur Milan | 2012-04-03
Vous devez vous connecter pour publier un commentaire.
Vous ne devez pas construire des services (ou des activités, ou des récepteurs de radiodiffusion) explicitement. Le système Android n'est qu'en interne. La bonne façon de construire un service via
startService()
avec une intention; n'hésitez pas à ajouter des paramètres supplémentaires à cette intention.De quoi avez-vous besoin de ce gestionnaire? Êtes-vous sûr de la construction de la gestionnaire à partir de zéro dans le service ne va pas aider? Les Services ne sont pas les threads; le service s'exécute sur le même thread d'INTERFACE utilisateur que le code de la consommation.
Je ne sais pas si il y a une différence entre
bindService
etstartService
à cet égard, mais d'après la documentation et cette discussion les extras de ne pas être là quand l'Intention est reçu dansonBind
.OriginalL'auteur Seva Alekseyev
Service s'étend Contexte, de sorte que vous n'avez pas vraiment besoin comme un paramètre dans votre constructeur, puisque vous pouvez utiliser la même instance.
Si vous avez d'autres paramètres que vous souhaitez passer dans le service, je vous recommande de les ajouter à la startService l'intention de figurants et d'arriver dans le service.onStartCommand méthode.
OriginalL'auteur Robert Estivill
Ne pas passer le Gestionnaire du Service, le Gestionnaire ne pas mettre en œuvre Parcelable, ou Serializable, donc je ne pense pas que c'est possible.
Créer le Gestionnaire dans le Service, et transmettra toutes les données dont vous avez besoin pour créer le Gestionnaire via Intention des Extras pour le Service.
OriginalL'auteur VinoRosso
Vous avez besoin d'avoir un constructeur sans argument pour votre classe de Service, sinon, les systèmes ne sais pas comment faire pour l'instancier.
OriginalL'auteur koljaTM
Au lieu de passer Gestionnaire (ou autre objet) pour le service (ce qui n'est pas possible par la voie), vous créez et enregistrez BroadcastReceiver dans votre classe d'Activité. Lorsque vous avez besoin d'invoquer des fonctions de Gestionnaire (ou les fonctions d'un autre objet), puis envoyer diffusée sur les récepteur (sendBroadcast). Vous pouvez également mettre des paramètres supplémentaires à l'intention et vous pouvez gérer tous besoin de code directement à partir de l'Activité en fonction des paramètres.
Peut-être, dans ce cas, votre gestionnaire sera complètement supprimé (Dépend de ce que vous avez réellement besoin.). Avec des récepteurs de radiodiffusion, je ne sais pas à imaginer la situation où vous avez besoin de passer un objet au Service. D'autre part, vous faites quelque chose de pas bon, et vous devriez revoir la conception de l'application.
Si nous voulons quelque chose de passer au Service, nous ne pouvons démarrer le Service avec des paramètres supplémentaires dans l'Intention. Service gère l'état selon ces paramètres à l'intérieur.
L'idée est que le Service peut fonctionner de façon indépendante à d'autres parties des applications d'e.g Activités. On peut contrôler à l'aide de paramètres supplémentaires lorsque nous commençons Service ou à l'envoi d'émissions pour appeler à l'extérieur de code.
OriginalL'auteur rbrisuda