Доступ к экземпляру активности из BroadcastReceiver - PullRequest
3 голосов
/ 17 сентября 2011

Взяв пример кода из 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();
            }
        }
    }

}

Я вижу, что они каким-то образом могут извлекать запущенный экземпляр WalkieTalkieActivity путем приведения context в приемнике вещания.Как это возможно?Является ли это ярлыком для доступа к действию вместо отправки намерения?

Ответы [ 2 ]

1 голос
/ 16 июля 2015

Я сейчас не на своем ноутбуке с 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 голосов
/ 25 июля 2016

Вы можете использовать следующий код

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

Определить переменную активность в вашем BaseApplication и в MyAcitivity установите эту переменную в контексте действия

BaseApplication.activity  = this
...