2

我有一个场景,其中有多个活动和一个服务。所有这些活动在需要从任何 URL 获取数据时,启动服务(活动class name在 Intent 中传递)并注册一个BroadcastReceiver监听,responseIntent服务将在获得响应时发送。Serviceclass name在 Intent 中与响应一起传递。

我已经实现了这个并且它有效。但问题是 fromBroadcastReceiveronReceive()方法,如何调用接收到广播事件的活动的方法?

注意:我想处理类引用而不是对象。我试过这个,

public void onReceive(Context context, Intent intent) {
    Class<?> thisActivity = Class.forName(intent.getStringExtra("ClassName"));
    thisActivity.hello();  // hello() is a public and static method
}

但它不起作用。

谢谢你。

4

3 回答 3

0

你是如何得到你试图从 Intent 的“ClassName”中提取的类名的?

准备意图:

Intent i = new Intent(....);
String className = MyClass.class.getCanonicalName();
i.putExtra(CLASS_NAME, className);

提取意图内容:

String canName = intent.getStringExtra(CLASS_NAME);
mClientClass = Class.forName(canName);
java.lang.reflect.Methodm m = mClientClass.getMethod("hello", new Class[] {});

得到结果:

Object result = m.invoke(mClientClass, new Object[] {});
于 2014-10-31T08:35:47.843 回答
0

您需要将完整的包名添加到“ClassName”字符串中,如下所示:

Class<?> thisActivity = Class.forName(intent.getStringExtra("com.android.youapp.ClassName"));

注意:如果此类位于不同的库项目中,则应相应地设置字符串名称。

于 2014-08-31T13:44:25.680 回答
0

您不能通过Intent. 想象一下,Parcelable对象就像Serializable对象一样,它们的引用丢失了。

您应该在您的 中将您声明BroadcastReceiver为内部类Activity,然后您将引用封闭的Activity. 这是做到这一点的方法。

于 2013-06-17T12:27:06.470 回答