在BroadcastReceiver.onReceive(..)之前是否会调用Application.onCreate(Bundle)?

Mua*_*hai 9 android

只是想验证Application.onCreate()保证在之前被调用BroadcastReceiver.onReceive()?假设您正在等待BOOT广播或短信广播,您能否确定Application.onCreate()在您到达之前已经呼叫过一次BroadcastReceiver.onReceive()?谢谢

小智 19

文档告诉我们以下内容:

public void onCreate()

在应用程序启动时调用,在创建任何活动,服务或接收方对象(不包括内容提供程序)之前调用.

在此处找到:http: //developer.android.com/reference/android/app/Application.html


Nei*_*eil 5

public void onReceive(Context context, Intent intent) 如果您注册一个静态的接收器,上下文是应用程序,否则就是你所说的情况下registerReceiver


3c7*_*c71 5

老问题,但是我可以提供更新的答案和实际测试结果。

最初我是这么认为的,并将我的应用程序设置为 onCreate() 首先保存应用程序上下文,如下所示:

@Override
public void onCreate()
{
    myapp.app_context = this;

    super.onCreate();
Run Code Online (Sandbox Code Playgroud)

现在我得到了一个这样声明的接收器:

    <receiver android:name=".myreceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

并在接收时:

@Override
public void onReceive(Context context, Intent intent)
{
    ctx = myapp.app_context;
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪显示 ctx (myapp.app_context) 为 NULL!在 Android 6 Galaxy J7 设备上获得 1 个,在 Android 9 Xperia XZ1 上获得 1 个。