android - 从 BroadcastReceiver 访问 Activity 实例

标签 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 实例。这怎么可能?这是代替发送 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/

相关文章:

android - 制作具有原生外观和感觉的混合应用程序

Android:将带有可播放视频的 Intent 发送到电报应用程序

java - RuntimeExceptionjava.lang.RuntimeException : Unable to instantiate activity ComponentInfo

android - NFC Intent 在 onNewIntent 之前调用 onPause - 如何知道 onPause 调用的来源?

android - 如何完成当前 Activity 并启动新的 Activity 接收方式?

android - 应用 ColorFilter/ColorMatrix 将图像完全变白

java - 无法为初始化脚本打开 cp_init 类缓存

java - 如何抑制初始化警告

java - 为什么我在 androidmanifest.xml 中使用 configchanges 声明的 adactivity 时出现此错误

android - 使用 ViewPager 从父 Activity 调用 Fragment 的方法