【问题标题】:Inheritance between activities in AndroidAndroid中Activity之间的继承
【发布时间】:2026-01-05 10:00:01
【问题描述】:

我在将继承的概念应用到 Android 活动时遇到问题 - 例如。 ActivityA extends ActivityActivityB extends ActivityA ,然后如果我使用 ActivityB 启动,则调用 both 活动(A 然后 B)的 onCreate() 方法。

我的问题是,在典型的 Java 中,来自 ActvityA 的 onCreate 应该被覆盖 - 但 onCreate 更像是一个构造函数,即使它是一个函数。继承如何在 Android 中工作,尤其是。 wrt 其他函数,如 onPause()、onResume 等?

编辑:我还注意到 ActivityA 可能在其 onCreate() 中调用了许多抽象方法,其定义在 ActivityB 中提供。这是如何工作的?

【问题讨论】:

  • esp. wrt other state functions ? 请定义那句话。我不明白。
  • +1 好问题。!!

标签: android inheritance android-activity


【解决方案1】:

如果你有你的基本 Activity 然后像这样扩展它 Activity -> Activity A 这意味着当你调用 Activity A 的 onCreate 并且你调用 super.onCreate(); 然后 onCreate() 原始方法Activity 也被调用。

如果您随后将Activity A 扩展为Activity B,则调用会像这样...

Activity B.onCreate() - super.onCreate();-->Activity A.onCreate() - super.onCreate()-->Activity.onCreate().

它不是构造函数,它是一个用于创建Activities 的方法。如果您随后从其他 Activities 扩展它们,则将通过其 super 方法调用其超类。这并不意味着您继承的Activities 也将被创建。 Activity B 将是您创建的Activity

编辑: Android 开发者网站上的This page 非常有用,因为它直观地解释了 Android Activity 生命周期。

【讨论】:

  • 另外我还想指出,onCreate 代替构造函数的原因是,在方向改变时,不应重建对象。
  • 啊.. 我怎么会错过 super.onCreate() 非常感谢,你能否解释一下抽象方法是如何工作的(我已经编辑了问题)
  • @AndroidLearnMachine 你在说什么方法?
  • 我的意思是,ActivityA 中有抽象方法,它们在 ActivityA 的 onCreate() 中调用。这些方法只在ActivityB中定义,这是怎么发生的?它们是使用 ActivityB 中的定义调​​用的吗?
  • 如果您要在 ActivityB 中创建一些方法并在 ActivityB 的 onCreate 方法中调用它们,那么如果您创建了一个 ActivityA Activity(不扩展 ActivityB),那么这些方法将不会被调用。
【解决方案2】:

是的,作为一个典型的 java 函数 onCreate 应该被继承,但它没有得到:为什么? - 因为它不仅仅是一种方法,它是一个生命周期阶段。

AFAIK,Activity 不仅是一个 java 类,而且它是一种特殊类型的 JAVA 类,它有自己的生命周期,生命周期阶段意味着每次使用该类/活动时都会被调用,即使你有声明与否这些方法 onCreate()、onPause() 等肯定会被调用。

所以每次基础活动都会被创建和销毁。这就是它的本性。

如果您对此有疑问,可以尝试使用抽象类、接口和任何其他公共类在您的所有活动中继承公共代码。

【讨论】:

    【解决方案3】:

    继承在 Android 中是如何工作的?

    Android 没有什么特别之处。它完全可以正常工作。

    例子?

    让我们创建一个BaseActivity 来监听BroadcastReceiver (SCAN_RESULTS_AVAILABLE)。
    所以常见的功能是,

    1. onCreate() 中注册BroadcastReceiver
    2. onDestroy() 中注销BroadcastReceiver

    基类:

    public class BaseActivity extends AppCompatActivity{
    
        private WifiScanReceiver wifiScanReceiver; 
    
        @Override
        public void onCreate(Bundle sis)
        {
            super.onCreate(sis);   
            // Don't call setContentView() because no layout is needed              
        }
    
        @Override
        public void onDestroy(){
            super.onDestroy();
            unregisterReceiver(wifiScanReceiver);
        }
    
        private void registerMyReceiver(){
             wifiScanReceiver = new WifiScanReceiver();
             registerReceiver(wifiScanReceiver, new 
             IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
             manager.startScan();
        }
    
    }
    

    儿童班:

    public class BlahBlahActivity extends BaseActivity{
    
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);      // this will call BaseActvity method which will call AppcompatActivty method
            setContentView(R.layout.yourlayout);
        }
    }
    

    【讨论】: