2013-08-13 12 views
5

私はアプリの構造をしばらく苦労してきました。そして、それは本当にこの構造のように私に他の機能の開発に多くの痛みを与えるようです。だから私はいくつかのアドバイスをして、私がここで何か間違っているかどうかを見たいと思う。AccountManagerを使用したアプリケーションフロー

私のアプリの目的はサーバーに接続することです。私はAccountManagerメカニズムを使ってデバイス上にアカウントを作成し、サーバーからデータを要求するために使用されるはずのトークンを保存します。アカウントの作成では、すべてが問題ありません。 (これは、デバイスの設定から、同様に動作 - >アカウントを追加)

それはこのように書き:

MainActivityは、あなたがアカウントを持っているかどうかを確認、アプリを起動し、活動です。 アカウントをお持ちの場合は、MainActivityのすべてのフラグメントにアクセスできるように、トークンを静的変数に入れます。 (動作するはずですが) それ以外の場合は、LoginActivityでインテントを作成して、デバイス上にアカウントを作成します。 問題は、私がAccountManager.getAuthToken()を使ってスレッド内のトークンを回復しているときに、このトークンが復元される前にフラグメントが作成されるため、私のフラグメントがこのトークンを取得できないということです。したがって、私は私のサーバーからデータを要求することはできません。

私のアプリの構造がそれほど良くないと思うようになった。 だから私は考えていた、 "どうすればいい?" :

  • ユーザーはアカウントをチェックして、デバイス上のアカウントがあるかどうトークンますが、現在のバージョンのようなビューの任意の種類を生成しないブートストラップのようなアプリ
  • MainActivity行為を起動します。
  • MainActivityのいずれかLoginActivityまたはContentActivityにリダイレクト

その方法は私がMainActivityのにトークンを持っているだろうと思います(、のは、そのようにそれを呼び出す私のリストビューにデータを取り込むために、私のトークンを使用することになっての活動をしましょう)私はそれがUXの面で理想的であるとは確信していません。 (コンテンツにアクセスする前にトークンを待つ必要があります)。 私は本当に立ち往生して以来、私はこの時点ですべての提案にオープンしています。

ありがとうございます!

アップデート1:

それはAccountManagerをハンドリングよりログイン/登録アプリロジックのより多くのです。私はそれらを動作させることに成功しましたが、私は本当に "ベストプラクティス"アプリケーションのロジック構造に苦しんでいます。そのため、他の多くの問題に遭遇することはありません。 私が必要とするのは、上の図のようにアプリケーションを動作させるための「ベストプラクティス」の例を示すための図または何かです。 私はMainActivityを起動するとアカウントをチェックし、そうでなければLoginActivityを起動しますが、私が戻るとMainActivity(満たされていない)が表示されるので、問題が発生しました。

General Practice

この構造は完全に許容され、サーバー依存のアプリケーションの通常の流れである:一般診療の

答えて

4

詳細は、使用しているものです。私はロギングがログインを必要としないいくつかのコンテンツのオプションであるモデルを好む。ログインを必要とするアクションがトリガーされるたびに、ユーザーにログインが表示されます。しかし、あなたのモデルは正常に動作するはずです。

私はあなたの問題は、この問題は、現在のユーザーの状況に基づいてMainActivityまたはLoginActivityを起動する不可視の派遣活動で解決することができ

  1. 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).

    あることがわかります。図のように、あなたの決定後、派遣活動をfinish()にしてください。あなたのLoginActivityはDispatchActivityを再起動し、次のステップで再決定します。一般的に、LoginActivityのonBackPressedをオーバーライドしてDispatchを起動しないでください。ログインに成功した場合はDispatchを起動してください。

    ただし、ユーザーがログインしていない場合でもアクティビティにコンテンツを表示することに決めた場合は、ログイン要求後にonActivityResultを使用してMainActivityのコンテンツを更新することができます。

  2. 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.

    この問題は正常です。ログインリクエストを処理しているときにあなたのアクティビティ/フラグメントが既に作成されている場合は、それらに通知することができなければなりません。基本的に、フラグメントに「認証されていない」コンテンツが表示されない場合は、ログインするまでフラグメントを作成しないでください。ユーザーがログインしていなくてもアクティビティ/フラグメント内のコンテンツを削除するには、これらの実行中のコンポーネントにステータス変更について通知する必要があります。これを行う1つの方法は、ユーザがログインしているかどうかをチェックし、適切な変更を行うonResumeをアクティビティに実装することです。もう一つの方法は、状態が変化した活動/フラグメントを実行している知らせるためにローカルブロードキャストを使用することです:

    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")); 
    } 
    

    するたびに状態が変化し、ブロードキャストを送信しますの

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

をもちろん、これはケース固有のものになることがあります。たとえば、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); 

      } 
     } 
    } 
} 
関連する問題