Запускать только одну службу при запуске смартфона или запуске приложения - PullRequest
0 голосов
/ 16 июня 2020

Я использую NativeScript, просто чтобы вы знали, для начала ориентируюсь на Android.

Я пытался прочитать это, но это просто невозможно понять. Документация Android вместе со всеми другими ответами на SO просто неполны. Я занимаюсь этим несколько дней.

Цель приложения

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

Хронологический порядок

  1. Пользователь включает смартфон.
  2. Пользовательские загрузки приложение.
  3. Пользователь открывает приложение в первый раз.
  4. Приложение должно теперь после открытия приложения работать и делать что-то всякий раз, когда приходит SMS, независимо от того, находится ли пользователь в приложении, есть ли он жив, но не на переднем плане или убил приложение или даже когда экран смартфона выключен, а блокировка включена.
  5. Пользователь забыл зарядить смартфон, поэтому смартфон умирает, пользователь заряжает смартфон и поворачивается Смартфон включен.
  6. Приложение должно сразу начать работать на BOOT, что-то делать, если пришло новое SMS r получен без необходимости открывать приложение.

Мне еще предстоит найти информацию о том, как решить вышеуказанную ситуацию на простом примере.

Я не возражаю против службы ( Полагаю, мне нужно) находиться в основном потоке пользовательского интерфейса.

Что я пробовал

Манифест:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:name="com.tns.NativeScriptApplication"
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

    <activity
        android:name="com.tns.NativeScriptActivity"
        android:label="@string/title_activity_kimera"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode"
        android:theme="@style/NoActionBar">

        <meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>

    <activity android:name="com.tns.ErrorReportActivity"/>

    <receiver android:name="io.basickarl.passer.ServiceStarter">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

    <service android:enabled="true" android:name="io.basickarl.passer.SMSService" />
</application>

Я продолжаю видеть следующие вещи, и они всегда используются по-разному, и все же непонятно, как их использовать:

  • Service
  • IntentService
  • JobIntentService
  • JobScheduler
  • JobService

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

1 Ответ

0 голосов
/ 16 июня 2020

https://developer.android.com/guide/topics/manifest/receiver-element.html

android: включено

Может ли система создать экземпляр широковещательного приемника - "true", если он может быть, а если нет - "ложь". Значение по умолчанию верно". Элемент имеет собственный атрибут enabled, который применяется ко всем компонентам приложения, включая широковещательные приемники. Для включения широковещательного приемника атрибуты и должны иметь значение «true». Если любой из них имеет значение «false», он отключен; он не может быть создан.

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

android: экспортированные

сообщения из источников вне приложения - «true», если может, и «false», если нет. Если установлено значение «false», приемник широковещательной передачи может получать только сообщения, отправленные компонентами того же приложения или приложениями с одним и тем же идентификатором пользователя. Значение по умолчанию зависит от того, содержит ли широковещательный приемник фильтры намерения. Отсутствие каких-либо фильтров означает, что он может быть вызван только объектами намерения, которые определяют его точное имя класса. Это означает, что приемник предназначен только для внутреннего использования приложением (поскольку другие обычно не знают имя класса). Так что в этом случае значение по умолчанию - «ложь». С другой стороны, наличие хотя бы одного фильтра подразумевает, что широковещательный приемник предназначен для приема сообщений о намерениях, транслируемых системой или другими приложениями, поэтому значение по умолчанию - «истина». Может ли широковещательный приемник принимать

Мне нужно было установить значение true на приемнике.

Манифест:

<application
    android:enabled="true"
    ...more code
    <receiver 
        android:name="io.basickarl.passer.HandleSMS" android:exported="true" android:enabled="true">
        <intent-filter android:priority="2147483647">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
</application>

Код:

android.content.BroadcastReceiver.extend('io.basickarl.passer.HandleSMS', {
    onReceive: async function(context, intent) {
        // ...do my stuff here
    }
});

Теперь код запускается, когда приложение убивается или сразу после перезагрузки.

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