2014-12-03 3 views
0

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

Применение А в пакете «com.example.app_a» Сервис находится в другом пакете «com.example.app_talker_service»

Так что я просто не могу относиться к службе с xxx.class решение, поэтому я предполагал использовать фильтр намерений в файле манифеста пакета службы.

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

Вот код для Приложение А, которое связывает в OnStart():

@Override 
protected void onStart() 
{ 
    // TODO Auto-generated method stub 
    super.onStart(); 

    //Bind to service 
    getApplicationContext().bindService(new Intent("com.example.talker_service.SERVICE"), mConnection,Context.BIND_AUTO_CREATE); 


} 
    private boolean mIsBound = false; 

private ServiceConnection mConnection = new ServiceConnection() 
{ 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     // TODO Auto-generated method stub 
     mIsBound = true; 
     Toast.makeText(getApplicationContext(), "CONNECTED TO SERVICE!", Toast.LENGTH_SHORT).show(); 

     Intent intent = new Intent(); 
     intent.setAction("com.example.talker_service.SERVICE"); 
     intent.putExtra("REQUEST", "REGISTER APP"); 

     intent.putExtra("FILTER", "com.example.app_a"); 
     intent.putExtra("NAME", "Applicazione A"); 

     String[] components = {"NUMBER_SENT","CHANGE_TEXT_COLOR","CHANGE_TEXTVIEW_SIZE"}; 
     intent.putExtra("COMPONENTS", components); 

     MainActivityA.this.sendBroadcast(intent); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     // TODO Auto-generated method stub 
     mIsBound = false; 
    } 

}; 

Здесь вместо является cmanifest за службу, которую я назвал Talker_service:

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <service 
      android:name=".Talker_Service" 
      android:enabled="true" 
      android:exported="true" 
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
      <intent-filter > 
       <action android:name="com.example.talker_service.SERVICE"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
     </service> 

     <activity 
      android:name=".ConnectionManagerActivity" 
      android:label="@string/title_activity_connection_manager" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

Я не undertsand, почему он не связывает .. Я поставьте фильтр намерений, я что-то упустил? Ах, и журналы говорят, что это:

12-03 22: 45: 13,786: W/ContextImpl (26076): Неявные намерения с StartService являются не безопасно: Намерение { акта = com.example.talker_service. ОБСЛУЖИВАНИЕ} android.content.ContextWrapper.bindService: 517 com.example.app_a.MainActivityA.onStart: 81 android.app.Instrumentation.callActivityOnStart: 12-03 тысячи сто семьдесят-одиных 22: 45: 13,786: Вт/ActivityManager (764) : Не удалось запустить услугу Intent {> act = com.example.talker_service.SERVICE} U = 0: не найдено

Это вместо того, чтобы это файл манифеста для приложения

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

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="19" /> 
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" ></uses-permission> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivityA" 
      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> 

</manifest> 

ответ

0

Я не знаю, почему с помощью фильтров намерений не работает (он говорит, что он не может найти его), но используя следующий код, который я смог чтобы сделать мое приложение подключиться к удаленному сервису:

Intent i = new Intent(); 
    i.setClassName("com.example.app_talker_service", "com.example.app_talker_service.Talker_Service"); 
    bindService(i, conn, Context.BIND_AUTO_CREATE); 

так, используя метод seClassName и обеспечивая имя pacake и что полный путь к службе, я был в состоянии сделать его работу. Я не уверен, что это попадает в сферу «лучшей практики» для этого типа проблем, но для меня это сработало. Любое решение лучше, чем никакое решение. Я нашел это решение по этой ссылке:

Remote Service Tutorial

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