Android 等待来自广播接收器的结果
我想从我的活动启动ProgressDialog和广播接收器(SMS_RECEIVED)。当收到来自定义号码的短信时,它将停止对话框并分析短信文本 在我拥有对话和接收器的那一刻,两者都起作用。当我关闭对话框时,它会停止接收器 但是,当短信接收并将短信文本发送给活动时,如何使对话框关闭 “我的活动”中的ProgressDialog:Android 等待来自广播接收器的结果,android,broadcastreceiver,progressdialog,Android,Broadcastreceiver,Progressdialog,我想从我的活动启动ProgressDialog和广播接收器(SMS_RECEIVED)。当收到来自定义号码的短信时,它将停止对话框并分析短信文本 在我拥有对话和接收器的那一刻,两者都起作用。当我关闭对话框时,它会停止接收器 但是,当短信接收并将短信文本发送给活动时,如何使对话框关闭 “我的活动”中的ProgressDialog: protected void sendSMS(String sms){ try { final ComponentNam
protected void sendSMS(String sms){
try {
final ComponentName receiver = new ComponentName(this, IncomingSms.class);
final PackageManager pm = this.getPackageManager();
pm.setComponentEnabledSetting(receiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
waitSms = new ProgressDialog(this);
waitSms.setTitle("Warte auf Bestätigungs SMS");
waitSms.setCancelable(false);
waitSms.setMessage("Abbrechen setzt die Einstellung in der App auf inaktiv zurück. Nicht warten übernimmt die Einstellung in der App, wartet aber nicht weiter auf eine Bestätigungs SMS.");
waitSms.setButton(DialogInterface.BUTTON_NEGATIVE, "Abbrechen", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
waitSms.dismiss();
}
});
waitSms.setButton(DialogInterface.BUTTON_POSITIVE, "Nicht warten", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
waitSms.dismiss();
}
});
waitSms.show();
}
我的广播接收器:
public class IncomingSms extends BroadcastReceiver {
// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();
public void onReceive(Context context, Intent intent) {
// 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);
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 class IncomingSms扩展广播接收器{
//获取SmsManager的对象
final smsmsmanager sms=smsmsmanager.getDefault();
公共void onReceive(上下文、意图){
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i
Thx以获取帮助您使用您的标志禁用了接收器: PackageManager.COMPONENT\u已启用\u状态\u已禁用 相反,请尝试以下方法: PackageManager.COMPONENT\u已启用\u状态\u已启用 然后在接收器onReceive内,使用Intent extras将数据移动到活动中,并使用onNewIntent()截获它们
发送数据后,如果需要,您可以禁用接收器。只需在活动中通过
registerReceiver
注册另一个BroadcastReceiver
,它将监听您的事件,例如com.example.SMS\u PARSED
。将您的短信息转换为Parcelable
,放入包中
,并将其发送给活动中注册的接收者。在那里,在onReceive
中,您将取消
进度
另外,不要忘记在出现错误时设置一个超时,这样用户就不会被您的进度阻塞。启动ProgressDialog时,我会启用组件启用状态启用的接收器。当用户中止对话框时,不管是正数还是负数按钮,它都会停止接收器(就像我想要的那样)。现在我想,对话框也结束了,当收到来自定义号码的短信时,活动从中得到通知并获得短信文本。然后在发送数据后关闭活动onNewIntent()中的对话框