自定义 android.app.Application 未触发 onCreate 事件

Posted

技术标签:

【中文标题】自定义 android.app.Application 未触发 onCreate 事件【英文标题】:custom android.app.Application not firing onCreate event 【发布时间】:2011-10-15 01:10:14 【问题描述】:

我正在从 android.app.Application 派生一个自定义应用程序,但我无法触发它的 onCreate 事件。这是实现

import android.app.Application;

public class MyApplication extends Application 

    public MyApplication() 
        super();
    

    @Override
    public void onCreate() 
        super.onCreate();
    

这是我的使用方法:

MyApplication ctrl = new MyApplication();

【问题讨论】:

ctrl.onCreate(); 会为你做这件事... 是的,确实如此。但这不应该自动触发吗?我也可以在构造函数中调用 onCreate(),但我认为这不是最优雅的解决方案。 你应该调用 MyApplication 构造函数......你应该在清单 xml 中指向这个类,Android OS 应该调用它......和 ​​onCreate 也是 我应该如何在 AndroidManifest 中声明一个从 Activity 调用的应用程序?默认情况下,应用程序标签已经添加到那里。 为什么你需要扩展标准的Application类... 【参考方案1】:

在您的AndroidManifest.xml 中添加关注

<application
    android:name="MyApplication"
    android:debuggable="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name">
</application>

那么你的onCreate() 将被解雇。

【讨论】:

它不起作用。我将主 Activity 定义为 AndroidManifest.xml 中的错误和此附加应用程序标记的应用程序。你认为这是正确的吗? @BalajiKhadake 我的应用程序类从库应用程序类扩展而来,并且库中的 onCreate 不会触发! 必须在 android:name 中添加类名,如 android:name="your.package.com.MyApplication"。【参考方案2】:

我遇到了这个问题,发现就我而言,整个问题都出在手机端。我重启了手机,问题就解决了。

【讨论】:

老兄。你可能用这个答案为我节省了几个小时。谢谢。【参考方案3】:

非常简单

在您的AndroidManifest.xml 中,在application 标记中输入您的Application 子类的名称及其在android:name 属性下的路径。

示例:

<application
...
android:name=".models.custom.BaseApplication"
...
> ... </application>

【讨论】:

【参考方案4】:

不要构造它,从Context获取它。

例如来自Activity:

MyApplication ctrl = (MyApplication)getApplicationContext();

更多信息: Context.getApplicationContext()

文档说onCreate()

在应用程序启动时调用,在任何其他应用程序之前调用 对象已创建

【讨论】:

对我也不起作用。实际上应用程序在这一行崩溃了。 您建议的行:MyApplication ctrl = (MyApplication)getApplicationContext(); ***.com/questions/708012/… 谢谢。这里的问题是我还应该在 AndroidManifest.xml 中声明该应用程序,但是根据 Balaji 的回复和 cmets,我不能在那里定义 2 个应用程序。你能想出解决办法吗?【参考方案5】:

您实际上并没有使用newoperator 创建您的活动实例。相反,您可以像这样开始一个 Intent:

Intent start = new Intent(context, Classname.class);
context.startActivity(start);

当使用new 操作符创建对象时,onCreate 永远不会被调用。

[编辑] 使用 new 运算符创建应用程序时,onCreate 也不会被调用[/EDIT]

[EDIT2] 您可以创建一个返回应用程序的静态方法,如下所示:

public static MyApplication getApp() 
    return mInstance;

[/EDIT2]

【讨论】:

这不是 Activity 它是应用程序 哎呀,我的错。但这也适用于应用程序。如果您使用 new 运算符创建应用程序,则不会调用 onCreate。 是的,我这样做了,但我需要能够获取对象实例才能设置对象属性并调用其方法。 你可以创建一个静态方法来返回这个应用程序的单例。 你不能从静态方法返回 this -_-【参考方案6】:

正如 Balaji 提到的,如果您在应用程序标签下提到类名后仍然面临问题

<application
    android:name="MyApplication"
    android:debuggable="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"> </application>

然后试试这个:

尝试禁用 Instant Run,然后清理项目并重建它,然后再次运行。 它对我有用。 谢谢。

【讨论】:

【参考方案7】:

在清单文件中确保你已经添加了标签,即扩展应用程序的类。

Tag= android:name=".MyApplication

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.services">
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Services">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--Declaring the Service in the manifest file-->
        <service
            android:name=".MyServiceDemo"
            android:foregroundServiceType="dataSync" />
    </application>
</manifest>

MyApplication.java(即扩展 Applicatoin 的类)

package com.example.services;

import android.app.Application;

public class MyApplication extends Application 

    private static MyAppsNotificationManager notificationManager;

    @Override
    public void onCreate() 
        super.onCreate();
        notificationManager = MyAppsNotificationManager.getInstance(this);
        notificationManager.registerNotificationChannelChannel(
                getString(R.string.channelId),
                "BackgroundService",
                "BackgroundService");
    

    public static MyAppsNotificationManager getMyAppsNotificationManager()
        return notificationManager;
    

【讨论】:

以上是关于自定义 android.app.Application 未触发 onCreate 事件的主要内容,如果未能解决你的问题,请参考以下文章

自定义UI 自定义布局

自定义UI 自定义布局

自定义UI 自定义布局

自定义 view - 自定义属性

Springboot+自定义注解+自定义AOP前置增强+自定义异常+自定义异常捕获

Android 自定义View