我有一个outGoingCall
广播接收器。
基本上我希望它拦截任何拨出电话并显示某些预定义号码的对话框。
所以我将此broadcast
初始化为activity
,其中FragmentDialog
初始化为AlertDialog
。
当用户点击"no"
我想阻止通话发生。
我知道广播中的setResultData(null);
应该这样做。
但是如何将对话结果传递给广播?
广播中没有onActivityResult()
。
我知道如何将它传递给活动。
fragmentDialog代码:
public class YesNoDialogFragment extends DialogFragment {
private YesNoDialogFragmentListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
// Instantiate the NoticeDialogListener so we can send events to the
// host
mListener = (YesNoDialogFragmentListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString()
+ " must implement NoticeDialogListener");
}
}
这是我的活动代码:
public class MainActivity extends FragmentActivity implements
YesNoDialogFragmentListener {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showYesNoDialog();
}
@Override
public void onDialogPositiveClick() {
// how to send result to receiver ??
finish();
}
这是我的接收者代码:
@Override
public void onReceive(final Context context, final Intent intent) {
Log.v(Constants.LOGTAG, "OutgoingCallReceiver onReceive");
if (intent.getAction()
.equals(OutgoingCallReceiver.OUTGOING_CALL_ACTION)) {
Log.v(Constants.LOGTAG,
"OutgoingCallReceiver NEW_OUTGOING_CALL received");
// get phone number from bundle
String phoneNumber = intent.getExtras().getString(
OutgoingCallReceiver.INTENT_PHONE_NUMBER);
if ((phoneNumber != null)
&& phoneNumber
.equals(OutgoingCallReceiver.ABORT_PHONE_NUMBER)) {
Toast.makeText(
context,
"NEW_OUTGOING_CALL intercepted to number 123-123-1234 - aborting call",
Toast.LENGTH_LONG).show();
Intent i = new Intent(context, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
SharedPreferences sharedPreferences = context
.getSharedPreferences(Constants.SHARED_PREF_NAME,
Context.MODE_PRIVATE);
boolean isBloacked = sharedPreferences.getBoolean(
Constants.IS_NUMBER_BLOCKED, true);
if (isBloacked) {
// dialog and then:
setResultData(null);
}
}
你可以看到我试图通过共享首选项共享活动结果,为什么代码是异步的,并且在显示对话框之前调用setResultData(null);
?
据我所知,除setResultData(null);
答案 0 :(得分:0)
您必须经历活动(或片段),然后将其传递给接收者。每当您启动一个对话框时,它都有一个父活动,这就是发送结果的地方。只需在您的活动中添加一些内容即可将结果传递给您的接收者。
您可能会考虑更改您的设计,将更多逻辑放入活动中。接收器通常是非常轻量级的对象,可以接收某些内容的通知,并将其传递给其他地方。然后走开无论如何,我显然不知道你的代码,所以也许这没有用。
修改
抱歉,我现在更了解你的问题。我曾经只在一个活动启动了另一个活动时才使用setResultData,而第二个活动想要将一些东西发送回第一个活动。但是你用它来阻止有序广播,对吗?
不幸的是,Android现在允许您执行您要执行的操作。该文档的这一部分明确指出您无法在广播中显示对话框: http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle
我认为您需要做的就是在开始活动后立即返回setResultData(null)。如果用户然后点击" no"在你的对话框中,你就完成了。但是,如果用户点击"是" (我假设有一个"是")然后你必须继续拨打电话,并确保你不能在接收器中再次接听它。
这有意义吗?对不起我之前的困惑。