2013-08-13 6 views
5

저는 앱 구조와 함께 오래 동안 고심하고 있습니다. 그리고 정말이 구조가 다른 기능을 개발하는 데 많은 고통을주고있는 것처럼 보입니다. 그래서 더 나아 가기 전에 나는 약간의 충고를하고 싶습니다. 그리고 제가 여기서 잘못된 것을하고 있는지보십시오.AccountManager를 통한 앱 흐름

내 응용 프로그램의 목적은 서버에 연결하는 것입니다. AccountManager 메커니즘을 사용하여 장치에서 계정을 만들고 서버에서 데이터를 요청하는 데 사용되는 토큰을 저장합니다. 계정을 만들면 모든 것이 잘됩니다. 그것은 이렇게 가고

- (그것은 장치 설정에서뿐만 아니라 작동> 계정을 추가) :

MainActivity 당신이 응용 프로그램을 실행할 때 계정이 있는지 확인, 활동이다. 계정이있는 경우 MainActivity의 모든 조각이 액세스 할 수 있도록 토큰을 정적 변수로 가져옵니다. (작동하지는 않지만 작동하지는 않습니다.) 그렇지 않으면 LoginActivity로 인 텐트를 만들어 장치에서 계정을 만듭니다. 문제는 AccountManager.getAuthToken()을 사용하여 스레드에서 토큰을 복구 할 때 조각이이 토큰이 복구되기 전에 만들어 지므로 내 조각에서이 토큰을 가져올 수 없다는 것입니다. 그리고 따라서 내 서버에서 데이터를 요청할 수 없습니다.

내 앱 구조가 그리 좋지 않을 수도 있다고 생각하게되었습니다. 그래서 생각하고 있었는데, "내가 그렇게한다면 어쩌지?" :

  • 사용자 계정을 확인하고 장치에 계정이 있다면 토큰을 얻을하지만 현재 버전과 같은보기의 모든 종류를 생성하지 않는 부트 스트랩 같은 응용 프로그램
  • MainActivity 행위를 시작합니다.
  • MainActivity 중 하나 LoginActivity 또는 ContentActivity로 리디렉션

그런 식으로 나를 MainActivity가 토큰을 것이라고 생각 할 수 있습니다 (의 그런 식으로 호출 내의 ListView에 데이터를 채울 내 토큰을 사용하기로했다 활동을하자) 패스하지만 UX의 측면에서 이상적이라고 확신하지는 않습니다. (콘텐츠에 액세스하기 전에 토큰을 기다려야 함). 정말 고생 했으므로이 시점에서 모든 제안에 대해 개방적입니다.

감사합니다.

업데이트 1 :

그것은 같은 관리자를 처리보다 로그인/등록 애플리케이션 로직의 더. 나는 그 (것)들을 일하기 위하여 처리했다 그러나 나는 진짜로 "제일 연습"app 논리 구조로 고투한다 그래서 나는 그것으로 많은 다른 문제로 달리지 않는다 (나가 진짜로 시간이 있지 않기 때문에). 내가 필요한 것은 위의 설명처럼 내 애플 리케이션을 작동시키는 "모범 사례"예제를 보여주는 다이어그램 또는 뭔가입니다. 또한 MainActivity를 시작할 때 계정을 확인하고 LoginActivity를 시작하지 않으면 다시 누르면 MainActivity (채워지지 않음)가 표시 될 수 있기 때문에 문제가 발생했습니다.

General Practice

이 구조가 완전히 허용 및 서버 종속 응용 프로그램의 정상적인 흐름입니다 : 일반적인 연습

답변

4

더 당신이 사용하고있는 것입니다. 로깅은 로그인을 필요로하지 않는 일부 콘텐츠에 대한 옵션입니다. 로그인이 필요한 작업이 트리거 될 때마다 사용자에게 로그인이 표시됩니다. 그러나 모델은 정상적으로 작동합니다.

