为什么我无法将参数传递给Android Activity Constructor

Man*_*naq 13 android constructor android-activity

我知道我无法将参数传递给android中的Activity构造函数,但我想了解原因.

我试图做的是:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);
                Intent i = new Intent(thisContext, csa.getClass());
                startActivity(i);
Run Code Online (Sandbox Code Playgroud)

我已经将类定义如下:

public class CalorieSelectorActivity extends Activity {

public CalorieSelectorActivity(String name) {
    super();

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.calorieselector);

}
}
Run Code Online (Sandbox Code Playgroud)

当我从构造函数中删除参数时,它完美地工作.我最后使用intent.putExtra做了它,但很想知道为什么不能通过将参数传递给构造函数来完成它?

LogCat:

02-04 06:46:52.257: W/dalvikvm(800): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
02-04 06:46:52.277: E/AndroidRuntime(800): FATAL EXCEPTION: main
02-04 06:46:52.277: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.manarbushnaq.calorietracker/com.manarbushnaq.calorietracker.CalorieSelectorActivity}: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.os.Looper.loop(Looper.java:123)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.main(ActivityThread.java:4627)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.reflect.Method.invokeNative(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.reflect.Method.invoke(Method.java:521)
02-04 06:46:52.277: E/AndroidRuntime(800):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-04 06:46:52.277: E/AndroidRuntime(800):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-04 06:46:52.277: E/AndroidRuntime(800):  at dalvik.system.NativeStart.main(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800): Caused by: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.Class.newInstanceImpl(Native Method)
02-04 06:46:52.277: E/AndroidRuntime(800):  at java.lang.Class.newInstance(Class.java:1429)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
02-04 06:46:52.277: E/AndroidRuntime(800):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
02-04 06:46:52.277: E/AndroidRuntime(800):  ... 11 more
Run Code Online (Sandbox Code Playgroud)

Sam*_*eer 23

请参阅您的代码:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName);

Intent i = new Intent(thisContext, csa.getClass());

startActivity(i);
Run Code Online (Sandbox Code Playgroud)

即使您创建了一个活动对象,您在Intent对象中"传递"的内容activity object也不仅仅是class of your activity.在startActivity()Android框架中将尝试实例化您的活动对象.并且它在执行此操作时调用默认构造函数(不带参数).当您的类没有没有参数的构造函数时,它会失败.

当然,您已经找到了正确的解决方案,将参数作为Intent对象的一部分传递.

  • 我并不是Android框架实现方式的专家.但是,要理解的基本要素是框架使用反射来实例化您的活动对象.您创建的对象未被框架使用.我建议你阅读Java反思.然后它似乎并不奇怪. (2认同)

Mar*_*och 5

我很惊讶没有人回答实际提出的问题!所以要回答这个问题Why I cannot pass parameters to Android Activity Constructor:因为 Android 调用了 Activity 的构造函数,而 Android 调用的唯一构造函数是默认构造函数,您当然可以覆盖它,但是“是否添加它并不重要,并且没有上下文它可以以有用的方式使用。 ”。

因此,您无法将参数传递给默认构造函数,因此您无法使用它来为您工作。