Код: Выделить всё
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!");
}
}
}
Код: Выделить всё
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");
}
}
Я надеюсь, что приложению будет проще привязать службу, кроме того, служба должна запускаться в одном экземпляре. Вот несколько методов, которые я пробовал.
- Создайте отдельный поток с отдельным циклизатором и вызовите метод методаbindServiceAsUser() в этом потоке. Но onServiceConnected() по-прежнему вызывается в основном потоке.
- Измените AndroidManifest.xml, добавив «android:process», чтобы разрешить выполнение действий в отдельных процессах. Но все действия по-прежнему имели один и тот же основной поток и один и тот же циклизатор.
- Используйте отражение для вызова скрытой функции bindServiceAsUser(), которая принимает Handler в качестве параметра. Но случается исключение NoSuchMethodException.
- Вызовите метод bindService() для привязки службы, чтобы я мог указать исполнителя для onServiceConnected. Но несколько процессов моего сервиса созданы под другим uid.
Подробнее здесь: https://stackoverflow.com/questions/783 ... iceconnect
Мобильная версия