Служба не запускается / привязывается к переменной? - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь запустить службу на 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 (), кажется, вызывается без проблем, но переменная "networkManager" всегда равна нулю! Я уже пытался выполнить отладку в методе 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 Ответ

1 голос
/ 07 марта 2012

Скорее всего, ваш Activity входит в doSomeAppRelatedStuff() и пытается использовать networkManager до завершения привязки.

Если doSomeAppRelatedStuff() обязательно должен иметь сетевого менеджера для работы, переместите ваш вызов на doSomeAppRelatedStuff() на onServiceConnected(), чтобы он фактически не начался, пока не будет завершена привязка. Обратите внимание, что если вы сделаете это, ваши onStart() и onResume() вызовы, вероятно, (но не гарантированные!) Произойдут до завершения привязки, поэтому запрограммируйте соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...