首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ApplicationContext in BroadcastReceiver

ApplicationContext in BroadcastReceiver
EN

Stack Overflow用户
提问于 2016-12-09 13:10:40
回答 1查看 1.2K关注 0票数 3

我有一个这样的应用程序类:

代码语言:javascript
复制
public class MyApplication extends Application {
}

它在“宣言”中登记:

代码语言:javascript
复制
    <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:

代码语言:javascript
复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, final Intent intent){

       MyApplication myApplication = (MyApplication) context.getApplicationContext();           
    }
}

它在“宣言”中注册为InstallReferrerReceiver

代码语言:javascript
复制
    <receiver
        android:name="my.package.MyReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="com.android.vending.INSTALL_REFERRER"/>
        </intent-filter>
    </receiver>

如您所见,我将应用程序上下文转换为我的application类,它在活动等方面运行良好,通常在这里也是如此。

虽然我收到了例外:

代码语言:javascript
复制
Unable to start receiver my.package.BroadcastReceiver: java.lang.ClassCastException: android.app.Application cannot be cast to my.package.MyApplication

我的问题是:我是否保证将我的应用程序对象作为BroadcastReceiver中的应用程序上下文来接收?

EN

回答 1

Stack Overflow用户

发布于 2017-10-24 01:32:43

如果您查看ActivityThread.handleReceiver的实现,您将看到通过将ContextImpl.getReceiverRestrictedContext()传递给它来调用BroadcastReceiver.onReceived。此调用返回的上下文实际上没有包装getApplicationContext,因此将在ContextImpl上调用ti。现在,如果您查看ContextImpl.getApplicationContext(),您将看到这样的情况

代码语言:javascript
复制
@Override
public Context getApplicationContext() {
    return (mPackageInfo != null) ? mPackageInfo.getApplication() : 
        mMainThread.getApplication();
}

如果您查看三元操作符的最后一个分支,您将看到它将调用ActivityThread.getApplication(),这将返回它的mInitialApplication成员。mInitialApplication是通过调用具有布尔参数:forceDefaultAppClassLoadedApk.makeApplication()来初始化的。如果设置为true,android.app.Application将实例化清单中定义的应用程序。

根据AOSP源,这种情况发生在以下情况:

如果该应用程序正在启动以进行完全备份或还原,则在受限环境中使用基类打开它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41061272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档