为什么Activity中的onCreate()方法是protected的?

10

为什么Activity中的onCreate()方法是protected的?

或者我应该问:为什么它会起作用?

受保护的方法只能在类内部或其子类内部调用。因此,Android系统无法像“act.onCreate()”那样调用它。那么...它怎么被调用呢?

顺便问一下,为什么OnClickListener中的onClick()方法是public的?有什么区别?


4
请记住,受保护的方法也可以从同一包内的其他类中调用。Activityandroid.app包中,因此android.app中的任何类(例如android.app.Instrumentation)都可以直接调用活动的onCreate方法。 - ZoogieZork
4个回答

9

onCreate() 方法是受保护的,以避免从 Activity 对象中调用它。

MyActivity activity = new MyActivity();
activity.onCreate(args);  // which doesn't make sense because activity is not yet created

由于这种方法只在活动创建时调用,自己调用它很可能会导致nullpointerException,因为活动尚未创建。


8

拥有公共的onClick方法很有用,因为您可以通过编程“强制”单击某些按钮。这种情况的一个常见示例是在用户按下回车键或按下提交按钮时执行相同的代码。

我认为Android不会直接调用Activity.onCreate。请注意,Activity继承自Context(它具有公共构造函数)。据我了解,构造函数触发一些事件,在适当的时间内内部调用类的onCreate / Pause / Resume / Destroy方法。

例如,当您创建活动时,视图XML文件必须被解析和填充。这是自动完成的,因此有一些事情发生在幕后,您不能直接控制。


XML的膨胀是自动发生的吗?那setContentView()是什么意思? - Lai Yu-Hsuan
我不确定setContentView是否实际上会填充XML文件。文档也没有明确说明。 - Zach Rattner
从Activity.setContentView()文档中可以看到:“从布局资源设置活动内容。该资源将被填充,将所有顶级视图添加到活动中。” - Squonk
@Squonk:我似乎记得在Google I/O会议演讲中看到过一些内容,他们说由于Android优化处理的方式,布局膨胀可能不会在您认为它会发生的时间点发生。因此,在调用setContentView()之后,布局将会被膨胀。但我不认为可以保证在该调用中布局将被膨胀。 - Zach Rattner

3

onCreate不是公共的,因为你不想让一个完全不同包中的随意类创建一个活动。

比如我在com.abccompany.activity包中设计了一个Activity类,我的其中一位同事则在com.abccompany.jsonparser包中设计了一个JSON数据解析类。我不希望他随便创建我的Activity并在他想要的时候显示他的JSON数据。

onCreate不是私有的,因为你确实想要对Activity进行子类化,然后使用其超类Activity onCreate方法来创建子类。

实际上,你设计的每个Activity都会扩展android.app.Activity,所以如果在该超类中onCreate是私有的,那么你将无法调用onCreate。


0

你为什么要关心onCreate是否是protected?它被保护是因为逻辑上它不应该被其他与Activities不同的类访问。Android如何启动Activity?有很多种方法可以做到这一点,特别是如果你是设计框架的人,解决方案可能是在构造函数中调用它(一种可能性),或者通过反射以适当的权限等其他机制来调用。

onClick是公共的,因为它可以由不必然是你的Activity的外部类设置或处理。我的意思是,类A可以处理Activity的onClick事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接