服务在单一广播上引发数百次

时间:2015-12-17 20:13:26

标签: java android android-intent service android-service

我正在从活动向服务发送广播:

的活动:

        Timber.d("SENDING REQUEST");
        // Send broadcast to service to request GPS (this avoids concurrency issues with file collision)
        Intent updateActivitiesRequest = new Intent(A_GPS.UPDATE_ACTIVITIES_REQUEST);
        sendBroadcast(updateActivitiesRequest);

服务:

@Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        startService(intent);

        _updateRequestReciever = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                Log.d(TAG, "GOT IT");
               // broadcastSavedActivityDataForToday();
            }
        };

        IntentFilter intentFilter = new IntentFilter(A_GPS.UPDATE_ACTIVITIES_REQUEST);
        registerReceiver(_updateRequestReciever, intentFilter);

        return START_NOT_STICKY;
    }

但是,当请求被触发一次时,我的服务中的onReceive会引发数百起火灾:

  

D / A_GPS:发送请求

     

D / S_GPS:GOT IT

     

D / S_GPS:GOT IT

     

D / S_GPS:GOT IT

     

D / S_GPS:GOT IT

     

......还有数百个

它实际上发生了很多次,我的logcat甚至无法处理它,我得到一系列错误充斥着控制台。我尝试发送回复时遇到的一些错误是:

  1. 交易活页夹失败(以及!! FAILED TRANSACTION BINDER !!)
  2. 发送Intent {} android.os.DeadObjectException
  3. 的广播结果失败
  4. TransactionTooLargeException
  5. 显然,这是因为它在我取消注释broadcastSavedActivityDataForToday()时尝试发送回复,结果是数百条回复。

    你知道为什么我的服务中的广播接收器会从单个广播意图中发射数百次吗?

1 个答案:

答案 0 :(得分:1)

有两个原因:

  1. 您的服务正在从startService()呼叫onStartCommand()。这就是我们所说的"无限循环"。不要这样做。

  2. 您正在onStartCommand()注册接收器,因此每次startService()呼叫都会注册一个接收器。在onCreate()

  3. 中注册一次接收器