我正在使用NativeScript,正如您所知,首先以Android为目标。
我一直在尝试阅读,但是这是不可能理解的。 Android文档以及SO上的所有其他答案都还不完整。 我已经来这几天了。
我希望我的应用程序在收到新的SMS时执行某项操作,无论用户是否在应用程序中,该应用程序都处于活动状态,但如果应用程序甚至不处于活动状态,则不处于前台。
在一个简单的示例中,我尚未找到有关如何解决上述情况的信息。
我现在不介意该服务(我想我需要)在主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>
我一直看到以下内容,并且它们总是彼此不同地使用,但仍然不清楚如何使用它们:
JobService
[如按时间顺序第4步那样,首次启动应用程序时,如何仅启动一次此服务,以防止多次启动该服务,并且该服务正常工作并一直在监听传入的SMS?
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
}
});