我想开发一个单一活动的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,我以为我仍然使用服务。
有人可以指出我哪里出错了,或者我错过了一些关键的东西。我的要求是始终在我的应用中随时接收来自给定号码的所有消息。
答案 0 :(得分:0)
经过大量调试并了解BroadcastReceivers如何在Android中运行之后,我理解广播意图需要进行轮询,这是我从未做过的,因此行为不一致...以下代码中的chage解决了我的问题
do
{
bundle = intent.getExtras();
}
while (bundle == null);
在BroadcastReceiver的onReceive()
方法中,它解决了我的问题。我无法在任何地方找到这些文档,即使在几个SMS应用程序教程中也是如此。