你在使用什麼API級別?如果> = 11,請查看新的BroadcastReceiver.goAsync函數,該函數允許您擴展接收器的onReceive函數之外的廣播處理。這可以繞過完全循環的需要。
如果像我一樣,在第11級之前試圖做到這一點,那麼優雅地完成這件事就會非常棘手。你也可以這樣做,但我嘗試在我的代碼生成的ACTION_CALL目標中包含一個額外的「已處理」標誌,希望它能以某種方式包含在所產生的ACTION_NEW_OUTGOING_CALL廣播中,但可惜這是行不通的。
我已經能夠找到的最佳解決方案是在您生成的ACTION_CALL意圖的URI中包含一個片段。該片段將包含在所產生的ACTION_NEW_OUTGOING_CALL廣播中,因此您的廣播接收器可以區分原始調用和您生成的調用,但不會干擾不查找它的處理程序。
這是基本的代碼。
在你的BroadcastReceiver的ACTION_NEW_OUTGOING_CALL
public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// extract the fragment from the URI
String uriFragment = Uri.parse(
intent.getStringExtra("android.phone.extra.ORIGINAL_URI")).getFragment();
// if the fragment is missing or does not have your flag, it is new
if (uriFragment == null || !uriFragment.contains("your_flag")) {
// launch your activity, pass the phone number, etc.
// use getResultData to get the number in order to respect
// earlier broadcast receivers
...
// abort the broadcast
this.setResultData(null);
this.abortBroadcast();
}
// otherwise, your code is there, this call was triggered by you
else {
// unless you have a special need, you'll probably just let the broadcast
// go through here
// note that resultData ignores the fragment, so other receivers should
// be blissfully unaware of it
}
}
}
當用戶第一次撥打該號碼,片段要麼是完全缺失或您的標誌將不存在,所以你會中止廣播和啓動你的活動。在您的活動,如果你決定再次撥打電話,這樣做如下:
startActivity(new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + modified_number + "#your_flag")));
的「your_flag」片段屆時將出現在隨後的NEW_OUTGOING_CALL廣播,從而讓您在不同的方式處理這種情況下,您的廣播接收器。
關於這一點的好處是該片段被完全忽略,除非您在ORIGINAL_URI中查找它,以便其他廣播接收器可以繼續運行。如果你想變得非常好,你可能想要尋找一個現有的片段並添加你的標誌(也許用一個逗號分隔符)。
我希望有幫助。祝你好運!
重複:http://stackoverflow.com/q/808645/165674 – 2012-04-22 18:01:03