Android – 活动构造函数
我注意到使用快捷键Alt + Insert
并选择构建器,它尝试使用每个私有属性(例如cManager
和mTextView
)创建构造函数。 我记得我已经创建了没有它的项目并且工作正常。
在运行应用程序之后,在完整的logcat和Activity
构造函数之后发生错误:
具有私有财产的构造函数:
private ConnectivityManager cManager; private TextView mTextView; public SplashScreenActivity() { this.cManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); this.mTextView = (TextView)this.findViewById(R.id.mProgressText); }
logcat的:
02-20 18:20:56.155 1591-1591/com.universo91.towersrock I/art﹕ Not late-enabling -Xcheck:jni (already on) 02-20 18:20:58.355 1591-1591/com.universo91.towersrock D/AndroidRuntime﹕ Shutting down VM --------- beginning of crash 02-20 18:20:58.361 1591-1591/com.universo91.towersrock E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.universo91.towersrock, PID: 1591 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.universo91.towersrock/com.universo91.towersrock.Pages.SplashScreenActivity}: java.lang.InstantiationException: class com.universo91.towersrock.Pages.SplashScreenActivity has no zero argument constructor at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.InstantiationException: class com.universo91.towersrock.Pages.SplashScreenActivity has no zero argument constructor at java.lang.Class.newInstance(Class.java:1563) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.NoSuchMethodException: [] at java.lang.Class.getConstructor(Class.java:531) at java.lang.Class.getDeclaredConstructor(Class.java:510) at java.lang.Class.newInstance(Class.java:1561) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-20 18:20:58.772 1591-1603/com.universo91.towersrock I/art﹕ Background sticky concurrent mark sweep GC freed 1747(114KB) AllocSpace objects, 0(0B) LOS objects, 37% free, 391KB/623KB, paused 825us total 382.655ms 02-20 18:21:29.824 1690-1690/com.universo91.towersrock D/AndroidRuntime﹕ Shutting down VM 02-20 18:21:29.829 1690-1690/com.universo91.towersrock E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.universo91.towersrock, PID: 1690 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.universo91.towersrock/com.universo91.towersrock.Pages.SplashScreenActivity}: java.lang.InstantiationException: class com.universo91.towersrock.Pages.SplashScreenActivity has no zero argument constructor at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.InstantiationException: class com.universo91.towersrock.Pages.SplashScreenActivity has no zero argument constructor at java.lang.Class.newInstance(Class.java:1563) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.NoSuchMethodException: [] at java.lang.Class.getConstructor(Class.java:531) at java.lang.Class.getDeclaredConstructor(Class.java:510) at java.lang.Class.newInstance(Class.java:1561) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-20 18:21:30.168 1690-1702/com.universo91.towersrock I/art﹕ Background sticky concurrent mark sweep GC freed 1749(114KB) AllocSpace objects, 0(0B) LOS objects, 37% free, 391KB/623KB, paused 856us total 166.355ms 02-20 18:21:53.341 1690-1690/com.universo91.towersrock I/Process﹕ Sending signal. PID: 1690 SIG: 9 02-20 18:26:00.878 1754-1754/com.universo91.towersrock D/AndroidRuntime﹕ Shutting down VM 02-20 18:26:00.903 1754-1754/com.universo91.towersrock E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.universo91.towersrock, PID: 1754 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.universo91.towersrock/com.universo91.towersrock.Pages.SplashScreenActivity}: java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.Activity.getSystemService(Activity.java:4989) at com.universo91.towersrock.Pages.SplashScreenActivity.(SplashScreenActivity.java:24) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.Class.newInstance(Class.java:1572) at android.app.Instrumentation.newActivity(Instrumentation.java:1065) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-20 18:26:01.144 1754-1766/com.universo91.towersrock I/art﹕ Background sticky concurrent mark sweep GC freed 1745(118KB) AllocSpace objects, 0(0B) LOS objects, 38% free, 382KB/623KB, paused 950us total 131.218ms 02-20 18:26:04.429 1754-1754/com.universo91.towersrock I/Process﹕ Sending signal. PID: 1754 SIG: 9
所有初始化都应该在Activity
的onCreate()
方法中执行:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.cManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); this.mTextView = (TextView)this.findViewById(R.id.mProgressText); }
覆盖Activity
的构造函数涉及相当多的繁重工作,并且真的不是在公园散步。 虽然你[当然]可以为Activity
创建一个空构造函数,但在Android框架的上下文中它确实是多余的。
相关答案:
1. 为什么我无法将参数传递给Android Activity Constructor 。
2. 使用参数启动活动 。
你的代码应该在onCreate()中
不要打扰活动的构造函数。
只要采用零参数,Android活动就可以拥有构造函数。 实际上,只要在声明它时初始化任何字段,就会有这样的构造函数。
但正如您的日志所述, System services not available to Activities before onCreate()
, System services not available to Activities before onCreate()
,因此您无法从构造函数中调用getSystemService
。
所以https://stackoverflow.com/a/28636652/53974中的代码是正确的,但原因不是。
- 无法打开数据库/无法将(数据库)的区域设置更改为“en_US”
- 如何在Codename One Android项目中为build.gradle添加`apply plugin`以添加本机库?
- android服务START_STICKY START_NOT_STICKY
- 什么是差异。 default.properties和project.properties之间?
- java.net.ConnectException:连接拒绝TCP
- 将progressDialog添加到JSON Parser类并返回MainActivity的方法
- 在测试谷歌应用程序时退款测试购买
- 在测试期间以编程方式设置genymotion gps会在设置纬度时导致“SecurityException:invalid package name”
- java.lang.IllegalStateException:预期BEGIN_ARRAY但在第1行第2列是BEGIN_OBJECT