Как я могу закрывать app с класса?

Я пробую закрывать app.

У меня есть ошибка в конце кода (линия прокомментирована):

public class VistaJuego extends SurfaceView {
  private Rect playerr;
  private Rect rectangleObject;
  private Rect obsr;

  private int ySuelo;
  private int anchoPantalla;
  private boolean isFirstDraw = true;
  Paint paint = new Paint();

  HiloJuego hiloJuego;
  private SurfaceHolder holder;

  public static int globalxSpeed = 15;

  Bitmap playerbmp;
  Bitmap coinbmp;
  Bitmap canionbmp;
  Bitmap bloquebmp;
  Bitmap nubebmp;
  Bitmap suelobmp;

  private List < ObjetoJuego > listaObjetos = new ArrayList < ObjetoJuego > ();
  private List < Player > player = new ArrayList < Player > ();
  private List < Suelo > listaSuelo = new ArrayList < Suelo > ();

  public static int coinsCollected = 0;
  public static int score = 0;
  public static int highScore = 6000;

  public VistaJuego(Context context) {
    super(context);

    hiloJuego = new HiloJuego(this);

    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {
      @Override
      public void surfaceCreated(SurfaceHolder arg0) {
        hiloJuego.setRunning(true);
        hiloJuego.start();

      }

      @Override
      public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

        score += 5;

        if (score > highScore) {
          highScore = score;
        }

      }

      @Override
      public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

      }
    });

    playerbmp = BitmapFactory.decodeResource(getResources(), R.mipmap.mario);
    coinbmp = BitmapFactory.decodeResource(getResources(), R.mipmap.coins);
    canionbmp = BitmapFactory.decodeResource(getResources(), R.mipmap.canions);
    bloquebmp = BitmapFactory.decodeResource(getResources(), R.mipmap.bloque);
    nubebmp = BitmapFactory.decodeResource(getResources(), R.mipmap.nube);
    suelobmp = BitmapFactory.decodeResource(getResources(), R.mipmap.suelo);

    /*CARGANDO A MARIO*/
    player.add(new Player(this, playerbmp, 50, 50));

    /* AÑADIENDO MONEDAS */
    listaObjetos.add(new Coin(this, coinbmp, 400, 900));
    listaObjetos.add(new Coin(this, coinbmp, 250, 800));
    listaObjetos.add(new Coin(this, coinbmp, 1000, 850));
    listaObjetos.add(new Coin(this, coinbmp, 1600, 800));
    listaObjetos.add(new Coin(this, coinbmp, 1700, 850));
    listaObjetos.add(new Coin(this, coinbmp, 1800, 850));
    listaObjetos.add(new Coin(this, coinbmp, 1900, 550));
    listaObjetos.add(new Coin(this, coinbmp, 2100, 900));
    listaObjetos.add(new Coin(this, coinbmp, 2300, 850));
    listaObjetos.add(new Coin(this, coinbmp, 3000, 850));
    listaObjetos.add(new Coin(this, coinbmp, 3100, 850));
    listaObjetos.add(new Coin(this, coinbmp, 3200, 850));
    listaObjetos.add(new Coin(this, coinbmp, 3400, 900));
    listaObjetos.add(new Coin(this, coinbmp, 3500, 800));
    listaObjetos.add(new Coin(this, coinbmp, 4000, 850));
    listaObjetos.add(new Coin(this, coinbmp, 4100, 850));
    listaObjetos.add(new Coin(this, coinbmp, 4500, 900));
    listaObjetos.add(new Coin(this, coinbmp, 4800, 900));
    listaObjetos.add(new Coin(this, coinbmp, 5000, 800));
    listaObjetos.add(new Coin(this, coinbmp, 5500, 800));
    listaObjetos.add(new Coin(this, coinbmp, 5600, 850));
    listaObjetos.add(new Coin(this, coinbmp, 5700, 850));
    listaObjetos.add(new Coin(this, coinbmp, 7500, 900));
    listaObjetos.add(new Coin(this, coinbmp, 7800, 900));
    listaObjetos.add(new Coin(this, coinbmp, 7900, 800));
    listaObjetos.add(new Coin(this, coinbmp, 9000, 800));
    listaObjetos.add(new Coin(this, coinbmp, 9600, 850));
    listaObjetos.add(new Coin(this, coinbmp, 9800, 850));
    listaObjetos.add(new Coin(this, coinbmp, 10000, 900));
    listaObjetos.add(new Coin(this, coinbmp, 10100, 900));
    listaObjetos.add(new Coin(this, coinbmp, 10300, 800));

    /*AÑADIENDO CAÑONES*/
    listaObjetos.add(new Canion(this, canionbmp, 2300, 800));
    listaObjetos.add(new Canion(this, canionbmp, 2600, 900));
    listaObjetos.add(new Canion(this, canionbmp, 2900, 950));
    listaObjetos.add(new Canion(this, canionbmp, 4000, 800));
    listaObjetos.add(new Canion(this, canionbmp, 4500, 900));
    listaObjetos.add(new Canion(this, canionbmp, 5500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 6000, 950));
    listaObjetos.add(new Canion(this, canionbmp, 6500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 7000, 700));
    listaObjetos.add(new Canion(this, canionbmp, 7200, 800));
    listaObjetos.add(new Canion(this, canionbmp, 7500, 900));
    listaObjetos.add(new Canion(this, canionbmp, 8000, 700));
    listaObjetos.add(new Canion(this, canionbmp, 8500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 8000, 950));
    listaObjetos.add(new Canion(this, canionbmp, 9500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 10000, 700));
    listaObjetos.add(new Canion(this, canionbmp, 10500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 10800, 950));
    listaObjetos.add(new Canion(this, canionbmp, 11500, 800));
    listaObjetos.add(new Canion(this, canionbmp, 11800, 950));
    listaObjetos.add(new Canion(this, canionbmp, 12000, 800));

    /*AÑADIENDO BLOQUES*/
    listaObjetos.add(new Bloque(this, bloquebmp, 500, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 600, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 700, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 1200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 1300, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 1400, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 2000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 2100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 2200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 5000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 5100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 5200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 6000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 6100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 6200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 7000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 7100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 7200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 9000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 9100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 9200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 11000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 11100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 11200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 15000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 15100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 15200, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 18000, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 18100, 850));
    listaObjetos.add(new Bloque(this, bloquebmp, 18200, 850));

    /*AÑADIENDO NUBES*/
    listaObjetos.add(new Nube(this, nubebmp, 100, 200));
    listaObjetos.add(new Nube(this, nubebmp, 150, 300));
    listaObjetos.add(new Nube(this, nubebmp, 180, 250));
    listaObjetos.add(new Nube(this, nubebmp, 190, 250));
    listaObjetos.add(new Nube(this, nubebmp, 1000, 250));
    listaObjetos.add(new Nube(this, nubebmp, 1400, 100));
    listaObjetos.add(new Nube(this, nubebmp, 1420, 100));
    listaObjetos.add(new Nube(this, nubebmp, 1440, 100));
    listaObjetos.add(new Nube(this, nubebmp, 1500, 250));
    listaObjetos.add(new Nube(this, nubebmp, 1550, 100));
    listaObjetos.add(new Nube(this, nubebmp, 1600, 100));
    listaObjetos.add(new Nube(this, nubebmp, 1700, 250));
    listaObjetos.add(new Nube(this, nubebmp, 2000, 100));
    listaObjetos.add(new Nube(this, nubebmp, 2320, 100));
    listaObjetos.add(new Nube(this, nubebmp, 2440, 100));
    listaObjetos.add(new Nube(this, nubebmp, 2500, 250));
    listaObjetos.add(new Nube(this, nubebmp, 2550, 100));
    listaObjetos.add(new Nube(this, nubebmp, 2700, 100));
    listaObjetos.add(new Nube(this, nubebmp, 3000, 100));
    listaObjetos.add(new Nube(this, nubebmp, 3200, 250));
    listaObjetos.add(new Nube(this, nubebmp, 3550, 100));
    listaObjetos.add(new Nube(this, nubebmp, 3700, 100));
    listaObjetos.add(new Nube(this, nubebmp, 3900, 100));

    this.paint.setColor(Color.WHITE);
  }

  public boolean onTouchEvent(MotionEvent event) {

    player.get(0).ontouch();

    return false;
  }

  private void firstDraw(Canvas canvas) {
      this.ySuelo = this.getHeight() - 64;
      this.anchoPantalla = this.getWidth();

      this.isFirstDraw = false;
    }
    /******************************************************  
    public void finJuego(){
           Intent intent = new Intent(getContext(),FinJuego.class);
           getContext().startActivity(intent);
       }**********************************************************/

  public void aniadirSuelo() {
    listaSuelo.add(new Suelo(this, suelobmp, 0, 0));
  }

  public void update() {
    score += 5;

    if (score > highScore) {
      highScore = score;
    }
  }

  protected void onDraw(Canvas canvas) {
    /* if (this.isFirstDraw) {
            firstDraw(canvas);
        }
    */
    update();
    canvas.drawColor(Color.CYAN);
    aniadirSuelo();

    Paint textpaint = new Paint();
    textpaint.setTextSize(40);
    canvas.drawText("Score: " + (toString().valueOf(score)), 0, 40, textpaint);
    canvas.drawText("High Score: " + (toString().valueOf(highScore)), 0, 80, textpaint);
    canvas.drawText("Coins: " + (toString().valueOf(coinsCollected)), 0, 120, textpaint);

    player.get(0).onDraw(canvas);

    ObjetoJuego objeto;
    playerr = player.get(0).GetBounds();

    for (Suelo ssuelo: listaSuelo) {
      ssuelo.onDraw(canvas);
    }

    for (int i = 0; i < listaObjetos.size(); i++) {
      objeto = listaObjetos.get(i);
      objeto.onDraw(canvas);
      rectangleObject = objeto.GetBounds();

      if (objeto.comprobarColision(playerr)) {
        if (objeto instanceof Coin) {
          /*objeto.ocultar();*/
          listaObjetos.remove(i);
          score += 500;
          coinsCollected += 1;
        } else if (objeto instanceof Bloque) {
          /* objeto.ocultar();*/
          listaObjetos.remove(i);
        } else if (objeto instanceof Canion) {
          //EL ERROR ESTÁ AQUÍ!! --->       finJuego();
        }
      }
    }
  }
}
3
задан 24.01.2017, 00:48
0 ответов

