0

Прежде всего, я скажу, что я нашел много вопросов, почти идентичных этому здесь, на SO уже, но ни один из них (который я мог найти) не решил проблему. Вот некоторые из них я смотрел:Android: onServiceConnected не вызывается после bindService

ServiceConnection.onServiceConnected() never called after binding to started service onServiceConnected never called after bindService method ServiceConnection::onServiceConnected not called even though Context::bindService returns true? OnServiceConnected not getting called

Вот часть моего андроида кода приложения:

//Local service interface 
private INetworkQueryService myNetworkQueryService = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    init(); 
    Intent intent = new Intent(this, NetworkQueryService.class); 
    startService (intent); 
    bindService (new Intent(this, NetworkQueryService.class), myNetworkQueryServiceConnection, 
          Context.BIND_AUTO_CREATE); 
} 

//Service connection 
private final ServiceConnection myNetworkQueryServiceConnection = new ServiceConnection() { 
    /** Handle the task of binding the local object to the service */ 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     myNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService(); 
     // as soon as it is bound, run a query. 
     loadNetworksList(); 
    } 

    /** Handle the task of cleaning up the local binding */ 
    public void onServiceDisconnected(ComponentName className) { 
     myNetworkQueryService = null; 
    } 

    public void loadNetworksList() { 
     // delegate query request to the service. 
     try { 
      myNetworkQueryService.startNetworkQuery(myCallback); 
     } catch (RemoteException e) { 
     } 
    } 

}; 

/** 
* This implementation of INetworkQueryServiceCallback is used to receive 
* callback notifications from the network query service. 
*/ 
private final INetworkQueryServiceCallback myCallback = new INetworkQueryServiceCallback.Stub() { 

    @Override 
    public void onQueryComplete(List<NetworkInfo> networkInfoArray, 
      int status) throws RemoteException { 
     displayNetworks(networkInfoArray, status); 
    } 

    /** place the message on the looper queue upon query completion. */ 

}; 

Как вы можете С.Ю., myNetworkQueryServiceConnection должен вызывается из метода bindService (находится в onCreate()). Это (теоретически) также должно работать onServiceConnected (я думаю), но я поставил точку останова в своем коде и никогда не останавливается внутри этого метода. Я выполнил некоторую отладку, и bindService возвращает false, поэтому по какой-то причине она не успешно связывает ее.

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

Сообщите мне, если вам не хватает какой-либо информации. Я не уверен, что вам может понадобиться, и я действительно не могу опубликовать весь код приложения здесь.

EDIT: Я продолжаю читать информацию о регистрации службы в манифесте, но не могу понять, где и как это будет сделано? Вот манифест для этого проекта:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.tek15.cellemrmonitor" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="19" 
    android:targetSdkVersion="21" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

Я, конечно, не вижу ничего об услуге, но я предполагаю, что я не знаю, как добавить его.

+0

У вас есть эта служба, правильно зарегистрированная в манифесте? FWIW, вот пример приложения, демонстрирующий 'bindService()' для локальной службы: https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Local – CommonsWare

+0

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

+0

AndroidManifest.xml добавлено – DerStrom8

ответ

7

Вы должны добавить <service> элемент, как пэр вашего <activity> элемента, как ребенок <application>: полностью

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.tek15.cellemrmonitor" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="19" 
    android:targetSdkVersion="21" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     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="NetworkQueryService" /> 
</application> 

Моего пример элемент предполагает, что NetworkQueryService действительно com.tek15.cellemrmonitor.NetworkQueryService — иначе, замена в надлежащее -qualified имя класса.

+0

Большое спасибо за это! NetworkQueryService на самом деле находится в com.android.phone, поэтому я добавил в манифест следующее: '' Исправлена ​​одна проблема - bindService теперь возвращает true. Однако я столкнулся с другой проблемой, которая (возможно) не связана: 'java.lang.RuntimeException: PhoneFactory.getDefaultPhone должен быть вызван из Looper thread'. Я буду копаться в этом и открыть другой вопрос, если потребуется. Я, вероятно, соглашусь с этим ответом, поскольку он технически исправляет проблему, о которой я изначально заявил. Спасибо @CommonsWare! – DerStrom8

+0

@ derstrom8: «NetworkQueryService на самом деле находится в com.android.phone» - копирование кусков основного кода AOSP в приложения обычно не работает. – CommonsWare

+0

Да, я столкнулся с несколькими проблемами раньше, но мне удалось исправить только те части, которые мне нужны.Я исправил проблему с петлером (исправление было простым), поэтому теперь я фокусируюсь на разрешениях, один из которых - CONNECTIVITY_INTERNAL. Я беспокоюсь, что это ТОЛЬКО доступно системным приложениям, и я не смогу его использовать (I 'm не видя его в списке разрешений) – DerStrom8

Смежные вопросы