如何在活动结果后结束拨出电话?

时间:2014-12-06 17:29:35

标签: java android android-intent android-activity broadcastreceiver

我有一个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);

之外无法结束通话

1 个答案:

答案 0 :(得分:0)

您必须经历活动(或片段),然后将其传递给接收者。每当您启动一个对话框时,它都有一个父活动,这就是发送结果的地方。只需在您的活动中添加一些内容即可将结果传递给您的接收者。

您可能会考虑更改您的设计,将更多逻辑放入活动中。接收器通常是非常轻量级的对象,可以接收某些内容的通知,并将其传递给其他地方。然后走开无论如何,我显然不知道你的代码,所以也许这没有用。

修改

抱歉,我现在更了解你的问题。我曾经只在一个活动启动了另一个活动时才使用setResultData,而第二个活动想要将一些东西发送回第一个活动。但是你用它来阻止有序广播,对吗?

不幸的是,Android现在允许您执行您要执行的操作。该文档的这一部分明确指出您无法在广播中显示对话框: http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle

我认为您需要做的就是在开始活动后立即返回setResultData(null)。如果用户然后点击" no"在你的对话框中,你就完成了。但是,如果用户点击"是" (我假设有一个"是")然后你必须继续拨打电话,并确保你不能在接收器中再次接听它。

这有意义吗?对不起我之前的困惑。