Чтобы заканчивать приложение с класса, который Activity главный он осуществляется просто с методом:

finish ();

Если ты внутри одного Fragment и Activity что это содержит, - главное, ты можешь называть метод finish () с Fragment.

getActivity () .finish ();

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

К счастью в настоящее время имеется метод finishAffinity (), который добавила в API 16, и который позволяет нам заканчивать всех Activities

finishAffinity () Закончите эту активность также как и всю активность немедленно под нею в настоящем задании, которое у них есть то же сходство.

Относительно класса, который ты комментируешь в твоем вопросе, это различный случай, так как этот класс не увеличивает Activity или Fragment, то, что ты можешь реализовывать в этом случае, является следующим, создавать статический метод, чтобы получать инстанцию Activity:

public static MainActivity thisActivity;

    public MainActivity() {
        thisActivity = this;
    }
    public static MainActivity getInstance() {
        return thisActivity;
    }

и в твоем классе называть этот метод и в то же время звонить finishAffinity ():

 MainActivity.getInstance().finishAffinity();

С этим тебе удастся закрыть приложение.


Я не рекомендую использование

System.exit(0);

Так как он возобновляет приложение с минус одной активностью в батарейке. Например, если он звонит ActivityB ActivityA и System.exit(0) он называется в ActivityB, тогда приложение будет удалено и начнется немедленно только одним типом активности ActivityA, однако это не решило бы закрывать все приложение.

Я не рекомендую использование:

android.os.Process.killProcess(android.os.Process.myPid());

Это может не функционировать в нескольких операционных системах, я это использовал, чтобы закрывать приложения, несшие в Blackberry 10 +, где оно функционирует без проблемы.

2
ответ дан 03.12.2019, 17:31

Теги

Похожие вопросы