2010-12-16 6 views
0

Wenn meine Aktivität gestartet wird, erstellt sie einen Dienst, der als Server fungiert. Der Server empfängt Rohdaten von meinem Python-Skript auf meinem Desktop. Der Service erstellt und verwaltet DataManager, die alle Daten aus meinem Python-Skript in einer Hash-Map verarbeiten, die mit dem DM-Namen verknüpft ist. Zu jeder Zeit benötige ich eine Aktivität, um an die Dienstanforderung einige Daten von dem Dienst und dem Prozess zu binden, wenn die Aktivität anhält, stoppt oder zerstört wird, wird sie losgebunden.Android-Dienst verbindet?

Ich glaube, ich habe die Bindung korrekt, aber wenn ich den Dienst starte, wird die übergebene ServiceConnection immer null zurückgegeben. Irgendeine Idee ist was los? direkt von der Remoteservice-Klasse von Android Dank ~ Aedon

{-Code Nachtrag} gestohlen wurde mein Code

Die Homescreen-Aktivität, die

@Override public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    doBindService(); 
    setContentView(R.layout.homescreen); 
    initView(); 
} 

public void initView() { 
    workbenchs = (Gallery)findViewById(R.id.workbenchs); 
    workbenchs.setMinimumHeight(h/4); 
    workbenchs.setAdapter(new WorkBenchAdapter(this)); 
    workbenchs.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
      Intent it = new Intent(HomeScreen.this, Controller.class); 
      it.putExtra("workbench", arg2); 
      startActivity(it); 
     } 
    }); 
} 

// Gallery Adapter 

public class WorkBenchAdapter extends BaseAdapter { 
    public WorkBenchAdapter(Context c) { } 
    public int getCount() {return mBoundService.getNumBenchs();} 
    public Object getItem(int position) {return position;} 
    public long getItemId(int position) {return position;} 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(HomeScreen.this); 
    i.setImageBitmap(mBoundService.getWorkbench(position).toBitmap()); 
     i.setLayoutParams(new Gallery.LayoutParams(w/4, h/4)); 
     return i; 
    } 
} 


// Service Necessities 

public boolean mIsBound = false; 
private PublicService mBoundService; 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     mBoundService = ((PublicService.LocalBinder)service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mBoundService = null; 
    } 
}; 

void doBindService() { 
    Log.d(TAG, "Binding..."); 
    bindService(new Intent(this, PublicService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
    Log.d(TAG, "Bound."); 
} 

void doUnbindService() { 
    if (mIsBound) { 
     Log.d(TAG, "Unbinding..."); 
     unbindService(mConnection); 
     mIsBound = false; 
     Log.d(TAG, "Unbound."); 
    } 
} 

Mein Problem mit dem PublicService bindet kommt aus dem Workbench-Adapter . Wenn der Adapter erstellt wird, ruft call den Wert count ab (der mit 0 beginnt), sagt aber immer, dass der mBoundService null ist. Ich habe versucht, den Dienst vor dem Binden zu starten, und das ändert nichts ...

+0

angeben müssen, können Sie den Code in Bezug auf Post, dass auch? – xandy

+0

Sorry wegen der Sauerei, das verdammte Ding weigert sich zu blockieren, was ich ihm gegeben habe. zum Beispiel die/** */Kommentare sollen lange Schlangen sein ***** – AedonEtLIRA

+0

Um zu lernen, wie Code zu schreiben lesen Sie dies: http://stackoverflow.com/editing-help – Cristian

Antwort

2

Haben Sie die Service-Tag in Ihrem Manifest angegeben?

In <application> Sie den Dienst wie diese <service android:name="namespace.ServiceName"/>

+0

Ja. Ich denke, was los ist, ist dass, während ich den Dienst binden, lange bevor ich initView() deklariere, ist die Erstellung des Dienstes zu der Zeit nicht abgeschlossen, die initView() aufgerufen wird und daher versucht, einen Null-Service aufzurufen. – AedonEtLIRA

+0

Danke dafür. Löste mein Problem auch. – CeejeeB