活动泄露了IntentReceiver
我正试图发送短信和邮件在一起。 发送邮件没有问题,但是当我发送短信时,我收到这个例外:
End has leaked IntentReceiver Are you missing a call to unregisterReceiver()?
这是我的短信方法的代码:
public class End extends Activity { Button btnSendSMS; EditText txtPhoneNo; EditText txtMessage; public EditText Details; public String user; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.end); Details = (EditText)findViewById(R.id.details); btnSendSMS = (Button) findViewById(R.id.btnSend); Bundle b=this.getIntent().getExtras(); final String email=b.getString("keym"); final String pno=b.getString("keys"); btnSendSMS.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String detail=Details.getText().toString(); Mail m = new Mail("abc@gmail.com", "sdfsa"); String[] toArr = {email}; m.setTo(toArr); m.setFrom("asdasd11@gmail.com"); m.setSubject("EMERGENCY"); m.setBody(detail); try { // m.addAttachment("/sdcard/filelocation"); if(m.send()) { Toast.makeText(End.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(End.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } } catch(Exception e) { //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); Log.e("MailApp", "Could not send email", e); } sendSMS(pno, detail); finish(); Intent intent = new Intent(End.this,Service.class); startActivity(intent); } } ); } private void sendSMS(String phoneNumber, String message) { String SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0); //---when the SMS has been sent--- registerReceiver(new BroadcastReceiver() { Context context; @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(SENT)); //---when the SMS has been delivered--- registerReceiver(new BroadcastReceiver(){ Context context; @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show(); break; case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(DELIVERED)); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); } }
像这样创build一个自定义接收器
class deliverReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show(); break; case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show(); break; } } }
和这样的发送接收者
class sentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show(); break; } }
现在在sendSMS方法之后
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
放
registerReceiver(sentReceiver,SENT); registerReceiver(deliverReceiver,DELIVERED);
现在覆盖onpause和取消这样的接收器注册..
unregisterReceiver(sentReceiver); unregisterReceiver(deliverReceiver);
您应该注销onPause()
的接收者,并在onResume()
注册它们。 这样,当Android销毁并重新创buildconfiguration更改的活动时,或者出于任何原因,您仍将设置接收器。
您已在您的活动中注册了两台广播接收机。 在您的活动onDestroy,取消注册这两个接收器。 请参阅http://developer.android.com/reference/android/content/ContextWrapper.html#unregisterReceiver(android.content.BroadcastReceiver )。
- 工具栏中的材料“closures”button而不是后退
- Android Web-View:将本地Javascript文件注入到远程网页
- Android工具栏中心标题和自定义字体
- 是否有可能安装apk文件,如果多个模拟器/设备连接
- 如何在Android中暂停/恢复线程?
- onTouchListener警告:当检测到点击时,onTouch应该调用View#performClick
- 以编程方式在TextView中设置左边的drawable
- Android SDK Manager在select存储库时出现“无法获取URL https://dl-ssl.google.com/android/repository/repository.xml”错误
- Android Studio Gradle DSL方法未find:'android()' – 错误(17,0)