美文网首页
**Activity must extend android.a

**Activity must extend android.a

作者: 小小痞子LIU | 来源:发表于2023-04-05 23:55 被阅读0次

    D:\Program Files\Android**\app\src\main\AndroidManifest.xml:35: Error: **Activity must extend android.app.Activity [Instantiatable]
    android:name=".ui.SplashActivity"
    ~~~~~~~~~~~~~~~~~~

    Explanation for issues of type "Instantiatable":
    Activities, services, broadcast receivers etc. registered in the manifest
    file (or for custom views, in a layout file) must be "instantiatable" by
    the system, which means that the class must be public, it must have an
    empty public constructor, and if it's an inner class, it must be a static
    inner class.

    1 errors, 0 warnings (3 errors filtered by baseline lint-baseline.xml)

    Java 方法

    当我们在 Android 应用程序的清单文件中注册一个活动(Activity)时,需要遵循可实例化的要求。下面是一个活动类的示例:

    public class MyActivity extends AppCompatActivity {
    
        public MyActivity() {
            // This is an empty public constructor required by the system
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);
        }
    }
    

    上述代码展示了一个简单的 MyActivity 类。它继承了 AppCompatActivity 类,并实现了一个空的公共构造函数,这是可实例化的要求之一。

    当我们在应用程序的清单文件中注册这个活动时,我们需要确保该类是公共的,例如:

    <activity android:name=".MyActivity" />
    

    如果我们忘记实现空的公共构造函数,或者不小心使 MyActivity 类成为一个非公共类,系统就无法创建该活动的实例,应用程序可能会在运行时遇到错误或崩溃。因此,遵循可实例化的要求非常重要,以确保应用程序在所有 Android 设备上都能正常运行。

    Kotlin方法

    同样的,如果在 Kotlin 中定义的类不满足 Instantiatable 类型要求,也会导致注册组件失败。以下是一个注册了 Service 的 Kotlin 代码:

    <service android:name=".MyService" />
    

    而相应的 MyService 类定义如下:

    class MyService : Service() {
        // ...
    }
    

    这里同样会遇到 Instantiatable 类型问题,因为 MyService 类没有空的 public 构造函数。

    要解决这个问题,我们同样需要将 MyService 声明为 public,并添加一个空的 public 构造函数,如下所示:

    class MyService : Service() {
        constructor() : super() // public constructor
        
        // ...
    }
    

    这样就可以成功实例化 MyService,并解决 Instantiatable 类型问题了。如果你使用 Kotlin 1.1 或更高版本,还可以使用 Kotlin 的 @JvmOverloads 注解来自动生成所有可能的构造函数,例如:

    class MyService @JvmOverloads constructor(
            context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    ) : Service() {
        // ...
    }
    

    这样会自动生成一个空的 public 构造函数,以及一个带参的构造函数,使得我们可以更方便地解决 Instantiatable 类型问题。

    如果上面方法都处理不了的话就使用终极方法终极方法

    创建 lint-baseline.xml文件,放在跟混淆文件的同一路径下

    <?xml version="1.0" encoding="UTF-8"?>
    <issues format="6" by="lint 7.3.1" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.1)" variant="fatal" version="7.3.1">
        <issue
            id="Instantiatable"
            message="`SplashActivity` must extend android.app.Activity"
            errorLine1="            android:name=&quot;.ui.SplashActivity&quot;"
            errorLine2="                          ~~~~~~~~~~~~~~~~~~~~">
            <location
                file="src/main/AndroidManifest.xml"/>
        </issue>
        
    </issues>
    
    • 上面的 7.3.1 是gradle的插件版本 gradle plugin version
    • SplashActivity 是出问题的activity
    • .ui.SplashActivity 是activty在AndroidManifest.xml的路径

    最后在build.gradle中配置

    android{
    ........
    lint {
            baseline = file("lint-baseline.xml")
        }
    }
    

    相关文章

      网友评论

          本文标题:**Activity must extend android.a

          本文链接:https://www.haomeiwen.com/subject/mmerddtx.html