Android短信应用无法在后台运行

时间:2014-02-01 03:18:44

标签: android service messaging

我想开发一个单一活动的android文本消息应用程序,它接收来自特定电话号码的消息。所有其他消息都将发送到收件箱。为此,我在BroadcastReceiver中注册了AndroidManifest.xml,它检查传入消息的电话号码,然后在数字匹配时中止广播。然后将该消息存储在sqlite数据库中,该数据库用于在ListActivity中显示消息。

但是,我面临的问题是我的应用程序无法一致地收到广播,有时它收到预定的消息,有时它不会(进入收件箱)。只要应用程序打开,就会在应用程序中收到消息,并在应用程序关闭后收到消息。这根本不一致。我在清单中给了我的应用程序更高的优先级(999)。

我的清单如下: `

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:allowBackup="true">

    <activity
        android:launchMode="singleInstance"
        android:name="org.trial.hiv.HIVActivity"
        android:label="@string/title_activity_hiv"
        android:exported="true">
            <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>

    <receiver android:name="org.trial.hiv.SMSReceiver"
          android:exported="true">
        <intent-filter android:priority="999">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
         </intent-filter>
    </receiver>

    <service android:name="org.trial.hiv.SMSService" ></service>

    <receiver android:name="org.trial.hiv.BootReceiver"
          android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
         </intent-filter>
    </receiver>

    <service android:name="org.trial.hiv.BootUpService" ></service>

</application>

`

我的SMSReceiver.java,它开始提供服务,对收到的信息执行必要的内务处理任务......

public class SMSReceiver extends BroadcastReceiver
{
 public void onReceive(final Context context, Intent intent)
   {
    Intent smsServiceIntent = new Intent(context, SMSService.class);
    smsServiceIntent.setClass(context, SMSService.class);

    Bundle bundle = intent.getExtras();
    Object pdus[] = (Object[]) bundle.get("pdus");
    SmsMessage smsMessage[] = new SmsMessage[pdus.length];
    for (int n = 0; n<pdus.length; n++)`
    {
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) pdus[n]);
    }
    String sender = smsMessage[0].getOriginatingAddress();
    String body = smsMessage[0].getMessageBody();

    if (sender.equalsIgnoreCase(activity.number))//incoming number is checked
            {
        this.abortBroadcast();
        smsServiceIntent.putExtra("sender", sender);
        smsServiceIntent.putExtra("body", body);
        context.startService(smsServiceIntent);
    }
    }   
}

我正在使用smsService,因为我读到BroadcastReceiver不得超过任何任务超过10秒,虽然我只是将消息写入SQLiteDatabase,我以为我仍然使用服务。

有人可以指出我哪里出错了,或者我错过了一些关键的东西。我的要求是始终在我的应用中随时接收来自给定号码的所有消息。

1 个答案:

答案 0 :(得分:0)

经过大量调试并了解BroadcastReceivers如何在Android中运行之后,我理解广播意图需要进行轮询,这是我从未做过的,因此行为不一致...以下代码中的chage解决了我的问题

do
{
bundle = intent.getExtras();
}
while (bundle == null);
在BroadcastReceiver的onReceive()方法中

,它解决了我的问题。我无法在任何地方找到这些文档,即使在几个SMS应用程序教程中也是如此。