【问题标题】:Getting instance of MainActivity获取 MainActivity 的实例
【发布时间】:2018-03-11 07:47:34
【问题描述】:

您好,我是 android 新手,还在学习中。我的问题是,例如我有一个在 MainActivity 中创建的方法,我需要从另一个类中调用它。

获取 MainActivity 的实例以便我可以从另一个类调用 MainActivity 中的方法是一种好习惯吗?

这是一个例子:

public class MainActivity extends AppCompatActivity {

   private static MainActivity inst;

public static MainActivity instances()
{
    return inst;
}

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


public void showToast (String text){
    Toast.makeText(inst, text, Toast.LENGTH_SHORT).show();
}

那么这是另一个类:

public class broadcastReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

  MainActivity instance = new MainActivity();

 instance.showToast(AnyText);
    }
}

我在看教程时看到了这种类型的编码,想知道这是否是一种好的做法,或者可能有更好的方法?因为我收到不要将 Android 上下文类放在静态类中

的警告

提前感谢您提供任何见解或帮助! :D

【问题讨论】:

  • 我认为你可以使用MainActivity instance = new MainActivity();在任何你想要的地方直接创建实例,不需要使用任何方法返回任何类的实例。
  • Get activity instance的可能重复

标签: android


【解决方案1】:

我猜你想做一个单例的 Activity 类

但在所有模式设计中提及

使用单例

当且仅当它是创建全局变量的唯一方法

单例基于延迟初始化和内存加载

所以我猜如果你不能与 Activiy 交互,你可以使用

广播意图

【讨论】:

    【解决方案2】:

    你可以像这样调用另一个类的方法:

    MainActivity instance = new MainActivity();
    String data = instance.data();
    

    并在该类中创建数据方法:

    public String data() {
        return mangaId;
    }
    

    【讨论】:

      【解决方案3】:

      获取 MainActivity 的实例是一种好习惯吗? 我也许可以从另一个调用 MainActivity 中的方法 上课?

      您完全可以做到这一点,但您不需要将其设为静态并使用构造函数。只需像下面这样创建一个新实例,您就可以访问公共方法

      MainActivity mainActivity = new MainActivity();
      mainActivity.showToast(text);
      

      关于警告

      它建议避免将上下文字段定义为静态。警告本身解释了原因:这是内存泄漏。如果您将其设为静态,它将可以在您的应用程序中的任何位置访问,并且某些方法可以在很长时间内保持对此上下文的引用,并且不会被垃圾收集。这将导致内存不足异常并且应用程序可能会崩溃。但是在这里你试图从广播接收器调用showToast(),这样你就可以摆脱静态引用。如果您将来需要它们,您可以安全地注入上下文

      【讨论】:

        【解决方案4】:

        您不能使用new 运算符创建Activity 的实例。

        您必须使用Intent 才能创建活动。

        因此,您无法获得对活动实例的引用。

        您可以使用的活动类的唯一方法是静态方法。

        【讨论】:

          猜你喜欢
          • 2016-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          相关资源
          最近更新 更多