【问题标题】:Android - onPause and onResumeAndroid - onPause 和 onResume
【发布时间】:2015-06-19 13:45:28
【问题描述】:

我有随机绘制红色圆圈的代码。直到我在两个类中都有暂停和恢复方法,它才起作用。如果没有 pause 和 resume 方法,屏幕只会变黑而不会改变。为什么我需要 onPauseonResume 方法,为什么在这两个类中?

注释的代码是所有的暂停/恢复方法。

public class RandomCircles extends Activity {

    MySurfaceView mySurfaceView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurfaceView = new MySurfaceView(this);
        setContentView(mySurfaceView);
    }


 /*   @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        mySurfaceView.onResumeMySurfaceView();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        mySurfaceView.onPauseMySurfaceView();
    }*/

    class MySurfaceView extends SurfaceView implements Runnable{

        Thread thread = null;
        SurfaceHolder surfaceHolder;
        volatile boolean running = false;

        private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        Random random;

        public MySurfaceView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            surfaceHolder = getHolder();
            random = new Random();
        }

        /*public void onResumeMySurfaceView(){
            running = true;
            thread = new Thread(this);
            thread.start();
        }

        public void onPauseMySurfaceView(){
            boolean retry = true;
            running = false;
            while(retry){
                try {
                    thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }*/

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(running){
                if(surfaceHolder.getSurface().isValid()){
                    Canvas canvas = surfaceHolder.lockCanvas();
                    //... actual drawing on canvas

                    int x = random.nextInt(getWidth());

                    if(getWidth() - x < 100)
                        x -= 100;
                    else if(getWidth() - x > getWidth() - 100)
                        x += 100;

                    int y = random.nextInt(getHeight());

                    if(getHeight() - y < 100)
                        y -= 100;
                    else if(getHeight() - x > getHeight() - 100)
                        y += 100;

                    int radius;
                    radius = 100;
                    Paint paint = new Paint();
                    paint.setStyle(Paint.Style.FILL);
                    paint.setColor(Color.WHITE);
                    canvas.drawPaint(paint);
                    // Use Color.parseColor to define HTML colors
                    paint.setColor(Color.parseColor("#CD5C5C"));
                    canvas.drawCircle(x, y, radius, paint);

                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }

    }
}

【问题讨论】:

  • 我怀疑你两者都需要。不过,onResume 是有道理的。这是有道理的,否则你的线程不会启动。我假设您没有编写此代码?
  • 我没有,但我想了解它为什么起作用
  • 所以我开始添加/删除东西,看看会发生什么
  • 你的surfaceview实现Runnable。要运行run 方法,您需要调用它,或者让Thread 为您执行此操作。如果您删除位于onResumeMySurfaceView 中的线程,则它不再执行任何操作...
  • 是的,这就是线程的作用。 docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

标签: android android-activity onresume onpause


【解决方案1】:

前两个onPause()onResume() 方法是Activity 生命周期的一部分,在Activity 暂停/恢复时被调用。

此图说明了 Android Activity 生命周期。你可以阅读它HERE

它与Activity 中的附加onResumeonPause 方法一起使用的原因是因为您从Activity 中的相应方法调用SurfaceView onPauseMySurfaceView()onResumeMySurfaceView() 方法。如果您不这样做,您的 SurfaceView 方法将永远不会被调用,因此永远不会停止/启动线程。

【讨论】:

  • 但是我没有 onDestroy 或 onStop 方法,这些是自动的还是不需要的?
  • 它们在您扩展的 Activity 类中实现。只有在需要使用它们时才覆盖它们
  • 父函数对onResume和onPause做了什么?
  • 他们会做您不必担心的特定于活动的事情。覆盖它们时您需要记住的只是调用 super.onResume();或 super.onPause();这样 Activity 方法仍然被执行
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多