广播接收器在服务中的 Android RAM 使用错误

Posted

技术标签:

【中文标题】广播接收器在服务中的 Android RAM 使用错误【英文标题】:Android RAM usage error with broadcast receiver in service 【发布时间】:2015-06-13 15:54:47 【问题描述】:

我编写了一个简单的服务,它有一个广播接收器,用于侦听传入的短信并将有关消息的信息写入数据库。 问题是每次收到消息时,服务的 RAM 使用量都会增加 1-2 MB。

// Init
smsRecFilter.setPriority(999);
smsRecFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver, smsRecFilter);

// Implementation
private class SMSreceiver extends BroadcastReceiver 
   @Override
   public void onReceive(Context context, Intent intent) 
      Bundle extras = intent.getExtras();
      if (extras != null) 
      SmsMessage smsMsg;
      Object[] smsPdus = (Object[])extras.get("pdus");
      if (smsPdus != null) 
         InfoHolder holder = new InfoHolder();
         if (holder != null) 
            holder.Type = InfoTypes.SMS_REC;
            for (int i = 0; i < smsPdus.length; i++) 
               smsMsg = SmsMessage.createFromPdu((byte[])smsPdus[i]);
               if (smsMsg != null) 
                  if (i == 0) 
                     holder.Number = smsMsg.getOriginatingAddress();
                     holder.DateTime =  MillisToDate(smsMsg.getTimestampMillis());
                  
                    holder.MsgBody += smsMsg.getMessageBody().toString();
                
              
                m_db.Insert(holder);
            
        
    

更新

插入方法:

my Insert() function:

private boolean Insert(InfoHolder holder)
    
        try 
            ContentValues values = new ContentValues();
            if (values != null) 
                values.put( DBase.COLUMN_TYPE,      holder.Type);
                values.put( DBase.COLUMN_NUMBER,    holder.Number);
                values.put( DBase.COLUMN_MSGBODY,   holder.MsgBody);
                values.put( DBase.COLUMN_CALL_DUR,  holder.CallDuration);
                values.put( DBase.COLUMN_DATETIME,  holder.DateTime);
                mDB.insert(DB_TABLE_NAME, null, values);
                values.clear();
            
        
        catch( Exception e ) return false;

        return true;
    

【问题讨论】:

【参考方案1】:

我看不到任何明显的内存泄漏,也许你在调用 m_db.Insert() 时 ORM 层有问题。尝试在结束前调用 System.gc() 强制垃圾收集器运行并查看 RAM 使用量是否减少

【讨论】:

尝试离开 System.gc() 调用并注释 insert() 方法。因此您可以检查问题是在该方法内部还是外部

以上是关于广播接收器在服务中的 Android RAM 使用错误的主要内容,如果未能解决你的问题,请参考以下文章

Android 第六讲 广播接收器和服务

Android广播接收器与服务[重复]

如何检测服务和广播接收器中的关键事件

如何将消息/数据从广播接收器(process1)发送到android中的服务线程(process2)?

android 学习随笔十八(广播与服务 )

Android - 使用广播接收器重新加载活动