为什么重启后动态注册广播接收器不起作用

时间:2014-01-13 14:22:06

标签: android service

我在清单中注册了一个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。

1 个答案:

答案 0 :(得分: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));
    }
}