Android 除非应用正在运行,否则应用不会响应收到的sms消息。

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

我有一个应用程序,基本上有两个接收器,一个接收短信,一个接收彩信。当应用程序运行时,它可以完美地工作,接收消息,并且接收器都可以工作。不运行时,不会调用应用程序接收器

以下是SMSReceiver中的基本代码:

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