package com.example.android.sip;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.sip.*;
import android.util.Log;
/**
* Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
*/
public class IncomingCallReceiver extends BroadcastReceiver {
/**
* Processes the incoming call, answers it, and hands it over to the
* WalkieTalkieActivity.
* @param context The context under which the receiver is running.
* @param intent The intent being received.
*/
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
} catch (Exception e) {
e.printStackTrace();
}
}
};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
wtActivity.call = incomingCall;
wtActivity.updateStatus(incomingCall);
} catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}
}
}
}
我看到他们能够通过在广播接收器中转换 context 以某种方式检索正在运行的 WalkieTalkieActivity 实例。这怎么可能?这是代替发送 Intent 访问 Activity 的快捷方式吗?
最佳答案
我现在不在装有 android studio 的笔记本电脑上,所以我面前没有完整的示例项目来检查此接收器在哪个上下文中使用。 据我所知,您可以将 ReceiverRestrictedContext 转换为 Activity 的唯一有效情况是广播接收器已在该 Activity 中注册,而 Activity 处于 Activity 状态。
所以如果你在 WalkieTalkieActivity 里面有这样的东西:
public class WalkieTalkieActivity
{
IncomingCallReceiver receiver = new IncomingCallReceiver();
IntentFilter intentFilter = new IntentFilter(SOME_ACTION);
@Override
public void onResume ()
super.onResume();
registerReceiver (receiver, intentFilter);
}
@Override
public void onPause ()
{
super.onPause();
unregisterReceiver(receiver);
}
}
关于android - 从 BroadcastReceiver 访问 Activity 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7450533/