Androidモジュール化のログイン業務処理
8338 ワード
Androidモジュール化の基本的な方法を先に紹介しましたが、各モジュールが単独で動作することを保証できます.見たことがない場合は、ここを押してください.Androidモジュール化の簡単なチュートリアルです.しかし、これらは最も基本的なもので、1つのプロジェクトのモジュール化の過程で多くの問題に直面します.最も重要なのはログイン問題です.私たちがモジュールを単独で実行するとき、私たちの前提はログイン操作を行わなければなりません.どのようにして各モジュールを実行する前にログインモジュールを実行しますか?ここには2つのシナリオがあります.サンプルコードはここを見てください.
シナリオ1:BaseActivityブロック(本シナリオのコードはgit履歴を参照)ログインモジュールにおいてログイン状態をグローバルデータに記録する心 . BaseActivityで に登録するか否かを判断する.
BaseActivityでは、まずログインしたかどうかを判断し、ログインして自然に歩き続け、ログインしていない場合はログインページにジャンプしてログインし、現在のページを終了します.ここでは、ログインページにジャンプする際に現在のページのアドレス(ARouter構成のアドレス)を持っていくことで、ログインが完了してから現在のページにジャンプすることができます.登録登録登録後のジャンプアドレス2ステップ目では、現在のページのurlをLoginActivityに転送しますが、このジャンプをBaseActivityで処理し、各urlはサブactivityで構成されており、BaseActivityではこのurlは取得できません.この問題を解決するために,ログイン時にジャンプするルーティングテーブルを統一した:
ARouterのurlを構成するとき、私たちは原則に従います.urlの最後は必ずActivityのクラス名です.その後、Activityの名前と彼のARouterのurlを静的マッピングします.これにより、BaseActivityでは、実行時のクラス名でurl:ログインモジュールのジャンプ処理
LoginActivityでログインが完了したら、前のページに直接ジャンプすればいいです.
方案二:登録モジュールのジャンプ判定
本方案の核心思想は各モジュールが統一的に先にログインする流れであり、ログインが完了した後、現在実行されているどのモジュールがそのモジュールのトップページにジャンプするかに基づいている.1.各moduleの単独運転時のAndroid Manifest.xmlでは、activityを起動するためのログインモジュールを指定します.
2.現在稼働しているのはそのModuleだと判断するLoginActivityはCommonBusinessモジュールの中にあるので、ただのサブModuleにすぎない.このモジュールで現在稼働しているModuleを取得するのは難しい.ここでは、各Moduleのdebug時のAndroid Manifestを利用する方法を提供する.xmlでlabelを指定し、サブmoduleでこのlabelを取得することで、現在実行されているモジュールを判断できます.
ここでは、moduleごとにlabelが異なることを確認します.そうしないと、ジャンプエラーが発生します.3.登録ルーティングテーブル各moduleには独自のlabelがあり、その後、labelとモジュールのトップページのurlをマッピングし、ルーティングテーブルを形成し、ジャンプを容易にします.
4.LoginActivityでlabelによるジャンプ
まとめ
2つのシナリオでは、1つの欠点は、ログインしていない場合、モジュールのトップページがログインページにジャンプして自分を終了することです.これにより、キラキラした状況になるのか、それとも少し明らかになります.もちろん、これは開発時にしか現れません.リリース後は必ずApp全体でリリースされ、Moduleを単独で実行することはありません.このような状況は自然に起こらない.だから、私が採用したのは2つ目の案で、moduleごとのlabelが重複しないことを確保すればいいです.
最後に私のもう一つの文章を引き続き見ることができます:Androidモジュール化ButterKnifeとDagger 2の使用
シナリオ1:BaseActivityブロック(本シナリオのコードはgit履歴を参照)
DataCenter.getInstance().setLogin(true);
if(!DataCenter.getInstance().isLogin()){
String curUrl = ConstantRouter.getCurRouter(this.getClass().getSimpleName());
ARouter.getInstance().build(ConstantRouter.LOGIN_ACTIVITY)
.withString("targetUrl",curUrl)
.navigation();
finish();
}
BaseActivityでは、まずログインしたかどうかを判断し、ログインして自然に歩き続け、ログインしていない場合はログインページにジャンプしてログインし、現在のページを終了します.ここでは、ログインページにジャンプする際に現在のページのアドレス(ARouter構成のアドレス)を持っていくことで、ログインが完了してから現在のページにジャンプすることができます.
public class ConstantRouter {
public static MapactivityRouterMap = new HashMap<>();
//
public static final String APP_MAINACTIVITY = "/app/MainActivity";
//
public static final String IM_MAINACTIVITY = "/im/InstantMessagingMainActivity";
//
public static final String NEW_HOUSE_MAINACTIVITY = "/new_house/NewHouseMainActivity";
//
public static final String SECOND_HOUSE_MAINACTIVITY = "/second_house/SecondHouseMainActivity";
/**
*
*/
public static final String LOGIN_ACTIVITY = "/common_business/LoginActivity";
static{
activityRouterMap.put(getActivityName(APP_MAINACTIVITY),APP_MAINACTIVITY);
activityRouterMap.put(getActivityName(IM_MAINACTIVITY),IM_MAINACTIVITY);
activityRouterMap.put(getActivityName(NEW_HOUSE_MAINACTIVITY),NEW_HOUSE_MAINACTIVITY);
activityRouterMap.put(getActivityName(SECOND_HOUSE_MAINACTIVITY),SECOND_HOUSE_MAINACTIVITY);
activityRouterMap.put(getActivityName(LOGIN_ACTIVITY),LOGIN_ACTIVITY);
}
private static String getActivityName(String routerUrl){
int pos = routerUrl.lastIndexOf("/");
return routerUrl.substring(pos+1);
}
public static String getCurRouter(String activityName){
return activityRouterMap.get(activityName);
}
}
ARouterのurlを構成するとき、私たちは原則に従います.urlの最後は必ずActivityのクラス名です.その後、Activityの名前と彼のARouterのurlを静的マッピングします.これにより、BaseActivityでは、実行時のクラス名でurl:
String curUrl = ConstantRouter.getCurRouter(this.getClass().getSimpleName());
を取得することで、現在のページのurlをLoginActivityに渡すことができます.@Route(path = "/common_business/LoginActivity")
public class LoginActivity extends CommonBaseActivity{
@Autowired
String targetUrl;
@BindView(R2.id.progressBar)
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ARouter.getInstance().inject(this);
if(targetUrl == null){
// MainActivity
targetUrl = ConstantRouter.APP_MAINACTIVITY;
}
//
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
DataCenter.getInstance().setLogin(true);
ARouter.getInstance().build(targetUrl).navigation();
LoginActivity.this.finish();
}
},2000);
}
}
LoginActivityでログインが完了したら、前のページに直接ジャンプすればいいです.
方案二:登録モジュールのジャンプ判定
本方案の核心思想は各モジュールが統一的に先にログインする流れであり、ログインが完了した後、現在実行されているどのモジュールがそのモジュールのトップページにジャンプするかに基づいている.1.各moduleの単独運転時のAndroid Manifest.xmlでは、activityを起動するためのログインモジュールを指定します.
2.現在稼働しているのはそのModuleだと判断するLoginActivityはCommonBusinessモジュールの中にあるので、ただのサブModuleにすぎない.このモジュールで現在稼働しているModuleを取得するのは難しい.ここでは、各Moduleのdebug時のAndroid Manifestを利用する方法を提供する.xmlでlabelを指定し、サブmoduleでこのlabelを取得することで、現在実行されているモジュールを判断できます.
ここでは、moduleごとにlabelが異なることを確認します.そうしないと、ジャンプエラーが発生します.3.登録ルーティングテーブル各moduleには独自のlabelがあり、その後、labelとモジュールのトップページのurlをマッピングし、ルーティングテーブルを形成し、ジャンプを容易にします.
public class ConstantRouter {
//
public static MapactivityRouterMap = new HashMap<>();
//
public static final String APP_MAINACTIVITY = "/app/MainActivity";
//
public static final String IM_MAINACTIVITY = "/im/InstantMessagingMainActivity";
//
public static final String NEW_HOUSE_MAINACTIVITY = "/new_house/NewHouseMainActivity";
//
public static final String SECOND_HOUSE_MAINACTIVITY = "/second_house/SecondHouseMainActivity";
/**
*
*/
public static final String LOGIN_ACTIVITY = "/common_business/LoginActivity";
static{
activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_app),APP_MAINACTIVITY);
activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_instant_messaging),IM_MAINACTIVITY);
activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_second_house),SECOND_HOUSE_MAINACTIVITY);
activityRouterMap.put(BaseApplication.getApplication().getString(R.string.label_new_house),NEW_HOUSE_MAINACTIVITY);
}
public static String getCurRouter(String label){
return activityRouterMap.get(label);
}
}
4.LoginActivityでlabelによるジャンプ
/**
*
* @return
*/
private String getCurModuleUrl(){
String label = null;
try {
label = getResources().getString(
getPackageManager().getApplicationInfo(getPackageName(), 0).labelRes);
return ConstantRouter.getCurRouter(label);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
targetUrl = getCurModuleUrl();
if(targetUrl == null){
targetUrl = ConstantRouter.APP_MAINACTIVITY;
}
//
progressBar.postDelayed(new Runnable() {
@Override
public void run() {
DataCenter.getInstance().setLogin(true);
ARouter.getInstance().build(targetUrl).navigation();
LoginActivity.this.finish();
}
},2000);
まとめ
2つのシナリオでは、1つの欠点は、ログインしていない場合、モジュールのトップページがログインページにジャンプして自分を終了することです.これにより、キラキラした状況になるのか、それとも少し明らかになります.もちろん、これは開発時にしか現れません.リリース後は必ずApp全体でリリースされ、Moduleを単独で実行することはありません.このような状況は自然に起こらない.だから、私が採用したのは2つ目の案で、moduleごとのlabelが重複しないことを確保すればいいです.
最後に私のもう一つの文章を引き続き見ることができます:Androidモジュール化ButterKnifeとDagger 2の使用