2012-03-06 9 views
0

バックグラウンドでネットワーク関連のタスクを実行するために、アンドロイドでサービスを開始しようとしています。私は、サービスである私のアプリケーションのための基本的なネットワークマネージャーを書いています。私は基本的にアンドロイドのドキュメントからチュートリアルを使用しました。基本的な構造は以下の通り行く:サービスは変数に開始/バインドされませんか?

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()何の問題もなくと呼ばれるように見えますが、変数「NetworkManagerは」常にnullです!私はすでに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

ActivitydoSomeAppRelatedStuff()になり、バインディングが完了する前にnetworkManagerを使用しようとしています。

doSomeAppRelatedStuff()の場合は、ネットワークマネージャが機能する必要がある場合は、doSomeAppRelatedStuff()へのコールをonServiceConnected()に移動して、バインドが完了するまで実際には開始しません。これを行うと、あなたのonStart()onResume()コールは、おそらく(ただし、保証されません)、バインディングが完了する前に行われるので、それに応じてプログラムしてください。

+0

こんにちは!あなたは正しいようです! onServiceConnected()にdoSomeAppRelatedStuff()を入れることは、そのトリックを行いました。ありがとう! – user1228633

+0

喜んで助けてください!あなたの問題を解決した場合は、その答えを受け入れてください(チェックボックスをクリックしてください)。 – Argyle

関連する問題