Фоновая служба отключена после получения трансляции

У меня есть широковещательный приемник, который получает завершенную загрузку android.intent.action.DOWNLOAD_COMPLETE из класса DownloadManager Android. Широковещательный приемник определяется в XML следующим образом:

<receiver android:name=".DownloadReceiver" >
  <intent-filter>
    <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
  </intent-filter>
</receiver>

Все работает хорошо, если я продолжаю работать. Однако, если действие не выполняется, пока служба работает в фоновом режиме, это приводит к тому, что фоновый сервер отключается каждый раз, когда поступает DOWNLOAD_COMPLETE широковещательная рассылка.

Широковещательный приемник:

public class DownloadReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
       // it will cause MyService to be killed even with an empty implementation!
   }
}

Услуга:

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        Log.w(TAG, "onBind called");

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.w(TAG, "onCreate called");

    }

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

        Log.w(TAG, "onStartCommand called");

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.w(TAG, "onDestroy called");
    }
}

Activity запускает службу:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

            startService();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);

    return true;
}

public void startService() {
    Intent start = new Intent(getApplicationContext(), MyService.class);
    startService(start);
}

public void stopService() {
    Intent stop = new Intent(getApplicationContext(), MyService.class);
    stopService(stop);
}
}

Любая идея, почему служба была убита трансляцией, когда активность не запущена?

Спасибо!!


person rain    schedule 24.03.2013    source источник
comment
почему вы создаете новое намерение для того же класса   -  person Monty    schedule 27.03.2013
comment
почему вы дважды создаете объект для намерения... просто используйте первый для запуска и остановки службы.   -  person Monty    schedule 27.03.2013
comment
@CobraAjgar Использование разных намерений для запуска и остановки службы не является причиной проблемы.   -  person rain    schedule 07.04.2013


Ответы (1)


Откуда вы звоните stopService()?

Если вы звоните в onPause(), onStop() или onDestroy() своего Activity, то ваш Service останавливается каждый раз, когда вы выходите из Activity или когда Activity уничтожается системой.

Я не вижу никакой связи между BroadcastReceiver или трансляцией системы и вашим Service из кода, который вы разместили.

person Sam    schedule 27.03.2013
comment
Служба является службой переднего плана и продолжает работать, даже если активность закрыта. stopService() вызывается только из события нажатия кнопки. Активность onPause(), onStop() или onDestroy() не влияет на службу. И да, DownloadReceiver вообще не подключен к MyService. MyService не обрабатывает трансляции. Я обновил свой первоначальный вопрос классом активности. - person rain; 07.04.2013