从BroadcastReceiver访问活动实例

时间:2011-09-16 21:25:15

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

http://developer.android.com/resources/samples/SipDemo/src/com/example/android/sip/IncomingCallReceiver.html获取示例代码:

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实例。这怎么可能?这是访问活动的快捷方式,而不是发送意图吗?

2 个答案:

答案 0 :(得分:1)

我现在不在我的笔记本电脑上使用android studio,所以我没有完整的示例项目在我面前检查这个接收器使用的上下文。 据我所知,当你可以将ReceiverRestrictedContext转换为Activity时,唯一有效的情况是广播接收器在该活动中注册,而活动是活着的。

所以,如果你在WalkieTalkieActivity里面有这样的东西:

newdat2[(newdat2!=1)&(newdat2!=2)&(newdat2!=3)&(newdat2!=4)&(newdat2!=5)]<-NA

答案 1 :(得分:0)

您可以使用以下代码

MyActivity mainActivity = (MyActivity) ((BaseApplication) context.getApplicationContext()).activity

在BaseApplication和MyAcitivity中定义变量活动,将变量设置为活动上下文

BaseApplication.activity  = this