为什么Activity中的onCreate()方法是protected的?
或者我应该问:为什么它会起作用?
受保护的方法只能在类内部或其子类内部调用。因此,Android系统无法像“act.onCreate()”那样调用它。那么...它怎么被调用呢?
顺便问一下,为什么OnClickListener中的onClick()方法是public的?有什么区别?
为什么Activity中的onCreate()方法是protected的?
或者我应该问:为什么它会起作用?
受保护的方法只能在类内部或其子类内部调用。因此,Android系统无法像“act.onCreate()”那样调用它。那么...它怎么被调用呢?
顺便问一下,为什么OnClickListener中的onClick()方法是public的?有什么区别?
onCreate() 方法是受保护的,以避免从 Activity 对象中调用它。
MyActivity activity = new MyActivity();
activity.onCreate(args); // which doesn't make sense because activity is not yet created
由于这种方法只在活动创建时调用,自己调用它很可能会导致nullpointerException,因为活动尚未创建。
拥有公共的onClick方法很有用,因为您可以通过编程“强制”单击某些按钮。这种情况的一个常见示例是在用户按下回车键或按下提交按钮时执行相同的代码。
我认为Android不会直接调用Activity.onCreate。请注意,Activity继承自Context(它具有公共构造函数)。据我了解,构造函数触发一些事件,在适当的时间内内部调用类的onCreate / Pause / Resume / Destroy方法。
例如,当您创建活动时,视图XML文件必须被解析和填充。这是自动完成的,因此有一些事情发生在幕后,您不能直接控制。
onCreate不是公共的,因为你不想让一个完全不同包中的随意类创建一个活动。
比如我在com.abccompany.activity包中设计了一个Activity类,我的其中一位同事则在com.abccompany.jsonparser包中设计了一个JSON数据解析类。我不希望他随便创建我的Activity并在他想要的时候显示他的JSON数据。
onCreate不是私有的,因为你确实想要对Activity进行子类化,然后使用其超类Activity onCreate方法来创建子类。
实际上,你设计的每个Activity都会扩展android.app.Activity,所以如果在该超类中onCreate是私有的,那么你将无法调用onCreate。
你为什么要关心onCreate是否是protected?它被保护是因为逻辑上它不应该被其他与Activities不同的类访问。Android如何启动Activity?有很多种方法可以做到这一点,特别是如果你是设计框架的人,解决方案可能是在构造函数中调用它(一种可能性),或者通过反射以适当的权限等其他机制来调用。
onClick是公共的,因为它可以由不必然是你的Activity的外部类设置或处理。我的意思是,类A可以处理Activity的onClick事件。
Activity
在android.app
包中,因此android.app
中的任何类(例如android.app.Instrumentation
)都可以直接调用活动的onCreate
方法。 - ZoogieZork