Завершите Activity () из отдельного myJavaClass.java - PullRequest
4 голосов
/ 02 апреля 2012

Я испробовал почти все решения SO, но безуспешно: (.

У меня есть простой myJavaClass.java с парой функций.

Одна из функций в myJavaClass: startActivity () запускает MyCustomActivity

public startActivity(Context context)
{
    Intent intent = new Intent(context, MyCustomActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_SINGLE_TOP);
    context.startActivity(intent);

}

Это запускает MyCustomActivity (), как и ожидалось.

Теперь у меня есть другая функция в myJavaClass.java для закрытия / завершения MyCustomActivity, но она не может этого сделать!

Я пытался

  1. Создание MyCustomActivity SingleTop в манифесте и создание действия с помощью намерения, как указано выше

  2. Передача экземпляра действия «this» в onCreate () MyCustomActivity и вызов MyCustomActivity.activity.finish () из myJava.class, но это также не работает

Пожалуйста, помогите мне. Я застрял здесь на несколько часов. Я знаю, что решение очень простое и концептуальное, но я новичок. Просто создаем концепции Java / Android!

EDIT

MyCustomActivity

public Activity activity;

OnCreate()
{
    ...
    this = activity;
}

MyJavaClass

public closeActivity(Context context)
{

        Activity customActivity = MyCustomActivity.activity;
        customActivity.finish();
}

Ответы [ 3 ]

7 голосов
/ 02 апреля 2012

Я думаю, что то, что вы пытаетесь сделать, в корне плохое. Для начала, вне кода Activity, нет никаких гарантий, что активность все еще существует - менеджер памяти, возможно, очистил ее, пользователь мог нажать Back и т. Д. Думайте о Activity как о независимых объектах - вы можете запустить их, и вы можете получить результат обратно, когда они закончат то, что делают, но это все.

Подумайте, действительно ли вам нужно программно закрыть действие извне - я бы сказал, что это необычный дизайн, но есть обстоятельства, когда это может быть уместно.

Если это так, то я думаю, что вам нужна система публикации / подписки, в которой MyCustomActivity может зарегистрировать прослушиватель в MyJavaClass, а затем получить обратный вызов, после чего он может сам "завершить".

public Activity activity implements FinishListener
{
  public void onCreate(...)
  {
      //where does MyJavaClass come from? see in a minute
      MyJavaClass myjava = getMyJavaclass();

      myJava.addFinishListener( this );
  }

  public void onFinishCallback()
  {
      this.finish();
  }
}

и

   public class MyJavaClass
   {
      private List<FinishListener> finishListeners = ...;

      public void addFinishListener( FinishListener fl )
      {
         this.finishListeners.add(fl);
      }

      public closeActivity(Context context)
      {
         for ( FinishListener fl : finishListeners )
         {
            fl.onFinishCallback();
         }
      }
   }

и

   public interface FinishListener
   {
       void onFinishCallback();
   }

Теперь единственной оставшейся проблемой является то, как получить MyJavaClass из Activity. Это зависит от вас - вы, возможно, уже знаете, как, вы можете поместить его в реализацию приложения, это может быть одиночный (плохой), слушатели могут быть статическими (плохими) или различными другими вариантами.

О, и не забудьте снова удалить слушателя в методе Activity onDestroy()!

2 голосов
/ 02 апреля 2012

вы не можете завершить действие из другого класса, пока у вас не будет ссылки на экземпляр Activity в этом классе, дать ссылку в этом классе и вызвать метод finish (), чтобы остановить действие.

activity.finish();
2 голосов
/ 02 апреля 2012

Просто попробуйте это ...

public closeActivity(Activity _activity)
{
      _activity.finish();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...