恢复Android活动

时间:2012-07-24 04:28:15

标签: android onresume

我有一个简单的应用程序,我创建了一个SurfaceView类,然后在main活动中,我创建了一个类的对象,然后将此SurfaceView添加到相对布局,并将内容视图设置为相对布局。 / p>

package com.my.game;
import com.google.ads.Ad;
import com.google.ads.AdListener;
import com.google.ads.AdRequest;
import com.google.ads.AdRequest.ErrorCode;
import com.google.ads.AdSize;
import com.google.ads.AdView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.RelativeLayout;

public class ShootLetters extends Activity {

    private Panel panel;
    private int newWidth;
    private int newHeight;

    private AdView adView;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bitmap bg = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.shooting_background);
        ;

        int width = bg.getWidth();
        int height = bg.getHeight();

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        newWidth = metrics.widthPixels;

        newHeight = metrics.heightPixels;
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        Bitmap resizedBackGround = Bitmap.createBitmap(bg, 0, 0, width, height,
                matrix, false);

        Window win = getWindow();
        Drawable d = new BitmapDrawable(resizedBackGround);
        win.setBackgroundDrawable(d);

        panel = new Panel(this, newWidth, newHeight);

        panel.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    panel.setClickX(event.getX());
                    panel.setClickY(event.getY());
                }
                return true;
            }

        });

        adView = new AdView(this, AdSize.BANNER, "admobidxxx222");

        RelativeLayout rl = new RelativeLayout(this);
        rl.addView(panel);
        rl.addView(adView);

        setContentView(rl);

        // Initiate a generic request to load it with an ad
        adView.loadAd(new AdRequest());
    }

    @Override
    public void onDestroy() {
        if (adView != null) {
            adView.destroy();
        }
        panel.stopThread();
        panel = null;

        super.onDestroy();
    }

}

这适用于启动和停止应用程序。

问题是当另一个活动出现在这个活动之上时,它会以不稳定的方式运行(在这个阶段不需要细节,因为有时它会崩溃,有时它会与缺少的布局对象一起工作)。

我读到我应该实施onPause()&处理此问题的onResume()方法。 我只需要暂停活动或在恢复时恢复活动。不需要持久数据。

在这种情况下,我应该采用哪种方法?

由于

1 个答案:

答案 0 :(得分:1)

我猜你的Panel是表面视图吗?我看到你正在使用onDestroy中的线程做一些事情,但这还不够。你有一个关于实现onPause()onResume()的正确预感现在我的想法(无法看到你的所有代码)是你没有正确处理线程。在扩展surfaceview的Panel类中,你应该有类似这两个函数的东西:

    public void pause(){
        Loop = false;
        while (true){
            try{
                panelThread.join();//end it
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            break;
        }
        panelThread = null;
    }
    public void resume(){
        Loop = true;
        panelThread = new Thread(this);
        panelThread.start();
    }

如果您未在run()方法中使用循环,请忽略循环部分。

然后,在您的活动的onPause()onResume()方法中,您分别调用panel.pause()panel.resume()。这样可以确保以安全的方式处理表面视图线程。

相关问题