当我关闭我的应用程序时,为什么我的Android应用程序活动会重新打开

时间:2012-09-09 14:39:28

标签: java android android-intent android-activity

我一直试图解决这个问题一段时间了,我确信有一种方法可以解决这个错误/问题,但我还没有找到。

我遇到的问题是,一旦我通过后退按钮或主页按钮退出应用程序,它就会关闭,但之后会重新打开我之前打开的一项活动。

按下其中一个按钮后,是否需要关闭我的活动?我将如何处理这些活动。

以下是我的主要活动的代码,用于打开我的其他活动......

package com.togdem.tunnels;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class TunnelsActivity extends Activity
{

int vo = 2;
String mla = "";

public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    ImageView p_btn = (ImageView) findViewById(R.id.imageView1);

    p_btn.setOnTouchListener(new OnTouchListener()
    {

        public boolean onTouch(View view, MotionEvent event)
        {

        Intent myIntent2 = new Intent(view.getContext(), Cgt.class);

            startActivity(myIntent2);

            return false;

        }

    });

    SeekBar skb = (SeekBar) findViewById(R.id.seekBar1);

    try {

        InputStream in = openFileInput("sa.txt");
        if (in != null) {
            InputStreamReader input = new InputStreamReader(in);
            BufferedReader buffreader = new BufferedReader(input);

            mla = "";

            String line = new String();

            line = buffreader.readLine();

            mla += line;

            Toast msg = Toast.makeText(getBaseContext(), "Loaded Saved Data", Toast.LENGTH_LONG);
            msg.show();

            in.close();

            skb.setProgress(Integer.parseInt(mla.toString()));

        }
        else{}

    } catch(Exception e){}

    skb.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
    {

        public void onProgressChanged(SeekBar event, int value, boolean sb)
        {

            vo = value;

        }

        public void onStartTrackingTouch(SeekBar event)
        {



        }

        public void onStopTrackingTouch(SeekBar event)
        {

            try
            {

                OutputStreamWriter out = new OutputStreamWriter(openFileOutput("sa.txt", 0));
                out.write(Integer.toString(vo));
                out.close();

            } catch (IOException e)
            {



            }

            Toast msg = Toast.makeText(getBaseContext(), "Set Sensitivity to: " + Integer.toString(vo), Toast.LENGTH_LONG);
            msg.show();

        }

    });

}

}

这是我试图打开的活动的代码......

package com.togdem.tunnels;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Cgt extends Activity
{

public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);

    setContentView( R.layout.cgame );

    ImageView btn1 = (ImageView) findViewById(R.id.btn_c);

    ImageView btn2 = (ImageView) findViewById(R.id.btn_h);

    btn1.setOnTouchListener(new OnTouchListener()
    {

        public boolean onTouch(View view, MotionEvent event)
        {

            try
            {
                OutputStreamWriter out = new OutputStreamWriter(openFileOutput("spd.txt", 0));

                out.write("4");
                out.close();

            } catch (java.io.IOException e) {}

            Intent myIntent = new Intent(view.getContext(), TunnelsSpA.class);

            myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

            startActivity(myIntent);

            finish();

            return false;

        }

    });

    btn2.setOnTouchListener(new OnTouchListener()
    {

        public boolean onTouch(View view, MotionEvent event)
        {

            try
            {
                OutputStreamWriter out = new OutputStreamWriter(openFileOutput("spd.txt", 0));

                out.write("6");
                out.close();

            } catch (java.io.IOException e) {}

            Intent myIntent = new Intent(view.getContext(), TunnelsSpA.class);

            myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

            startActivity(myIntent);

            finish();

            return false;

        }

    });

}

public boolean onKeyDown(int KeyCode, KeyEvent event)
{

    if (KeyCode == KeyEvent.KEYCODE_BACK);
    {

        onStop();

    }

    if (KeyCode == KeyEvent.KEYCODE_HOME);
    {

        onStop();

    }

    return super.onKeyDown(KeyCode, event);

}

protected void onStop()
{

    finish();
    Log.d("Stopping...", "Stopping the activity");

}

}

感谢您提供任何帮助,

3 个答案:

答案 0 :(得分:2)

您的应用程序位于Stopped State ... 活动(您的应用活动)被另一个ForeGround活动隐藏...

当{strong>需要记忆时,System可以杀死此Activity ..或者可以通过调用{{1}来杀死 }或finish()

答案 1 :(得分:2)

您似乎遇到了一些基本的Android行为问题。

首先,当用户按下HOME按钮时,他不是退出您的应用程序,他只是将您的应用程序放在后台,以便他可以去做其他事情。如果他这样做,他不希望你的申请退出。事实上,当他回到你的应用程序时,他希望找到它与他离开时的状态完全相同。这是标准的Android行为,除非你有充分的理由,否则你不应该改变它。

其次,当用户按下BACK按钮时,Android会自动完成当前活动并返回活动堆栈中的上一个活动。这是标准的Android行为,您无需编写任何特殊内容即可实现此目的。

通过查看您的代码,您可以使用活动TunnelsActivity来启动活动CgtTunnelsActivityfinish()启动Cgt时不会调用TunnelsActivity,因此当活动正在运行时,活动堆栈底部会显示Cgt,而顶部会Cgt 。在onStop()中,您正在捕捉BACK按钮和HOME按钮并调用onStop()。这绝对是错误的。你永远不应该致电onStop()。在某些情况下,Android将onStop()称为活动生命周期的一部分。致电onStop()不会让您的活动消失,也不会让您的申请退出。它所做的就是混淆Android。此外,当Android调用super.onStop()时,它希望代码调用代码未执行的onStop()。这将导致代码抛出异常,这可能是您看到活动重新启动的原因。

我建议您删除onKeyDown()方法并删除{{1}}方法。这可以解决你所有的问题。

答案 2 :(得分:0)

仅用于退出应用程序 System.exit(0);

不使用finish();