好吧,我已经阅读了许多关于如何做到这一点的不同意见但没有成功。也许我错过了什么或者没有做对,所以任何帮助我都会欣赏......
所以,我有2个类。假设A类是一个活动,并且有一个名为classAmethod();
的公共方法现在,B类实际上扩展了BroadcastReceiver。所以在B类中,我需要启动classAmethod();
-
到目前为止,当我尝试这个时,它会想要使它静止。但我不能这样做。我已经尝试了一些其他不使它静态的方法但是由于某种原因它会自动地想要它是静态的,如果不是,它会在调用方法时FC。
答案 0 :(得分:0)
方法属于对象。如果要调用方法,则必须在对象上完成。因此,如果你想从B级调用classAMethod()
,那么B类必须引用A类。
你没有太好地描述你想要做什么,可能有更好的(更多的机器人)方式做你想做的事情。也许如果你描述你想要做的事情,我们可以给你一个更好的答案。
答案 1 :(得分:0)
如果您有机会将Activity A self作为上下文发送,您可以将其转换为实现具有classAmethod()的接口的类型;并打电话。 make Activity实现具有方法classAmethod()。
的接口答案 2 :(得分:0)
有很多方法可以做到这一点,所以我将概述两种方法。
选项1.使用监听器
创建一个界面
public interface Listener {
public abstract void onEvent();
}
在广播接收器中创建静态引用和setter
private static MessageListener mListener = null;
@Override
public void onReceive(Context context, Intent intent) {
//stuff
if(mListener != null)
mListener.onEvent();
}
public static void setListener(Listener l) {
mListener = l;
}
然后在Activity
中实现监听器class MyActivity implements Listener{
@Override
public void onResume(){
//register the listener, should probably unregister in onDestroy
BroadCastReceiver.setListener(this);
}
@Override
public void onEvent(){
//do something
}
}
选项2.使用意图
在广播接收器中
Intent intent = new Intent();
Bundle bundleToSend = new Bundle();
//BUNDLE_EXTRA,DO_SOME_ACTION and ACTION_KEY are just constants so just define them somewhere
bundleToSend.putInt(ACTION_KEY, DO_SOME_ACTION);
intent.putExtra(BUNDLE_EXTRA, bundleToSend);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
标记FLAG_ACTIVITY_SINGLE_TOP
将在未启动时启动活动,或者如果它正在运行,它将被onNewIntent()
捕获,因此您需要在onCreate()
和onNewIntent()
中添加一些代码final Bundle bundleReceived = intent.getBundleExtra(BUNDLE_EXTRA);
if (bundleReceived.getInt(ACTION_KEY) == DO_SOME_ACTION) {
//do something
}
提取捆绑包并检查操作。
{{1}}
选项1实际上仅在广播接收器仅在活动位于最前端时才接收时才有用。选项2更通用,即使应用程序未运行也可以使用(例如,广播接收器在启动时启动的服务中运行),以便无论活动状态如何,都将启动活动并执行操作。 / p>
答案 3 :(得分:0)
Android Activity
是一个特殊类,不应被视为“标准”Java类。换句话说(出于你的问题的目的),它应被视为一个自包含的类,因此不应将公共方法暴露给其他(外部)类。
如果您希望BroadcastReceiver
能够访问Activity
中的方法,请将BroadcastReceiver
定义为Activity
的内部类...
public class MyActivity extends Activity {
...
private class MyBroadcastReceiver extends BroadcastReceiver {
// Once instantiated and registered by MyActivity, can
// access methods and fields of MyActivity
}
}