Android: почему намерение не получено вещателем? - PullRequest
3 голосов
/ 08 августа 2011

У меня есть несколько намерений, которые активность отправляет на обслуживание.Все они зарегистрированы в манифесте:

<service android:name=".location.LocationService" android:label="@string/location_service_started">
                    <intent-filter>
                        <action android:name="@string/location_service_set" />
                        <action android:name="@string/location_service_start" />
                        <action android:name="@string/location_service_stop" />             
                    </intent-filter>
</service>

Но получаются только намерения location_service_start и location_service_stop.Что может быть причиной?Вот код моего получателя:

private BroadcastReceiver LocationServiceReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(getString(R.string.location_service_stop)))
        {
            showMessage("stop");    
        }
        if(intent.getAction().equals(getString(R.string.location_service_start)))
        {
            showMessage("start");
        }   
        if(intent.getAction().equals(getString(R.string.location_service_set)))
        {
            showAlertBox("set");    

        }
    }
}; 

Так что я никогда не вижу сообщения "set".Я даже пытался поместить sendBroadcast для «start» и «set» сообщений в одном месте, но все по-прежнему.«start» - «OK», «set» - никогда не принимается.

Функции, которые запускают намерения:

protected void start()
    {
        Intent intent = new Intent(getString(R.string.location_service_start));
        getApplicationContext().sendBroadcast(intent);
    }

protected void set(double lat, double lon, double rad)
    {
        Intent intent = new Intent(getString(R.string.location_service_set));
        intent.putExtra("lat", lat);
        intent.putExtra("lon", lon);
        intent.putExtra("rad", rad);
        getApplicationContext().sendBroadcast(intent);
    }

Обе команды отправляются правильно, без ошибок, действия верны.


UPD:

О, моя вина.Я забыл добавить filter.addAction ... для новых намерений.Мне жаль.Но ответы были действительно полезны!Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Все они зарегистрированы в манифесте:

Как правило, вы не используете строковые ресурсы для строк действий в <intent-filter>, потому что вы никогда не хотите их интернационализировать.

Как правило, вы вообще не используете <intent-filter> со службой, если только вы не предоставляете эту услугу сторонним приложениям. На самом деле, прямо сейчас вы открываете свой сервис сторонним приложениям, поэтому любой может отправить эти команды вашему сервису.

Но принимаются только намерения location_service_start и location_service_stop

Нет, ни один из них не получен службой. Вы отправляете трансляции в коде Java. Службы не принимают трансляции.

Функции, которые запускают намерения:

Не используйте getApplicationContext(), если вы не знаете, что делаете. Что бы вы ни звонили getApplicationContext() на , это a Context, так что вы можете просто позвонить sendBroadcast() на него.

1 голос
/ 08 августа 2011

Скопируйте и вставьте из на этот вопрос Я только что ответил.Должна быть та же проблема.

Вы должны поместить каждый тег <action /> в отдельный тег <intent-filter /> в вашем манифесте.

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

Нулевой или более тегов действия [..] должны быть включены внутрь для описания содержимого фильтра.

Источник

...