2012-03-06 52 views
0

我試圖以performe一些網絡相關的任務在後臺啓動Android上的服務。我爲我的應用程序編寫了一個基本的網絡管理器,這是一項服務。我基本上使用了android文檔中的教程。基本結構變爲如下:服務不會啓動/綁定到變量?

public class MyNetworkManager extends Service { 
// some code 

private final IBinder mBinder = (IBinder) new MyBinder(); 
@Override 
public IBinder onBind(Intent arg0) { 
    return mBinder; 
} 

public class MyBinder extends Binder { 
    MyNetworkManager getService() { 
     return MyNetworkManager.this; 
    } 
} 

public void onCreate() { 
// some network related stuff like setting up sockets etc. 
} 

public void onStart(Intent intent, int startid) { 
    while(true) { 
     // receive new connections etc 
    } 
} 

調用應用程序/活動則是:

public class AndroidNetworkManagerClient extends Activity { 
    private Button buttonSend; 
    private EditText inputText; 
    private TextView outputText; 
    private MyNetworkManager networkManager; 

    private ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceConnected(ComponentName className, IBinder binder) { 
      networkManager = ((MyNetworkManager.MyBinder) binder).getService(); 
     } 

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

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     inputText = (EditText) findViewById(R.id.textInput); 
     outputText = (TextView) findViewById(R.id.textOutput); 
     buttonSend = (Button)this.findViewById(R.id.buttonSend); 
     buttonSend.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      if (inputText.getText().length() != 0) { 
       outputText.append("Out: " + inputText.getText() + "\n"); 
       networkManager.sendData("localhost", inputText.getText().toString()); 
      } 
     } 
    }); 


     bindService(new Intent(this, MyNetworkManager.class), mConnection, Context.BIND_AUTO_CREATE); 

     doSomeAppRelatedStuff(); 
    } 

bindService()似乎沒有任何問題被調用,但是變量「網絡管理器」總是空!我已經嘗試調試到onCreate()方法或onServiceConnected(),但看起來,這些部分根本沒有達到(至少沒有觸發斷點)。

服務已被註冊在AndroidManifest.xml:

package="some.random.name" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".AndroidNetworkManagerClient" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".MyNetworkManager"></service> 
</application> 

任何人的想法?

回答

1

可能是,您的Activity正在進入doSomeAppRelatedStuff()並嘗試在綁定完成之前使用networkManager

如果doSomeAppRelatedStuff()絕對必須有網絡管理器才能運行,請將您的呼叫轉移到onServiceConnected(),以便在綁定完成之前不會真正開始。請注意,如果你這樣做,你的onStart()onResume()通話將可能(但不保證!)之前發生綁定完成,所以程序相應。

+0

嗨!你看起來沒錯!把onSomeAppRelatedStuff()放在onServiceConnected()中就可以了。謝謝! – user1228633 2012-03-06 22:47:13

+0

很高興幫助!如果它解決了您的問題,請接受答案(點擊複選框)。 – Argyle 2012-03-06 23:02:37