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

android broadcastreceiver

69225 просмотра

4 ответа

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

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

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

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

Спасибо

Автор: RasberryPoptart Источник Размещён: 12.11.2019 09:16

Ответы (4)


145 плюса

Вам нужно определить получателя в манифесте с именем действия 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);
    }
}
Автор: Javanator Размещён: 13.03.2011 02:59

7 плюса

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

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

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

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

Есть другой способ

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

Таким образом, BroadcastReceiverAndroid получит уведомление автоматически, как только придет 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.

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

Автор: W0rmH0le Размещён: 14.07.2016 04:00

0 плюса

Помимо @Javanatorответа я хотел бы включить чехол для версии Android (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)В моем случае это работает для Android SDK 29 (10)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      context.startForegroundService(new Intent(context,FloatingWindow.class));
} else {
      context.startService(new Intent(context, FloatingWindow.class));
  }
Автор: Sabri Meviş Размещён: 25.09.2019 06:46

0 плюса

используйте этот код, а также упомяните трансляцию в Манифесте также:

public class BootService extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
            Toast.makeText(context, "Boot Completed", Toast.LENGTH_SHORT).show();
            //write code here
        }
    }
}
Автор: Pradeep Kumar Размещён: 25.10.2019 09:02
Вопросы из категории :
32x32