Android 服务在应用程序处于后台时接收短信

Posted

技术标签:

【中文标题】Android 服务在应用程序处于后台时接收短信【英文标题】:Android Service to receive SMS when app is in background 【发布时间】:2016-09-19 16:03:01 【问题描述】:

我是 *** 的新手,目前正在开发一个处理传入 SMS 的应用程序。当我在寻找解决方案时,我遇到了不同的方法,包括独立的 BroadcastReceivers 和服务,它们工作得很好。目标是即使在应用处于后台且屏幕关闭(手机锁定)时也能接收短信。

我当前的问题是:我收到任何带有在服务中运行的 BroadcastReceiver 的 SMS。该服务在我的 MainActivity 的 onResume() 中启动,不应停止。

当我的应用程序在前台时,接收方可以识别所有短信。 即使应用程序处于后台但我的手机仍处于开机状态,我也可以收到这些消息。

奇怪的事情发生在这里:

应用程序在前台,我关掉屏幕 -->短信被识别。 应用程序在后台,我关闭屏幕 -->无法识别短信。

这是我的服务类代码:

public class SmsProcessService extends Service 
    SmsReceiver smsReceiver = new SmsReceiver();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
        registerReceiver(smsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

        return START_STICKY;
    

    private class SmsReceiver extends BroadcastReceiver 
        @Override
        public void onReceive(Context context, Intent intent) 
            String telnr = "", nachricht = "";

            Bundle extras = intent.getExtras();

            if (extras != null) 
                Object[] pdus = (Object[]) extras.get("pdus");
                if (pdus != null) 

                    for (Object pdu : pdus) 
                        SmsMessage smsMessage = getIncomingMessage(pdu, extras);
                        telnr = smsMessage.getDisplayOriginatingAddress();
                        nachricht += smsMessage.getDisplayMessageBody();
                    

// Here the message content is processed within MainAct
                    MainAct.instance().processSMS(telnr.replace("+49", "0").replace(" ", ""), nachricht);
                
            
        

        private SmsMessage getIncomingMessage(Object object, Bundle bundle) 
            SmsMessage smsMessage;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
                String format = bundle.getString("format");
                smsMessage = SmsMessage.createFromPdu((byte[]) object, format);
             else 
                smsMessage = SmsMessage.createFromPdu((byte[]) object);
            

            return smsMessage;
        
    

在我的 MainActivity 中,我声明了一个 Intent

Intent smsServiceIntent

像这样在 onCreate() 中初始化

smsServiceIntent = new Intent(MainAct.this, SmsProcessService.class);

我在 Activity onResume() 中启动服务

MainAct.this.startService(smsServiceIntent);

我的清单文件有<service android:name=".SmsProcessService" /> 来声明服务和以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />

我真的希望,你能给我一些支持和帮助来弄清楚应用程序的行为。

问好史蒂芬

【问题讨论】:

奇怪,它应该可以工作。可能是您在某处停止服务,即onPause() 这也是我在其他所有解决方案中所读到的......我肯定没有实现 onPause 方法。我什至尝试在 MainAct 的 onPause 方法中重新启动它,但它又失败了 【参考方案1】:

我现在在不同的手机上试用了这个应用,我想我找到了问题的根源。

在另一部手机(相同的操作系统版本)上一切正常。我猜其他几个应用程序也接收 SMS-Broadcast,也许它们会互相干扰。我没能弄清楚哪些应用是最差的。

我现在将尝试本地化具有类似用途的其他应用程序,并希望卸载或更改其通知设置会有所帮助。你有没有猜到其他应用程序(比如我想进一步使用的“自动响铃”)如何并行工作?

编辑:

我发现了导致应用程序的问题:它是 Google 应用程序,它也授予了 SMS 权限。我停用了它,一切正常

问好史蒂芬

【讨论】:

如果您尝试将应用程序设为默认设置会怎样?【参考方案2】:

将广播优先级设置为2147483647可能会解决here提到的问题。

<receiver android:name=".SmsReceiver">
    <intent-filter android:priority="2147483647" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

【讨论】:

以上是关于Android 服务在应用程序处于后台时接收短信的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用程序处于后台时保持GPS接收器位置更新(Google Play服务位置API)

如何在 Android Studio 中使用广播接收器接收短信?

如何在 iOS 后台运行服务以接收本地通知?

如何始终在后台运行服务?

当应用程序处于后台时,带有 PendingIntent 的 Android FusedLocationClient 未收到位置更新

应用程序从后台删除后,服务内的广播接收器未收听