Android 除非应用正在运行,否则应用不会响应收到的sms消息。
我有一个应用程序,基本上有两个接收器,一个接收短信,一个接收彩信。当应用程序运行时,它可以完美地工作,接收消息,并且接收器都可以工作。不运行时,不会调用应用程序接收器 以下是SMSReceiver中的基本代码:Android 除非应用正在运行,否则应用不会响应收到的sms消息。,android,broadcastreceiver,sms,Android,Broadcastreceiver,Sms,我有一个应用程序,基本上有两个接收器,一个接收短信,一个接收彩信。当应用程序运行时,它可以完美地工作,接收消息,并且接收器都可以工作。不运行时,不会调用应用程序接收器 以下是SMSReceiver中的基本代码: @Override public void onReceive(Context context, Intent intent) { this.context = context; Log.i(TAG, "Intent received: " + intent.getAct
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
Log.i(TAG, "Intent received: " + intent.getAction());
Toast.makeText(context,"Message Received SMS",Toast.LENGTH_LONG).show();
}
清单权限都在那里并且正确。运行三星S7 Edge安卓7.0(安卓24)。它应该接收文本,无论什么,即使不运行或在后台
舱单:
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<receiver android:name="com.webnation.text2email.receivers.SMSBroadcastReceiver">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<receiver android:name="com.webnation.text2email.receivers.MMSBroadcastReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
您应该使用
服务
并将意图
传递给它,而不是使用onReceive()
处理。另外,onReceive()
中的context
参数不能用于执行UI操作,但可以用于启动活动
或服务
下面是一个示例,说明如何实现onReceive()
:
下面是SmsParserService
的实现示例:
/**
* Service for parsing the SMS and retrieving the message
*/
public class SmsParserService extends IntentService {
private static final String TAG = SmsParserService.class.getSimpleName();
public SmsParserService() {
this("SmsParserService");
}
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public SmsParserService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
Object[] objects = (Object[]) extras.get("pdus");
if (objects != null) {
for (Object object : objects) {
SmsMessage smsMessage;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
smsMessage = SmsMessage.createFromPdu((byte[]) object, extras.getString("format"));
} else {
smsMessage = SmsMessage.createFromPdu((byte[]) object);
}
String message = smsMessage.getMessageBody();
}
}
}
}
}
在AndroidManifest.xml
中:
<receiver
android:name=".services.SmsReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<service
android:name=".services.SmsParserService"
android:enabled="true"
android:exported="false">
</service>
还请记住,
服务
是一个后台进程,这意味着某些UI元素(如对话框
和土司
)可能无法正常工作。相反,您应该在这种情况下使用活动
。它甚至不会调用onReceive(),因此您的建议甚至不会被调用。祝酒词从不展示。此外,对于Oreo,在服务中运行未来的东西可能不是一条可行之路。我已经用AndroidManifest.xml
条目更新了答案。您可能没有收到您正在使用的条目。如果服务
由于必须支持Android Oreo而不适合您,我认为您应该使用活动
,但是我还没有尝试在Oreo中从Receiver
内部启动服务
,而且这篇文章也没有说明这方面的任何内容。你能找到这一点吗?你可能缺少清单中的exported
属性
<receiver
android:name=".services.SmsReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<service
android:name=".services.SmsParserService"
android:enabled="true"
android:exported="false">
</service>