0

我想知道是否有办法在 a 的方法中确定活动onReceive(Context context, Intent intent)活动BroadCastReceiver?我一开始以为传入的上下文是这样的,后来发现其实是一个ReceiverRestrictedContext.

我正在尝试执行以下操作,类似于将信息从 a 传递Fragment到其封装的方式Activity

try {
       mListener = (MyListenerInterface) (context.getApplicationContext());
    } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement MyListenerInterface");
    }

 mListener.onMessageReceived(msg);

每个活动都实现了 MyListenerInterface,并覆盖了 onMessageReceived(msg) 方法,我认为这已经足够了。但是,我在运行和接收广播时收到以下异常:

09-24 22:40:48.706: E/AndroidRuntime(29267): FATAL EXCEPTION: main
09-24 22:40:48.706: E/AndroidRuntime(29267): java.lang.RuntimeException: Unable to start receiver com.test.stuff.Receiver: java.lang.ClassCastException: android.app.ReceiverRestrictedContext@448c8008 must implement MyListenerInterface
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2821)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.app.ActivityThread.access$3200(ActivityThread.java:125)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.os.Looper.loop(Looper.java:123)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.app.ActivityThread.main(ActivityThread.java:4627)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at java.lang.reflect.Method.invokeNative(Native Method)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at java.lang.reflect.Method.invoke(Method.java:521)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at dalvik.system.NativeStart.main(Native Method)
09-24 22:40:48.706: E/AndroidRuntime(29267): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext@448c8008 must implement MyListenerInterface
09-24 22:40:48.706: E/AndroidRuntime(29267):    at com.test.stuff.Receiver.onReceive(Receiver.java:63)
09-24 22:40:48.706: E/AndroidRuntime(29267):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810)
09-24 22:40:48.706: E/AndroidRuntime(29267):    ... 10 more

在这一点上,我只是在考虑BroadcastReceiver在每个活动中创建一个内部类并将所需的功能放入其中,但我想知道是否有人知道是否有任何解决上述方案的方法,我只需要一个BroadcastReceiver具有不同功能的方案基于正在运行的 Activity。

4

4 回答 4

0

你看过 ActivityManager.getRunningTasks() 方法了吗?这可能会帮助您在接收器中找出前景中的内容。

http://developer.android.com/reference/android/app/ActivityManager.html#getRunningTasks(int)

于 2013-09-25T03:43:09.673 回答
0

您可以通过以下代码获取正在运行的活动

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

     List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); 

     Log.d("topActivity", "CURRENT Activity ::"
             + taskInfo.get(0).topActivity.getClassName());

通过将您的活动的类名与您进行比较,taskInfo.get(0).topActivity.getClassName()您可以实现不同的功能。

于 2013-09-25T04:45:28.270 回答
0

尝试使用Application基于 - 的类来存储您的 lastActivity。每次Activity onResume通话App.setLastActivity

public final class App extends Application {

private static Activity lastActivity = null;
    public static void setLastActivity(Activity activity){
        lastActivity = activity;
    }
    public static Activity getLastActivity(){
        return lastActivity;
    }
}

getLastActivity然后,无论何时您需要它 -根据您获得的价值调用并采取行动。

不要忘记将Application类名添加到application清单中的标记

android:name="your.packahe.name.App"
于 2013-09-25T04:27:23.910 回答
0

在这一点上,我只是在考虑BroadcastReceiver在每个活动中创建一个内部类,并将所需的功能放入那些

是的,这是实现该功能的最佳方式。如果您想让功能通用而不是将其复制到每个 Activity 中,您可以为应用程序中的每个 Activity 创建一个基类,以便在您希望BroadcastReceiver成为内部类时进行扩展。

您仍然可以像您可能已经拥有的那样在单独的文件中定义它,但只需在每个 Activity 中直接注册接收器,而不是在 AndroidManifest.xml 文件中注册一次。如果您在 / 中注册/取消注册接收器onResume()onPause()那么在任何给定时间您仍然只有一个活动接收器附加到当前前台 Activity。 当您的应用程序根本不在前台时,这些方法还会阻止您接收给定的广播,而清单中定义的接收器始终处于活动状态,从而迫使您处理这种情况。

如果您需要将某个标识符显式传递给BroadcastReceiver与其关联的 Activity 的每个实例,请定义一个简单的标识符(如作为字符串的类名),您可以在接收器中检查该标识符。传递 Activity 本身并不是一个好主意,原因与框架为什么也不这样做的原因类似。如果你很好奇,我不久前写了一篇博文,详细介绍了像这样传递 Context 的一些问题。

于 2013-09-25T05:02:52.567 回答