Android BroadcastReceiver при запуске - продолжайте работать, когда активность в фоновом режиме - PullRequest
50 голосов
/ 13 марта 2011

Я отслеживаю входящие SMS.

Мое приложение отлично работает с BroadcastReceiver.Однако он работает из Activity и хотел бы, чтобы BroadcastReceiver работал все время (и не только во время работы Activity).

Как мне этого добиться?Я просмотрел жизненный цикл BroadcastReceiver, но все, что упомянуто в документации, это то, что жизненный цикл ограничен методом onReceive, а не жизненным циклом проверки BroadcastReceiver входящих SMS.

Как я могу сделать это постоянным?

Спасибо

Ответы [ 2 ]

141 голосов
/ 13 марта 2011

Необходимо указать получатель в манифесте с именем действия android.intent.action.BOOT_COMPLETED .

<!-- Start the Service if applicable on boot -->
<receiver android:name="com.prac.test.ServiceStarter">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

Не забудьте также включить заполненныйразрешение на загрузку.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Используйте Сервис , чтобы все сохранялось.И используйте приемники для получения событий Boot Up, чтобы перезапустить службу снова, если система загружается.

Код для запуска службы при загрузке.Заставь Сервис делать твою работу по проверке смс или что хочешь.Вы должны выполнять свою работу в MyPersistingService, определить ее самостоятельно.

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class ServiceStarter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent("com.prac.test.MyPersistingService");
        i.setClass(context, MyPersistingService.class);
        context.startService(i);
    }
}
7 голосов
/ 14 июля 2016

Обслуживание или загрузка завершена не обязательна

На самом деле вам не нужно вводить Service или регистрироваться на android.intent.action.BOOT_COMPLETED

Некоторые примерыпоказывает, как зарегистрировать / отменить регистрацию BroadcastReceiver при создании и уничтожении действия.Тем не менее, это полезно для намерений, которые вы ожидаете, только когда приложение открыто (например, для внутренней связи между Service / Activity).

Однако, в случае SMS, вы хотите прослушать намерение всевремя (и не только, когда ваше приложение открыто).

Есть еще один способ

Вы можете создать class, который расширяет BroadcastReceiver и зарегистрироваться с желаемыми намерениямичерез AndroidManifest.xml.Таким образом, BroadcastReceiver не будет зависеть от вашей активности (и не будет зависеть от жизненного цикла активности)

Таким образом, ваше BroadcastReceiver будет автоматически уведомлено Android, как только придет SMS, даже еслиВаше приложение закрыто.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    ...
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application>
        ....
        <receiver android:name=".MyCustomBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent != null) {
            String action = intent.getAction();
            if(action != null) {
                if(action.equals("android.provider.Telephony.SMS_RECEIVED")) {
                    // DO YOUR STUFF
                } else if (action.equals("ANOTHER ACTION")) {
                    // DO ANOTHER STUFF
                }
            }
        }
    }
}

Примечания

Вы можете добавить другие фильтры намерений в AndroidManifest и обрабатывать их все в одном и том же BroadcastReceiver.

Запускать службу только в том случае, если вы выполните длинную задачу.Вам просто нужно отобразить уведомление или обновить базу данных, просто используйте код выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...