从 BroadcastReceiver 调用 MainApplication 方法

Calling MainApplication methods from BroadcastReceiver

我有一个 Android 应用程序,其中包含一个 Activity、一个服务和一个广播接收器。从该服务中,我调用了一个有效的广播意图。广播接收器正确接收意图。

但是如何从我的 Class MyBroadcastReceiver 访问 class MainApplication 的方法?

((MainApplication)getApplication()).myMethod(); 给出错误信息 "cannot resolve method"

//Call from the service-class
private void sendBroadcast() {
    Log.d(TAG, "Sending Broadcast Intent");
    Intent intent = new Intent();
    intent.setAction("com.package.name.MyBroadcastReceiver");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    sendBroadcast(intent);
}


//receiver class
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Doesn't work - "cannot resolve method"
        ((MainApplication)getApplication()).myMethod();
        //Doesn't work either
        ((MainApplication)context.getApplication()).myMethod();
        Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
    }
}



//Main Application Class
public class MainApplication extends Application{

    public void myMethod(){

    }

}

此致

动态创建 BroadcastReceiver:

在您的 BroadcastReceiver class 中定义 class 成员:

YourMainActivity yourMain = null;

和方法:

setMainActivityHandler(YourMainActivity main){
yourMain = main;
} 

从您的 MainActivity 执行:

private YourBroadcastReceiverClassName yourBR = null;
yourBR = new YourBroadcastReceiverClassName();
    yourBR.setMainActivityHandler(this);    
    IntentFilter callInterceptorIntentFilter = new           IntentFilter("android.intent.action.ANY_ACTION");
    registerReceiver(yourBR,  callInterceptorIntentFilter);

当 yourBR.onReceive 被触发时,您可以调用:

yourMain.methodOfMainActivity();

如果您没有在 AndroidManifest.xml.

中声明您 MainApplication class,通常会发生上述情况

在您的 AndroidManifest.xml 文件中找到 application 标签,并确保它的名称属性指向您的 MainApplication - 如下所示。

<application
        android:name="com.you.package.MainApplication"

将上下文转换为 Activity:

//receiver class
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Activity activity = (Activity) context;
        ((MainApplication)activity.getApplication()).myMethod();
        Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
    }
}