从BroadcastReceiver访问活动实例

3

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个回答

1

我现在不在使用Android Studio的笔记本电脑上,所以我没有完整的样例项目在面前检查这个接收器的使用情况。

据我所知,当广播接收器在活动中注册且活动仍然存在时,您可以将ReceiverRestrictedContext强制转换为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);
    }    
}

0
你可以使用以下代码。
MyActivity mainActivity = (MyActivity) ((BaseApplication) context.getApplicationContext()).activity

在你的BaseApplication中定义一个名为activity的变量,在你的MyActivity中将该变量设置为activity上下文。
BaseApplication.activity  = this

没有起作用。它返回了“BaseApplication无法转换为MyActivity”。 - JollyRoger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接