BroadcastReceiver基于Activity运行执行不同的操作

时间:2013-09-25 03:27:44

标签: android

我想知道是否有办法在onReceive(Context context, Intent intent)的{​​{1}}方法中确定有效活动?我最初认为传入的上下文是这样的,但后来发现它实际上是BroadCastReceiver

我正在尝试执行以下操作,类似于如何将信息从ReceiverRestrictedContext传递到其封装Fragment

Activity

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

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

 mListener.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 并将所需的功能放在那些活动中,但我想知道是否有人知道是否有任何解决上述情况的方法我会根据正在运行的Activity,只需要一个具有不同功能的BroadcastReceiver

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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"

答案 2 :(得分: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()进行比较,您可以实现不同的功能。

答案 3 :(得分:0)

  

此时我只想在每个活动中创建一个内部类BroadcastReceiver并将所需的功能放在那些

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

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

如果您需要向BroadcastReceiver的每个实例显式传递一些标识符,以确定它与哪个Activity关联,请在接收器中定义一个简单的标识符(如类名作为String)。传递Activity本身并不是一个好主意,原因类似于框架为什么不这样做。如果你很好奇,我不久前写了一篇blog post,详细说明了传递上下文的一些问题。