恢复的Android活动
问题描述:
我有一个简单的应用程序,其中,我创建了一个SurfaceView类,然后在主活性,我创建的类的一个对象,然后加入此SurfaceView到的相对布局和内容视图设置为相对布局。恢复的Android活动
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()
方法来处理这个。 我只需要暂停活动或在简历上恢复。无需持久数据。
我应该放什么,在这种情况下,哪些方法?
感谢
答
我想这是你的Panel
那是surfaceview?我看到你正在onDestroy中使用它的线程,但这还不够。你有关于实施onPause()
和onResume()
现在我的想法(没有能够看到所有的代码)正确的直觉是,你不处理与线程正确。在您的Panel类延伸surfaceview你应该有类似这两个函数:
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()
。这可以确保表面视图线程以安全的方式处理。