2014-01-13 18 views
1

我在清單中註冊了onBootCompleted廣播接收器。 它運行啓動MyService。我的onCreate服務動態註冊3個廣播接收器。 的3點新的接收器以下的意圖行動爲什麼在重新啓動後動態註冊廣播接收器不工作

  • LOCALE_CHANGED,
  • TIMEZONE_CHANGED和
  • CONNECTIVITY_CHANGED過濾。

這些工作正常,當我從Eclipse運行應用程序,但重新啓動設備後,我的服務啓動沒有接收器工作。

我有一個工作實施,但我想知道爲什麼會發生這種情況?

清單:

<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的編輯代碼。

這是一個有很多移動部件的大應用程序,所以我最多可以發佈小代碼片段。

以下是我下面的測試步驟:通過Eclipse

  • 推送應用,
  • 測試網絡更改接收器工作
  • 假的wifi關閉
  • 現在重新啓動設備
  • 等待進程啓動並打開wifi。
+0

您的服務是否在重新啓動時全部啓動3個? – Saqib

+0

是的在服務onCreate() 我在實施我的解決方法之前有以下。 'registerReceiver(mLocationTimeZoneChangedReceiver,new IntentFilter(Intent.ACTION_LOCALE_CHANGED)); \t registerReceiver(mLocationTimeZoneChangedReceiver,new IntentFilter(Intent.ACTION_TIMEZONE_CHANGED)); registerReceiver(mNetworkChangedReceiver,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));' 重啓設備後,我會打開和關閉wifi,並且在我的應用程序進程運行時沒有看到連接更改中的任何日誌。 – 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)); 
    } 
}