从 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();
}
}
我有一个 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();
}
}