我最近看到过关于Redux的JS讨论。扬声器编写了一个没有任何类的工作应用程序,仅使用const变量。他甚至在他的lint文件中排除了类(https://github.com/MartinSeeler/redux-presentation/tree/master/demo)。
所以我尝试在我的Android应用程序中执行相同的操作,这些应用程序是用Kotlin编写的。不幸的是,当我尝试将MainActivity类作为对象时,我收到以下错误:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{blog.app.niklas.flyingbytes/blog.app.niklas.flyingbytes.MainActivity}: java.lang.IllegalAccessException: void blog.app.niklas.flyingbytes.MainActivity.<init>() is not accessible from java.lang.Class<android.app.Instrumentation>
Caused by: java.lang.IllegalAccessException: void blog.app.niklas.flyingbytes.MainActivity.<init>() is not accessible from java.lang.Class<android.app.Instrumentation>
有办法解决这个问题吗?我真的很喜欢在我的应用程序中拥有尽可能多的单例对象的想法。
提前谢谢你,
Niklas
答案 0 :(得分:2)
你不能用Android上的kotlin对象替换Activity类,原因与你不通过调用它的构造函数来实例化Activity相同: 活动由平台管理。
当您(通过Intent)请求Activity的平台时,平台将尝试通过调用零参数的构造函数来实例化它。对象不存在,给出上述错误。
据说,一些开发人员躲避Android给出的框架,如mortar,只有一个活动,并使用自定义逻辑在视图之间导航。
答案 1 :(得分:0)
正如杰弗里所说,Android平台管理您的活动,但这也意味着该平台负责跟踪您的活动实例 - 这是Singleton的目的。
因此,虽然您无法将“活动”设为对象,但仍可以使用android:launchMode
中的AndroidManifest
属性将其设为单身人士:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleInstance">
有关launchMode属性的更多信息(包括其他可能的值),请查看Official Documentation