У меня есть домашнее действие, которое запускает несколько других действий для результатов при нажатии кнопки, например
**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 имеет SurfaceView в своем макете, который называетсяFirstSurfaceView, который присоединяется в начале через макет 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 мыши и воспроизводит звук, называемый ударом, и обновляет действие, которому принадлежит вид поверхности
**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 (), два журнала и т. Д.
Не уверен, как поступить, чтобы заставить это работать ... Любая помощь приветствуется.