仅在智能手机启动或应用程序启动时启动一项服务

问题描述 投票:0回答:1

我正在使用NativeScript,正如您所知,首先以Android为目标。

我一直在尝试阅读,但是这是不可能理解的。 Android文档以及SO上的所有其他答案都还不完整。 我已经来这几天了。

应用目的

我希望我的应用程序在收到新的SMS时执行某项操作,无论用户是否在应用程序中,该应用程序都处于活动状态,但如果应用程序甚至不处于活动状态,则不处于前台。

年代顺序

  1. 用户打开智能手机。
  2. 用户下载应用程序。
  3. 用户第一次打开应用程序。
  4. 打开应用程序后,应用程序现在应该可以工作,只要有SMS进入,无论用户是否在应用程序中,是否还活着,但不会杀死应用程序,甚至当智能手机屏幕出现时,它都应该执行某些操作关闭并且锁已打开。
  5. 用户忘记为智能手机充电,因此智能手机死了,用户为智能手机充电并打开智能手机。
  6. 应用程序应立即开始在BOOT上运行,如果收到新短信而无需打开应用程序,则可以执行某些操作。

在一个简单的示例中,我尚未找到有关如何解决上述情况的信息。

我现在不介意该服务(我想我需要)在主UI线程上。

我尝试过的

清单:

<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>

我一直看到以下内容,并且它们总是彼此不同地使用,但仍然不清楚如何使用它们:

  • 服务
  • IntentService
  • JobIntentService
  • JobScheduler
  • JobService

    [如按时间顺序第4步那样,首次启动应用程序时,如何仅启动一次此服务,以防止多次启动该服务,并且该服务正常工作并一直在监听传入的SMS?

android nativescript
1个回答
0
投票

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

android:enabled

是否可以将广播接收器 由系统实例化-如果可以,则为“ true”,否则为“ false”。 默认值是true”。 元素有其自己的 适用于所有应用程序组件的enabled属性, 包括广播接收器。 和 属性都必须为“ true”才能使广播接收器成为 已启用。如果任何一个为“ false”,则将其禁用;否则,将其禁用。它不可能是 实例化。

由于在两个地方默认情况下都为真,因此系统默认应注册广播接收器。我不需要服务。

android:exported

来自应用程序外部来源的消息-如果可以,则为“ true”,并且 如果不是,则为“ false”。如果为“ false”,则仅广播接收方消息 可以接收的是由同一应用程序的组件发送的那些,或者 具有相同用户ID的应用程序。 默认值取决于 广播接收器是否包含意图过滤器。缺少 任何过滤器都意味着它只能由以下Intent对象调用: 指定其确切的类名。这意味着接收方是 仅用于应用程序内部使用(因为其他人不会 通常知道该类的名称)。因此,在这种情况下,默认值为 “假”。另一方面,至少存在一个过滤器 暗示广播接收器旨在接收意图 由系统或其他应用程序广播,因此默认值为 “ true”。广播接收器是否可以接收

我需要在接收器上将其设置为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
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.