Android 将活动实例传递给类可以吗?

Android 将活动实例传递给类可以吗?,android,performance,android-layout,Android,Performance,Android Layout,在一个场景中,我需要将活动及其按钮传递给java类 我做到了以下几点,而且效果很好,我只关心它是否是整合这一点的正确方式 main活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button= findViewById(R.id.btn)

在一个场景中,我需要将活动及其按钮传递给java类

我做到了以下几点,而且效果很好,我只关心它是否是整合这一点的正确方式

main活动

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

    button= findViewById(R.id.btn);

    UIComponents uiComponents= new UIComponents();
    uiComponents.setActivity(this, button);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.d("result", String.valueOf(requestCode));
}
UIComponents.class

public class UIComponents {

    public void setActivity(final AppCompatActivity activity, Button btn){

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent= new Intent(activity, ResultActivity.class);
               activity.startActivityForResult(intent, 999);
            }
        });

    }

这工作得非常好,它在我的活动屏幕上显示
toast
消息,并且我能够收到活动结果的
onActivityResult
回调。我担心这是否会导致任何与性能相关的问题。

您只需按下按钮,然后使用可用的getContext方法,例如

public class UIComponents {

public void setActivity(Button btn){
    Context activity = btn.getContext();
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent= new Intent(activity, ResultActivity.class);
           activity.startActivityForResult(intent, 999);
        }
    });

}

<> P>这里考虑的最重要的事情是组件的生命周期。一般来说,您不应该将对活动的引用传递给任何可能比它更长寿的对象。从理论上讲(可能在后面),从用户单击按钮到执行
OnClickListener
(如果它还没有被垃圾收集)之间,您的活动可能会被终止,您将得到
NullPointerException
。此外,您可能会(甚至意外地)将UIComponents传递给具有不同生命周期的其他对象

这种情况下的最佳实践通常是使用体系结构。除其他地方外,还介绍了处理按钮点击的具体情况


此外,遵循Google的“”可能是个好主意。

谢谢@SirCodesalot,我还在界面中添加了另一个方法,名为
clearData
,我在活动的onDestory()中调用它,它将活动和按钮引用设置为
null
。我在我的应用程序中使用MVP模式,但我这样做是为了单点登录。很高兴提供帮助。您不应该依赖onDestroy,因为它通常不会被调用。请看这里: