Состояние гонки между Activity.onStart() и ServiceConnection.onServiceConnectedAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Состояние гонки между Activity.onStart() и ServiceConnection.onServiceConnected

Сообщение Anonymous »

Я создаю системный сервис, а также библиотеку SDK для использования приложения. Я пытаюсь предоставить метод одного вызова для привязки службы, чтобы приложению не приходилось уделять этому слишком много внимания. Вот как я планирую сделать в библиотеке SDK.

Код: Выделить всё

public class TestServiceManager {

private static final String BINDER_PKG = "testservicemanager";
private static final String BINDER_CLASS = "testservicemanager.TestServiceManager";
private ITestService mBinder = null;
private ServiceConnection mConnection = null;

public TestServiceManager(Context context) {
doBindService(context);
}

// this API is exposed through jar for apps to use
public synchronized String getInformation() {
String info;
try {
if (mBinder != null) {
info = mBinder.getInformation();
} else {
Log.d(TAG, "mBinder is null!!");
}

} catch (RemoteException e) {
Log.e(TAG, "API call failed!!");
}
return info;
}

private synchronized void doBindService(Context context) {
mConnection =
new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mBinder = ITestService.Stub.asInterface(service);
}

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

Intent intent = new Intent();
intent.setComponent(new ComponentName(BINDER_PKG, BINDER_CLASS));
if (false == context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
Log.d(TAG, "doBindService failed!");
} else {
Log.d(TAG, "doBindService success!");
}
}
}

И у меня есть пример приложения, иллюстрирующий использование библиотеки SDK.

Код: Выделить всё

public class MainActivity extends Activity {

private int result = 0;
private TestServiceManager mManager = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mManager = new TestServiceManager(MainActivity.this);
}

@Override
public void onStart() {
super.onStart();
mManager.getInformation();
}

@Override
public void onDestroy() {
Log.i(TAG, "in onDestroy");
}
}
Теперь я столкнулся с проблемой состояния гонки между onStart() и onServiceConnected(). onServiceConnected() всегда вызывается после onStart(), поэтому при вызове getInformation() в onStart() mBinder всегда имеет значение null. Поэтому я пытаюсь получить помощь здесь.
Я надеюсь, что приложению будет проще привязать службу, кроме того, служба должна запускаться в одном экземпляре. Вот несколько методов, которые я пробовал.
  • Создайте отдельный поток с отдельным циклизатором и вызовите метод методаbindServiceAsUser() в этом потоке. Но onServiceConnected() по-прежнему вызывается в основном потоке.
  • Измените AndroidManifest.xml, добавив «android:process», чтобы разрешить выполнение действий в отдельных процессах. Но все действия по-прежнему имели один и тот же основной поток и один и тот же циклизатор.
  • Используйте отражение для вызова скрытой функции bindServiceAsUser(), которая принимает Handler в качестве параметра. Но случается исключение NoSuchMethodException.
  • Вызовите метод bindService() для привязки службы, чтобы я мог указать исполнителя для onServiceConnected. Но несколько процессов моего сервиса созданы под другим uid.


Подробнее здесь: https://stackoverflow.com/questions/783 ... iceconnect
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»