这个问题可能看上去很模糊,因为Intent在很大程度上生活在后台,我同意它,但我正在使用Intent过滤器--通过编程-- .I正在放置两个按钮,注册和注销。当按下寄存器时,Intent过滤器的注册工作也是一样的。现在,当我按下注册按钮并将应用程序放在后台时,吐司信息将不会显示。但是,我希望只有当用户显式地按下“注销”按钮时,Intent过滤器才会停止接收消息。
我正在使用以下代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// Retrieves a map of extended data from the intent.
final Bundle bundle = intent.getExtras();
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
String message = currentMessage.getDisplayMessageBody();
Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);
// Show alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration);
toast.show();
} // end for loop
} // bundle is null
} catch (Exception e) {
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
};
public void register(View view){
this.registerReceiver(broadcastReceiver, new IntentFilter(
"android.provider.Telephony.SMS_RECEIVED"));
}
public void unRegister(View view){
this.unregisterReceiver(broadcastReceiver);
}
}发布于 2014-02-07 09:01:00
正如在BroadcastReceiver文档中所解释的,通过Activity.registerReceiver()程序注册的广播接收器在活动不运行时不会接收任何广播:
如果在Activity.onResume()实现中注册接收器,则应该在Activity.onPause()中注销它。(暂停时不会收到意图,这将减少不必要的系统开销)
您可以考虑使用背景Service并在其上注册广播接收器(参见在服务中注册接收者)。
或者,正如@doctoror驱动器所指出的,您可以静态地在清单文件中注册接收器,并使用PackageManager以编程方式启用/禁用它。
https://stackoverflow.com/questions/21622847
复制相似问题