Есть ли обходной путь для FLAG_RECEIVER_Rurable_ONLY, когда используется только BroadcastReceiver? - PullRequest
1 голос
/ 13 марта 2012

Я хочу получать оповещения, если гарнитура подключена. Но намерение "ACTION_HEADSET_PLUG" используется с флагом "FLAG_RECEIVER_Rurable_ONLY".Таким образом, мне нужно постоянно запускать службу или действие, чтобы получить намерение?Я просто хочу, чтобы запустить Broadcastreceiver и никаких услуг или деятельности вообще.Есть ли обходной путь для этого?Это вообще возможно?Или я могу запустить службу один раз, зарегистрировать, а затем остановить ее?

PS: я знаю, когда гарнитура отключается с нарастающим шумом.

Спасибо за ваши ответы.

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Дайан Хэкборн говорит

Он предоставляется только тем, кто вызывает registerReceiver, а не отправляется на получатели заявлены в манифестах.

То есть у вас должно быть что-то, что вызывает registerReceiver. Если он перестает работать, и вы не отмените регистрацию приемника, вы получите ошибку.

0 голосов
/ 13 марта 2012

Существуют компоненты, которые должны быть зарегистрированы при установке приложения (<3.0) или, по крайней мере, когда приложение <b>перешло из остановленного состояния в запущенное (3.0 и ICS), например, ContentProvider.

По всей видимости, у провайдера нет «конца» своего жизненного цикла, о котором вам нужно (очень) беспокоиться.

Проще говоря, добавив <provider> к вашему AndroidManifest.xml:

<provider android:name=".ReceiverProvider"
    android:authorities="some.provider.authority.goes.here"
    android:exported="true" />

А, для ReceiverProvider:

public class ReceiverProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                System.out.println("Headset plug: " + intent);
            }
        };
        IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
        getContext().registerReceiver(receiver, filter);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        return null;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

Возможно, стоит попробовать.

...