0

着信SMSメッセージをリッスンし、メッセージに関する情報をデータベースに書き込むブロードキャストレシーバーが1つある単純なサービスを作成しました。問題は、メッセージを受信するたびに、サービスの 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;
    }
4

1 に答える 1

0

明らかなメモリ リークは見られません。m_db.Insert() を呼び出すときに、ORM レイヤーに問題がある可能性があります。終了前に System.gc() を呼び出して、ガベージ コレクターを強制的に実行し、RAM 使用量が減少するかどうかを確認してください。

于 2015-06-13T16:06:51.860 に答える