为什么活动结束后我的表面视图没有被破坏?

时间:2018-10-01 03:12:03

标签: java android surfaceview

例如,我有一个家庭活动,它会启动其他一些活动来获得按钮按下时的结果

**HomeActivity.class**

Intent firstIntent = new Intent(getBaseContext(), FirstLevelActivity.class);
startActivityForResult(firstIntent, 0);

**HomeActivity.class**

Intent secondIntent = new Intent(getBaseContext(), SecondLevelActivity.class);
startActivityForResult(secondIntent, 1);

FirstLevelActivity类在其布局中具有一个名为FirstSurfaceView的SurfaceView,该表面通过xml布局从一开始就被附着

**FirstLevelActivity.class**

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_level);
    ...

它在XML布局文件中

**activity_first_level.xml**

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.blah.FirstLevelSurfaceView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/firstLevelSurfaceView" />
        ...

firstLevelSurfaceView在更新绘制方法的线程上运行。

在firstLevelSurfaceView上也有一个触摸处理程序,它报告鼠标的x和y并播放称为“击中”的声音,并更新Surfaceview所属的活动

**FirstLevelSurfaceView**

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        float x = event.getX();
        float y = event.getY();
        Log.i(TAG, "x = " + x);
        Log.i(TAG, "y = " + y); 
        hit.play();
        Intent intent = new Intent("update_activity");
        intent.putExtra("update_score", 123);
      LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
    }
}

此更新确定活动是应该继续进行还是结束,因此,是否结束该活动的游戏

**FirstLevelActivity.class**

private BroadcastReceiver createBroadcastReceiver() {
    return new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch(intent.getAction()) {
                case "update_activity" :
                    // do some calculation to determine whether end game
                    // ok we've reached end game
                    endGame();
                    break;
            }
        }
    }
}

endGame {
    Intent returnIntent = getIntent();
    setResult(Activity.RESULT_OK, returnIntent);
    finish();       
}

首页活动已通知FirstLevelActivity已结束

**HomeActivity.class**

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 0) {
        if(resultCode == Activity.RESULT_OK){
            Log.i(TAG, "FirstLevelAtivity Returned Result OK");
        }
    } else if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            Log.i("Bond", "SecondLevelActivity Returned Result OK");
        }
    } 
}

我将每个级别作为自己的唯一活动,并在唯一线程上运行自己的唯一SurfaceView。

我的问题是,如果用户启动SecondLevelActivity(或再次启动FirstLevelActivity,或任何其他* LevelActivity),则表面视图将重复。因此,当我启动第二个活动时,每个屏幕触摸都会在控制台中发生两次hit.play()调用,两次x记录和y记录。然后,当我开始另一个活动时,有三个hit.play()调用,三个x的日志和y的三个日志,依此类推。我不明白为什么会这样。

最初,我只有一个活动,一个普通的LevelActivity,一个普通的LevelSurfaceView,一个普通的LevelThread,以及一个包含所有关卡数据的静态对象,以及一个用来计算玩家所处级别的计数器,以及当玩家加载活动时,它将获取当前级别以及图像和声音。但是问题仍然存在。两次hit.play()调用,两次日志,等等

不确定如何继续进行此操作...感谢您的帮助。

0 个答案:

没有答案