Android de liaison de service
Salut: je n'arrive pas à obtenir une activité de liaison à un service dans le même package.
L'activité ressemble à ceci:
public class myApp extends TabActivity {
static private String TAG = "myApp";
private myService mService = null;
private ServiceConnection mServiceConn = new ServiceConnection(){
public void onServiceConnected(ComponentName name, IBinder service) {
Log.v(TAG, "Service: " + name + " connected");
mService = ((myService.myBinder)service).getService();
}
public void onServiceDisconnected(ComponentName name) {
Log.v(TAG, "Service: " + name + " disconnected");
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
doBind();
Log.i(TAG, "Started (UI Thread)");
//set content
setContentView(R.layout.main);
Resources res = getResources(); //Resource object to get Drawables
TabHost tabHost = getTabHost(); //The activity TabHost
... add some tabs here....
tabHost.setCurrentTab(0);
}
private void doBind(){
Intent i = new Intent(this,myService.class);
if( bindService(i, mServiceConn, 0 )){
Log.i(TAG, "Service bound");
} else {
Log.e(TAG, "Service not bound");
}
}
}
Le service:
public class myService extends Service {
private String TAG = "myService";
private boolean mRunning = false;
@Override
public int onStartCommand(Intent intent, int flags, int startid) {
Log.i(TAG,"Service start");
mRunning = true;
Log.d(TAG,"Finished onStartCommand");
return START_STICKY;
}
/*
* Called on service stop
*/
@Override
public void onDestroy(){
Log.i(TAG,"onDestroy");
mRunning = false;
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
boolean isRunning() {
return mRunning;
}
/*
* class for binding
*/
private final IBinder mBinder = new myBinder();
public class myBinder extends Binder {
myService getService() {
return myService.this;
}
}
}
bindService retourne vrai, mais onServiceConnection n'est jamais appelé (mService est toujours nulle, donc je ne peux pas faire quelque chose comme mService.isRunning() )
L'entrée du manifeste pour le service est tout simplement:
<service android:name=".myService"></service>
J'ai été copiant le code directement à partir du site des développeurs Android, mais j'ai du raté quelque chose.
OriginalL'auteur tommy | 2011-02-26
Vous devez vous connecter pour publier un commentaire.
c'est un problème connu que les activités ont démarré comme une sous-activité dans un tabactivity (en cours d'exécution dans le tabhost) ne peut pas se lier à des services, même dans le même package. il y a un "hack" solution de contournement. si vous appelez le:
plutôt que de simplement:
tout va fonctionner. eu ce même problème, trouvé les détails dans ce rapport de bug:
http://code.google.com/p/android/issues/detail?id=2483
OriginalL'auteur moonlightcheese
Votre service n'est pas démarrée. Démarrez le service avec
startService(bindIntent)
Voir ce code similaire:
Vous pouvez également démarrer le service automatiquement lors de la liaison avec BIND_AUTO_CREATE au lieu de 0.
Ici est la ServiceTools classe aussi, si vous voulez seulement votre service pour être lancé une fois. Sinon, vous pouvez obtenir plus d'une instance en cours d'exécution de votre service et les méthodes appelées dans onServiceConnected sera rut chaque fois onCreate() /doBind ().
OriginalL'auteur Kevin Parker