首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从BroadcastReceiver发送短信时崩溃

从BroadcastReceiver发送短信时崩溃
EN

Stack Overflow用户
提问于 2011-08-11 07:34:08
回答 1查看 399关注 0票数 0

我有一个BroadcastReceiver,当收到短信时,它会查询数据库,并从数据库结果中发出适当的短信。我遇到的问题是,当我到达它发送SMS的部分时,它总是崩溃

代码语言:javascript
运行
复制
public class SMSReceiver extends BroadcastReceiver {
    SQLiteDatabase db;
    private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
    private static String messagefrom;
    private static String messagebody;
    final String dbTable = "Realtor_SMS_Table";

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent != null && intent.getAction() != null
                && ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
            Object[] pduArray = (Object[]) intent.getExtras().get("pdus");
            SmsMessage[] messages = new SmsMessage[pduArray.length];
            for (int i = 0; i < pduArray.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[]) pduArray[i]);
                messagefrom = messages[i].getOriginatingAddress();
                messagebody = messages[i].getMessageBody();
                Log.d("My SMSReceiver", "From: " + messagefrom);
                Log.d("My SMSReceiver", "Msg: " + messagebody);
                FilterMessage(dbTable, messagefrom, messagebody);

            }

            Log.d("My SMSReceiver", "SMSReceived");

        }
    }

    public void FilterMessage(String dbTable, String messagefrom,
            String messagebody) {
        String myPath = "/data/data/com.RealtorSMS/databases/RealtorDB.db";
        db = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);

        Cursor cursor = db.query(dbTable, new String[] { "_id", "Description",
                "URL" }, "_id like " + "'%" + messagebody + "%'", null, null,
                null, null);

        Log.d("My SMSReceiver", "sql= " + cursor);

        if (cursor != null) {
            cursor.moveToFirst();
            String messageAddress = null;
            String messageDescription = null;
            String messageURL = null;
            while (cursor.isAfterLast() == false) {

                messageAddress = cursor.getString(0);
                messageDescription = cursor.getString(1);
                messageURL = cursor.getString(2);

            }

            SmsManager sm = SmsManager.getDefault();
            sm.sendTextMessage(messagefrom, null, messageAddress + " "
                    + messageDescription, null, null);
            sm.sendTextMessage(messagefrom, null, messageAddress + " "
                    + messageURL, null, null);
        }

    }

}

下面是logcat:

代码语言:javascript
运行
复制
08-10 18:19:33.796: ERROR/ActivityManager(68): ANR in com.RealtorSMS
08-10 18:19:33.796: ERROR/ActivityManager(68): Reason: Broadcast of Intent { act=android.provider.Telephony.SMS_RECEIVED cmp=com.RealtorSMS/.SMSReceiver (has extras) }
08-10 18:19:33.796: ERROR/ActivityManager(68): Load: 0.56 / 0.32 / 0.28
08-10 18:19:33.796: ERROR/ActivityManager(68): CPU usage from 5091ms to 0ms ago:
08-10 18:19:33.796: ERROR/ActivityManager(68):   82% 583/com.RealtorSMS: 81% user + 0.9% kernel / faults: 150 minor
08-10 18:19:33.796: ERROR/ActivityManager(68):   7.6% 68/system_server: 4.9% user + 2.7% kernel / faults: 5 minor
08-10 18:19:33.796: ERROR/ActivityManager(68):   5.5% 139/com.android.systemui: 5.1% user + 0.3% kernel / faults: 85 minor
08-10 18:19:33.796: ERROR/ActivityManager(68):   1.3% 136/com.android.phone: 0.5% user + 0.7% kernel / faults: 15 minor
08-10 18:19:33.796: ERROR/ActivityManager(68):   0.7% 41/adbd: 0% user + 0.7% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68):   0.5% 411/com.android.mms: 0.3% user + 0.1% kernel / faults: 2 minor
08-10 18:19:33.796: ERROR/ActivityManager(68): 99% TOTAL: 93% user + 5.7% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68): CPU usage from 1582ms to 2224ms later:
08-10 18:19:33.796: ERROR/ActivityManager(68):   88% 583/com.RealtorSMS: 88% user + 0% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68):     88% 583/com.RealtorSMS: 88% user + 0% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68):   12% 68/system_server: 6.2% user + 6.2% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68):     12% 81/ActivityManager: 7.8% user + 4.6% kernel
08-10 18:19:33.796: ERROR/ActivityManager(68): 100% TOTAL: 93% user + 6.2% kernel
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-11 07:41:06

您可能需要将处理逻辑移动到单独的服务中:不是在onReceive方法中调用FilterMessage,而是调用startService并在单独的线程中执行处理。ANR是因为您的FilterMessage函数的某些部分花费的时间太长:我预计您的数据库打开/循环/关闭花费的时间太长。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7019218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档