我有一个这样的应用程序类:
public class MyApplication extends Application {
}它在“宣言”中登记:
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>我使用这个应用程序类来保存匕首组件等。
现在我有了一个BroadcastReceiver:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent){
MyApplication myApplication = (MyApplication) context.getApplicationContext();
}
}它在“宣言”中注册为InstallReferrerReceiver:
<receiver
android:name="my.package.MyReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER"/>
</intent-filter>
</receiver>如您所见,我将应用程序上下文转换为我的application类,它在活动等方面运行良好,通常在这里也是如此。
虽然我收到了例外:
Unable to start receiver my.package.BroadcastReceiver: java.lang.ClassCastException: android.app.Application cannot be cast to my.package.MyApplication我的问题是:我是否保证将我的应用程序对象作为BroadcastReceiver中的应用程序上下文来接收?
发布于 2017-10-24 01:32:43
如果您查看ActivityThread.handleReceiver的实现,您将看到通过将ContextImpl.getReceiverRestrictedContext()传递给它来调用BroadcastReceiver.onReceived。此调用返回的上下文实际上没有包装getApplicationContext,因此将在ContextImpl上调用ti。现在,如果您查看ContextImpl.getApplicationContext(),您将看到这样的情况
@Override
public Context getApplicationContext() {
return (mPackageInfo != null) ? mPackageInfo.getApplication() :
mMainThread.getApplication();
}如果您查看三元操作符的最后一个分支,您将看到它将调用ActivityThread.getApplication(),这将返回它的mInitialApplication成员。mInitialApplication是通过调用具有布尔参数:forceDefaultAppClass的LoadedApk.makeApplication()来初始化的。如果设置为true,android.app.Application将实例化清单中定义的应用程序。
根据AOSP源,这种情况发生在以下情况:
如果该应用程序正在启动以进行完全备份或还原,则在受限环境中使用基类打开它。
https://stackoverflow.com/questions/41061272
复制相似问题