0

我目前正在开发一个 android 项目并且我有一个活动,我们称之为 MyActivity,这个活动调用一个名为 MyClass 的标准 Java 类。

我需要 MyClass 来完成 MyActivity 活动,但我不知道如何做到这一点。我想我可能能够将上下文传递给标准 java 类并调用 context.finish() 但这似乎不可用。

我该怎么做,感谢您提供的任何帮助。

4

4 回答 4

2

最安全的解决方案使用侦听器和处理程序。它很复杂,但确保非直接调用完成活动。

你的听众:

interface OnWantToCloseListener{
     public void onWantToClose();
}

应该关闭活动的类。

class MyClass {

    private OnWantToCloseListener listener;

    public void setWantToCloseListener(OnWantToCloseListener listener){
        this.listener = listener;
    }

    private void fireOnWantToClose(){
        if(this.listener != null)
            listener.onWantToClose();
    }
}

当你想关闭你的活动时,你必须调用 fireOnWantToClose() 方法。

public MyActivity extends Activity{

    public void onCreate(){
        final int CLOSE = 1; //number to identify what happens
        MyClass my_class = new MyClass();
        final Handler handler = new Handler(){
             public void handleMessage(Message msg){
                 if(msg.what == CLOSE)
                      MyActivity.this.finish();
             }
        });
        my_class.setOnWantToCloseListener(new OnWantToCloseListener(){
             public void onWantToClose(){
                  handler.sendEmptyMessage(CLOSE);
             }
        });
    }
}

这是安全的,因为 Activity 不是由 MyClass 对象直接完成的,它是通过一个侦听器完成的,该侦听器命令处理程序完成活动。即使您在第二个线程上运行 MyClass 对象,此代码也可以正常工作。

编辑: CLOSE var 添加了我忘记声明和初始化它。

于 2012-06-25T23:35:59.760 回答
2

可以传递Context,但您需要将其转换为Activity(或简单地传递Activity自身),尽管这通常看起来是一种不好的做法。

于 2012-06-25T21:18:22.540 回答
1

MyActivitytoMyClass作为Activity. 从那里你可以打电话myActivity.finish();

例如:

private Activity myActivity;

public MyClass(Activity myActivity){
    this.myActivity = myActivity;
}

public void stopMyActivity(){
    myActivity.finish();
}

并在MyActivity

MyClass myClass = new MyClass(this);

这是有风险的,因为您持有对 an 的引用Activity,这可能会导致内存泄漏。

于 2012-06-25T21:18:29.920 回答
0

如果你的 java 类是一个嵌套的内部类,你可以使用:

public class MyActivity extends Activity {

    public static class JavaClass {    

        public void finishActivity() {
            MyActivity.finish();
        }
    }    
}

否则,您将不得不传递 java 类 a Context(即传递一个对this, since的引用Activity extends Context)并将其存储为私有实例变量。

于 2012-06-25T21:19:53.797 回答