Абстрактный класс расширяет несколько видов деятельности Java и Android

Я новичок в программировании на Java и Android. Я только что создал простое приложение с формой входа и формой регистрации. Моя форма входа и форма регистрации работает прямо сейчас. Я создал абстрактный класс SignedActivity, который расширяется от класса Activity. Я хочу, чтобы каждое действие, которое доступно после входа в систему, наследовало от SignedActivity. Если активность наследует от SignedActivity, я могу быть уверен, что она доступна только для подписанных пользователей.

Вот как выглядит SignedActivity:

public abstract class SignedActivity extends Activity {

public static String LOG_OUT_PATH = "/logOut.php";

private String sessionId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        String newSessionId = savedInstanceState.getString("sessionId");
        if (newSessionId instanceof String) {
            sessionId = newSessionId;
            return;
        }
    }
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String newSessionId = extras.getString("sessionId");
        if (newSessionId instanceof String) {
            sessionId = newSessionId;
            return;
        }
    }

    finish();
}

public void startSignedActivity(Intent intent) {
    intent.putExtra("sessionId", getSessionId());
    this.startActivity(intent);
}

protected String getSessionId() {
    return sessionId;
}

private void setSessionId(String newSessionId) {
    sessionId = newSessionId;
}

protected void logOut() {
    new RequestLogOutTask().execute(SignedActivity.LOG_OUT_PATH);
    setSessionId("");
    Intent intent = new Intent(this, SignInActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("logOut", true);
    startActivity(intent);
}

public void onClickLogOut(View v) {
    logOut();
}

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString("sessionId", sessionId);
    super.onSaveInstanceState(savedInstanceState);
}

class RequestLogOutTask extends AsyncTask<String, Void, Void> {
    protected Void doInBackground(String... params) {
        (new RESTClient(Constants.REST_URL)).post(params[0], "");
        return null;
    }
}

}

Моя проблема в том, что мне иногда требуется FragmentActivity вместо Activity после входа в систему. Поэтому я должен создать SignedFragmentActivity, которое расширяется от FragmentActivity и в основном совпадает с SignedActivity (отличается только родитель). Итак, у меня есть дубликат кода - как его избежать?

1 ответ

Решение

Вы можете переместить SignedActivity код для ActivityHelper учебный класс:

class ActivityHelper {
    public static String initializeSessionId(Bundle savedInstanceState, Activity activity) {
        if (savedInstanceState != null) {
            String newSessionId = savedInstanceState.getString("sessionId");
            if (newSessionId instanceof String) {
                return newSessionId;
            }
        }
        Bundle extras = activity.getIntent().getExtras();
        if (extras != null) {
            String newSessionId = extras.getString("sessionId");
            if (newSessionId instanceof String) {
                return newSessionId;
            }
        }
        return null;
    }

    ...
}

Теперь вы можете использовать его в каждом Activity экземпляр (то есть FragmentActivity):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    sessionId = ActivityHelper.initializeSessionId(savedInstanceState, this);

    finish();
}
...
Другие вопросы по тегам