如何从Application对象调用activity方法finish()?

时间:2013-01-30 10:28:58

标签: android android-context activity-finish

我有一段代码可以删除数据库中的Item。我从两个不同的活动中调用相同的代码。因此,为了避免代码重复,我想将代码转移到Application对象。其中一个活动中的代码如下所示:

private void deleteItem() {
    AlertDialog.Builder alert = new AlertDialog.Builder(Activity1.this);
    alert.setTitle(R.string.confirmTitle);
    alert.setMessage(R.string.confirmMessage);
    alert.setPositiveButton(R.string.delete_btn,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int button) {
                    final DbHelper db = new DbHelper(Activity1.this);
                    AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
                        @Override
                        protected Object doInBackground(Long... params) {
                            db.deleteItem(params[0]);
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object result) {
                            finish();
                        }
                    };
                    deleteTask.execute(new Long[] { rowID });
                }
            });
    alert.setNegativeButton(R.string.cancel_btn, null).show();
}

现在将它放在应用程序对象中,我将函数更改为public,为输入提供了两个参数:Context和rowID。但是在AsyncTask的onPostExecute方法中,我必须关闭活动。在活动中,我通过finish()完成了这个。在这种情况下我该怎么做?我也在应用程序对象中附加了代码。

public void deleteItem(final Context context, final long rowID) {
    AlertDialog.Builder alert = new AlertDialog.Builder(context);
    alert.setTitle(R.string.confirmTitle);
    alert.setMessage(R.string.confirmMessage);
    alert.setPositiveButton(R.string.delete_btn,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int button) {
                    final DbHelper db = new DbHelper(context);
                    AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
                        @Override
                        protected Object doInBackground(Long... params) {
                            db.deleteItem(params[0]);
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object result) {
                            finish();
                            }
                    };
                    deleteTask.execute(new Long[] { rowID });
                }
            });
    alert.setNegativeButton(R.string.cancel_btn, null).show();
}

5 个答案:

答案 0 :(得分:5)

不是将其转移到Application,而是创建BaseActivity(扩展Activity类)类,所有活动都扩展BaseActivity ..并且公共代码将放在BaseActivity中

答案 1 :(得分:4)

Context可以投放到Activity

Activity activity = (Activity) context;

而不仅仅是使用:

activity.finish();

答案 2 :(得分:2)

我认为你要做的事情从根本上说不是一个好主意。

在活动代码之外,无法保证活动仍然存在 - 内存管理器可能已将其清理干净,用户可能已按下Back等。

最终的设计决定取决于您,但我建议您考虑是否真的有必要。

如果能带来更多的程序稳定性和可靠性,我认为有点冗余是可以的。

答案 3 :(得分:1)

简单,添加活动实例

public void deleteItem(final Context context, Activity activity,final long rowID){
activity.finish();
}

答案 4 :(得分:0)

在C#中调用Application.finish()是不可能的。你可以使用这样的方法: Activityname.finish();

这是一个很好的解决方案。 我希望我帮忙。