例如,我有一个家庭活动,它会启动其他一些活动来获得按钮按下时的结果
**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()调用,两次日志,等等
不确定如何继续进行此操作...感谢您的帮助。