0

我有一個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);被稱爲bef礦石對話框顯示?

據我所知是沒有辦法來結束,除了setResultData(null);

回答

0

你必須要經過一個活動(或片段),然後把它傳遞給接收呼叫。無論何時開始對話,它都有一個父活動,並且這是發送結果的地方。只需在您的活動中添加一些將結果傳遞給接收器的活動即可。

你可能會考慮改變你的設計,將更多的邏輯放入活動中。接收者一般都是用來接收某些事物通知的相當輕量級的對象,並將其傳遞到其他地方。然後離開。無論如何,我顯然不知道你的代碼,所以也許這沒有意義。

編輯

對不起,我現在理解你的問題了。我習慣於僅在一個活動啓動另一個活動時使用setResultData,而第二個活動想要將某些活動發送回第一個活動。但是你正在使用它來停止一個有序的廣播,對吧?

不幸的是,Android現在允許你做你想做的事情。文檔的這一部分明確指出,您不能在廣播中顯示對話框: http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle

我認爲您需要做的就是在開始活動後立即返回setResultData(null)。如果用戶在對話框中點擊「否」,那麼你就完成了。但是,如果用戶點擊「是」(我假設有「是」),那麼您將不得不繼續撥打電話,並確保您不會在接收器中再次捕獲它。

這有道理嗎?對不起,我早些時候感到困惑。

+0

我添加了我的代碼。你可以看到我試圖通過共享偏好來共享活動結果,代碼如何是async和setResultData(null);在顯示對話框之前調用? – 2014-12-06 21:38:08

相關問題