2014-01-05 4 views
0

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

Вот как выглядит 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 вместо активность после входа в систему. Поэтому я должен создать SignedFragmentActivity, который простирается от FragmentActivity, и он в основном такой же, как SignedActivity (только родительский). Итак, у меня есть дубликат кода - как его избежать?

+1

Добро пожаловать в удивительный мир Android и одного наследование! :) – Natix

+0

Единственное наследование устраняет множество сложных проблем. Наслаждайтесь композицией над наследованием (которая обычно делает лучший дизайн в любом случае), и вы будете в порядке. –

ответ

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(); 
} 
... 
+0

Это хороший ответ, я буду использовать его. Но мне все же приходится создавать методы startSignedActivity(), logOut(), onClickLogOut(), onSaveInstanceState() и переменной sessionId в каждом действии, которые отображаются только после входа в систему. Это позор. – 1daemon1

+0

Вы можете переместить 'sessionId' и все связанные с ним методы в новый класс, скрывая реализацию и предоставляя API для инициализации, восстановления и уничтожения сеанса. Затем вам просто нужно вызвать соответствующие методы из ваших действий. – hoaz

+0

Я попробую. Спасибо за советы;). – 1daemon1