Широкомовний приймач у службі


90

Я намагаюся запустити програму в BroadcastReceiverмежах Service. Я намагаюся зробити фоновий запуск, serviceякий збирає вхідні текстові повідомлення та реєструє вхідні телефонні дзвінки. Я зрозумів, що найкращий спосіб цього зробити - це serviceзапуск, який включає в себе мовний приймач, який може також каталогізувати.

Як мені робити це? У мене вже є служба, яка працює.

Відповіді:


127

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

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

у вашому сервісі onCreateзробіть це:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

та у ваших послугах onDestroy:

unregisterReceiver(receiver);

і ви готові піти отримувати трансляцію для тих фільтрів, про які ви згадуєте onCreate. Не забудьте додати будь-який дозвіл, якщо потрібно. наприклад,

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

Я помітив, що я не можу передавати дані за допомогою intent.setData (myUri) під час надсилання sendBroadcas (намір), а braoadcastReceiver у цьому випадку не працює, чи не так?
deadfish

Я мало заплутаний щодо життєвого циклу служби, коли в ньому є BroadcastReceiver (у моєму випадку завантажте BroadcastReceiver)
Android Man

1
@waqaslam Ви встановили цей BroadcastReceiver у своєму Маніфесті?
Ігор Ганапольський

2
@IgorGanapolsky Ні, вам не потрібно реєструвати такі приймачі в маніфесті.
waqaslam

2
@SayyedRizwan Ваша служба та BroadcastReceiver працюватимуть за тим самим процесом і, швидше за все, за однією ланкою (якщо ви не створите нову). Споживання батареї залежить від того, як ви визначили свій потік (фоновий / передній план) та кількість трансляцій, що надходять.
waqaslam

24

Кращий шаблон - створити автономний BroadcastReceiver. Це гарантує, що ваш додаток може реагувати на трансляцію, незалежно від того Service, запущена програма чи ні . Насправді, використання цього шаблону може взагалі усунути потребу в постійному запуску Service.

Зареєструйте BroadcastReceiverфайл у своєму Маніфесті та створіть для нього окремий клас / файл.

Наприклад:

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

Коли приймач працює, ви просто передаєте Intent( Bundle) на Serviceі відповідаєте на нього у onStartCommand().

Наприклад:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

6
Я хочу, щоб трансляція була в межах життєвого циклу послуги, щоб програма лише запитувала повідомлення / телефонні дзвінки відповідно до строку обслуговування. Чи дозволяє цей метод це? схоже, ви його налаштували, тому прийом трансляції відключає послугу.
Утопія025

Ця реалізація запускається, Serviceякщо вона ще не була запущена, або передає нову, Intentякщо вона є (для отримання в onStartCommand). Якщо ви тільки хочете, щоб працювати , коли Serviceжива, можна програмно включити / відключити Receiverкомпонент через PackageManager«з setComponentEnabledSetting().
Paul Burke

4
Відповідь Waqas може бути вашим найкращим варіантом, якщо ви хочете Receiverживого лише тоді, коли Serviceзапущено.
Paul Burke

3
Якщо у вас немає активності, це не буде працювати для API 3.1 та новіших версій
elif

1
Починаючи з Android 3.1, система Android за замовчуванням виключає отримання всіх намірів, якщо відповідна програма ніколи не запускалася користувачем або якщо користувач явно зупинив програму через меню Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Юрай Петрик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.