나는 문제가

  • I also ran into a problem because when I start the MainActivity it checks for an account and if not it launches LoginActivity but if I press back, i can see MainActivity (unfilled).

    이 문제

      현재 사용자의 상태에 따라 MainActivity 또는 LoginActivity을 시작 보이지 않는 파견 활동으로 해결 될 수있는 것을 알 수있다. 다이어그램에서와 같이 결정 후 Dispatch Activity가 finish()입니다. LoginActivity는 다음 단계에서 다시 결정할 DispatchActivity를 재실행합니다. 일반적으로 LoginActivity의 onBackPressed를 재정 의하여 Dispatch를 실행하지 마십시오. 성공적인 로그인의 경우 Dispatch를 시작하십시오.

      그러나 사용자가 로그인하지 않아도 활동에 일부 콘텐츠를 표시하기로 결정한 경우 onActivityResult을 사용하여 로그인 요청 후 MainActivity의 콘텐츠를 새로 고침 할 수 있습니다.

    1. The problem is that my fragments can't get this token because, as i'm recovering the token in a thread using AccountManager.getAuthToken(), the fragments are created before this token is recovered.

      이 문제는 정상입니다. 로그인 요청을 처리 할 때 활동/단편이 이미 작성된 경우이를 알릴 수 있어야합니다. 기본적으로 조각에 "인증되지 않은"내용이 표시되지 않으면 로그인 할 때까지 조각을 만들지 않아야하므로이 문제에 직면해서는 안됩니다.

      그러나 다시 한 번 표시하기로 결정한 경우 사용자가 로그인하지 않은 상태에서도 활동/파편의 내용을 확인하려면 이러한 실행중인 구성 요소에 상태 변경을 알릴 필요가 있습니다. 이를 수행하는 한 가지 방법은 사용자가 로그인되어 있고 적합한 변경 사항을 수행하는지 확인하는 활동에 onResume을 구현하는 것입니다. 의

      Intent intent = new Intent("your_package_name.LOGIN_STATE_CHANGED"); 
      LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); 
      

    :

    BroadcastReceiver mReciever = new BroadcastReceiver() { 
        public void onReceive(Context context, Intent intent) { 
          //do whatever you want //check state 
        } 
    }; 
    
    public void onCreate(Bundle state) { 
        //bla bla 
        //bla bla 
        LocalBroadcastManager.getInstance(mContext).registerReceiver(mReciever, new IntentFilter("your_package_name.LOGIN_STATE_CHANGED")); 
    } 
    

    때마다 상태 변경, 브로드 캐스트를 보낼 : 또 다른 방법은 상태가 변경된 활동/조각을 실행 알리기 위해 지역 방송을 사용하는 것입니다 물론 이는 사례별로 결정될 수 있습니다. 예를 들어 Touch App on Google Play을 확인하면 사용자의 로그인 상태에 관계없이 표시되는 디스패치 화면을 만든 다음 로그인이 필요한 활동을 입력 한 경우 사용자에게 로그인하라는 메시지가 표시됩니다. 이 경우 로그인을 요구하는 활동은 그에 따라 onActivityResult를 구현하고 사용자가 로그인하지 않았 으면 로그인 또는 완료 한 경우 UI를 업데이트해야합니다. 반면에 psst app on Google Play은 스플래시 화면을 사용하여 사용자의 상태에 따라 로그인 화면 또는 기본 화면으로 이동할지 여부를 결정합니다.

  • +0

    완전히 오픈 소스 인 Last.fm 응용 프로그램을 살펴했고 그는 직접 "로그인"활동에 파견 그런 종류의 작업을 수행합니다. 사용자가 앱 위젯을 구성 할 때 또는 앱을 시작한 순간에 사용자가 '계정 추가'설정에서 왔을 때이 활동이 사용되기 때문에 그는 실제로 많은 행동 (예 : 의도 액션)을 확인합니다. 그것이 그렇게 할 수있는 좋은 방법이 될 수 있다고 생각합니까? (여기에 활동 코드 https://github.com/c99koder/lastfm-android/blob/master/app/src/fm/last/android/LastFm.java 링크가 있습니다. SplashScreen을 피하고 싶습니다. UX에 좋지 않다고 생각해. – CinetiK

    +0

    좋다. 예. 만약 하나가 주장한다면, 하나의 활동이 모든 것에 사용될 수 있습니다. –

    +0

    고마워, 너 정말 이걸 도와 줬어! 나는 지금 그것을 일하게 만들었다. – CinetiK

    0

    샘플 코드 ..

    public class DispatchActivity extends ActionBarActivity { 
    
    
        SharedPreferences prefs = null; 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
    
         prefs = getSharedPreferences("me.sanath.megh", MODE_PRIVATE); 
         boolean islogin = prefs.getBoolean("islogin",false); 
         if(islogin) 
         { 
          Intent i = new Intent(this,homepageActivity.class); 
          startActivity(i); 
          finish(); 
         }else{ 
    
          Intent i = new Intent(this,LoginActivity.class); 
          startActivityForResult(i,1); 
         } 
        } 
    
        protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    
         if (requestCode == 1) { 
          boolean islogin = prefs.getBoolean("islogin",false); 
          if(islogin) 
          { 
           Intent i = new Intent(this,homepageActivity.class); 
           startActivity(i); 
           finish(); 
          }else{ 
    
           Intent i = new Intent(this,LoginActivity.class); 
           startActivityForResult(i,1); 
    
          } 
         } 
        } 
    }