2014-01-13 2 views
1

У меня есть приемник onBootCompleted, зарегистрированный в манифесте. Он запускает MyService. Моя служба в onCreate динамически регистрирует еще 3 широковещательных приемника. В 3 новых ресиверов фильтр на следующих намерениях действийПочему динамическая регистрация широковещательного приемника не работает после перезагрузки

  • LOCALE_CHANGED,
  • TIMEZONE_CHANGED и
  • CONNECTIVITY_CHANGED.

Это работает правильно, когда я запускаю приложение из Eclipse, но после перезагрузки устройства и запуска моего сервиса никто из приемников не работает.

У меня есть работа вокруг реализации, но я хотел бы знать, почему это происходит?

Manifest:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<receiver android:name=".receiver.BootCompletedReceiver" > 
    <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.HOME" /> 
     </intent-filter> 
    </receiver> 
    <service 
     android:name=".MyService" 
     android:enabled="true" 
     android:exported="false" 
     android:stopWithTask="false" > 
    </service> 

Услуги:

public class MyService() 
{ 
LocationTimeZoneC‌​hangedReceiver mLocationTimeZoneC‌​hangedReceiver = new LocationTimeZoneC‌​hangedReceiver() 
NetworkChangedReceiver mNetworkChangedReceiver = new NetworkChangedReceiver() 

public void onCreate() 
{ 
    registerReceiver(mLocationTimeZoneChangedReceiver, new IntentFilter(Intent.ACTION_LOCALE_CHANGED)); 
    registerReceiver(mLocationTimeZoneC‌​hangedReceiver, new IntentFilter(Intent.ACTION_TIMEZONE_CHANGED)); 
    registerReceiver(mNetworkChangedReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
} 
} 

BootCompletedReceiver:

public class BootCompletedReceiver extends BroadcastReceiver 
{ 
     public void onReceive(Context context, Intent intent){} 
} 

MyApplication:

public class MyApplication extends Application 
{ 
    ServiceConnection mServiceConnection = new ServiceConnection() { anonymous class...} 

    public void onCreate() 
    { 
     bindService(new Intent(this, MyService.class), mServiceConnection,Context.BIND_AUTO_CREATE); 
    } 
} 

Отредактировано: Отредактированный код для Plinio.Santos.

Это большое приложение со многими движущимися частями, поэтому в лучшем случае я могу опубликовать небольшие фрагменты кода.

Ниже приведены шаги, которые я имею следующие тестировании:

  • Push-приложение с помощью Eclipse,
  • тест, приемник изменения сети работает
  • отпуск WiFi от
  • Теперь перезагрузите устройство
  • дождитесь начала процесса и включения Wi-Fi.
+0

Ваша служба запускает все эти 3 при перезагрузке? – Saqib

+0

Да в службе onCreate() У меня было до реализации моего обходного пути следующее. 'registerReceiver (mLocationTimeZoneChangedReceiver, новый IntentFilter (Intent.ACTION_LOCALE_CHANGED)); \t registerReceiver (mLocationTimeZoneChangedReceiver, новый IntentFilter (Intent.ACTION_TIMEZONE_CHANGED)); registerReceiver (mNetworkChangedReceiver, новый IntentFilter (ConnectivityManager.CONNECTIVITY_ACTION)); ' Я включил и выключил Wi-Fi после перезапуска устройства и не видел ни одного журнала из-за изменения соединения во время работы моего приложения. – TealFawn

+0

Ответ на D_Vaibhav, я не понимаю, что приемники запускать, когда процесс приложения не запущен, и, зарегистрировав их в манифесте, изменение wifi запустит все приложение без необходимости в некоторых случаях. – TealFawn

ответ

0

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

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

AndroidManifest.xml:. Класс

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<receiver android:name=".TestReceiver" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 
<service 
    android:name=".TestService" 
    android:exported="true" /> 

приемника : класс

public class TestReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent != null && Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
      Toast.makeText(context, "Intent.ACTION_BOOT_COMPLETED receiverd !", Toast.LENGTH_SHORT).show(); 
      context.startService(new Intent(context, TestService.class)); 
     } 
    } 
} 

Услуги:

public class TestService extends Service { 
    private BroadcastReceiver mConnectivityChangedReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent != null && ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { 
       Toast.makeText(context, "ConnectivityManager.CONNECTIVITY_ACTION receiverd !", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     registerReceiver(mConnectivityChangedReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
    } 
} 
Смежные вопросы