Repository: jinyb09017/delayActionDemo Branch: master Commit: 0ce4c6c9cb5f Files: 46 Total size: 43.2 KB Directory structure: gitextract_ayo7h9er/ ├── .gitignore ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── goodluck/ │ │ └── abbott/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── goodluck/ │ │ │ └── abbott/ │ │ │ ├── DiscountActivity.java │ │ │ ├── LoginActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── OrderDetailActivity.java │ │ │ ├── UserConfigCache.java │ │ │ └── valid/ │ │ │ ├── DiscountValid.java │ │ │ ├── LoginValid.java │ │ │ └── RightValid.java │ │ └── res/ │ │ ├── layout/ │ │ │ ├── activity_discount_activivty.xml │ │ │ ├── activity_login_activivty.xml │ │ │ ├── activity_main.xml │ │ │ └── activity_order_detail.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── goodluck/ │ └── abbott/ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── libaction/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── toptechs/ │ │ └── libaction/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── toptechs/ │ │ │ └── libaction/ │ │ │ ├── MainActivity.java │ │ │ ├── action/ │ │ │ │ ├── Action.java │ │ │ │ ├── ActionManager.java │ │ │ │ ├── CallUnit.java │ │ │ │ ├── SingleCall.java │ │ │ │ └── Valid.java │ │ │ ├── annotation/ │ │ │ │ └── Interceptor.java │ │ │ └── exp/ │ │ │ └── ValidException.java │ │ └── res/ │ │ ├── layout/ │ │ │ └── activity_main.xml │ │ └── values/ │ │ └── strings.xml │ └── test/ │ └── java/ │ └── com/ │ └── toptechs/ │ └── libaction/ │ └── ExampleUnitTest.java └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Built application files *.apk *.ap_ # Files for the ART/Dalvik VM *.dex # Java class files *.class # Generated files bin/ gen/ out/ # Gradle files .gradle/ build/ # Local configuration file (sdk path, etc) local.properties # Proguard folder generated by Eclipse proguard/ # Log Files *.log # Android Studio Navigation editor temp files .navigation/ # Android Studio captures folder captures/ # IntelliJ *.iml .idea/workspace.xml .idea/tasks.xml .idea/gradle.xml .idea/dictionaries .idea/libraries # Keystore files # Uncomment the following line if you do not want to check your keystore files in. #*.jks # External native build folder generated in Android Studio 2.2 and later .externalNativeBuild # Google Services (e.g. APIs or Firebase) google-services.json # Freeline freeline.py freeline/ freeline_project_description.json # 补充的内容 *.iws .idea/ ================================================ FILE: README.md ================================================ ### 如何延迟执行目标行为 例如我们有时候会有这样的需求,那就是在执行目标行为时候,需要执行前置的一些行为。而这些前置行为,需要用户参与才能完成,或者这些前置 行为要跳转到另外一个未知上下文中执行。 典型应用场景: ![](./screen/delay_action.png) 那么我们如何实现这种需求呢?请教参我的博客分析[android 登录成功后再跳转到目标界面的思考](http://www.jianshu.com/p/1d0180ec64fb) ### 添加依赖 ``` compile 'com.abbott.delayaction:libaction:1.0.1' ``` ### 1、基本执行流程图如下 ![](http://upload-images.jianshu.io/upload_images/2159256-91dedfb30a1c140c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700) ### 2、演示图如下 只需要进行登录的验证 ![](./screen/action-login.gif) 需同时进行登录和优惠券的验证 ![](./screen/action-login-dis.gif) ### 3、代码调用如下 调用目标方法 ``` SingleCall.getInstance() .addAction(MainActivity.this) .addValid(new LoginValid(MainActivity.this)) .addValid(new DiscountValid(MainActivity.this)) .doCall(); ``` 完成valid检验后,再执行即可。 ``` SingleCall.getInstance().doCall(); ``` 当然每个对应的验证模型需要自己去完成,例如LoginValid的模型 ``` package com.goodluck.abbott.valid; import android.app.Activity; import android.content.Context; import com.goodluck.abbott.LoginActivity; import com.goodluck.abbott.UserConfigCache; import com.toptechs.libaction.action.Valid; /** * Created by jinyabo on 8/12/2017. */ public class LoginValid implements Valid { private Context context; public LoginValid(Context context) { this.context = context; } /** * check whether it login in or not * @return */ @Override public boolean check() { return UserConfigCache.isLogin(context); } /** * if check() return false. then doValid was called */ @Override public void doValid() { LoginActivity.start((Activity) context); } } ``` ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.goodluck.action" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile project(':libaction') } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in /Users/zhangfei/Library/Android/sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles # directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: app/src/androidTest/java/com/goodluck/abbott/ExampleInstrumentedTest.java ================================================ package com.goodluck.abbott; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumentation test, which will execute on an Android device. * * @see Testing documentation */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.goodluck.Interceptor", appContext.getPackageName()); } } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/goodluck/abbott/DiscountActivity.java ================================================ package com.goodluck.abbott; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.toptechs.libaction.action.SingleCall; /** * get discount */ public class DiscountActivity extends AppCompatActivity { public static final int REQUEST_CODE_LOGIN = 1000; public static void startActivityForResult(Activity activity, int requestCode) { Intent intent = new Intent(activity, DiscountActivity.class); activity.startActivityForResult(intent, requestCode); } public static void start(Activity activity) { Intent intent = new Intent(activity, DiscountActivity.class); activity.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_discount_activivty); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserConfigCache.setDiscount(DiscountActivity.this, true); //这里继续 SingleCall.getInstance().doCall(); finish(); } }); } @Override protected void onDestroy() { super.onDestroy(); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/LoginActivity.java ================================================ package com.goodluck.abbott; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; import com.toptechs.libaction.action.SingleCall; public class LoginActivity extends AppCompatActivity { public static final int REQUEST_CODE_LOGIN = 1000; public static void startActivityForResult(Activity activity, int requestCode) { Intent intent = new Intent(activity, LoginActivity.class); activity.startActivityForResult(intent, requestCode); } public static void start(Activity activity) { Intent intent = new Intent(activity, LoginActivity.class); activity.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login_activivty); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show(); UserConfigCache.setLogin(LoginActivity.this, true); //这里继续 SingleCall.getInstance().doCall(); finish(); } }); } @Override protected void onDestroy() { super.onDestroy(); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/MainActivity.java ================================================ package com.goodluck.abbott; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.goodluck.abbott.valid.DiscountValid; import com.goodluck.abbott.valid.LoginValid; import com.toptechs.libaction.action.Action; import com.toptechs.libaction.action.SingleCall; public class MainActivity extends AppCompatActivity implements Action { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SingleCall.getInstance() .addAction(MainActivity.this) .addValid(new LoginValid(MainActivity.this)) .doCall(); } }); findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SingleCall.getInstance() .addAction(MainActivity.this) .addValid(new LoginValid(MainActivity.this)) .addValid(new DiscountValid(MainActivity.this)) .doCall(); } }); findViewById(R.id.logout).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserConfigCache.setLogin(MainActivity.this, false); } }); findViewById(R.id.logoutDis).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserConfigCache.setDiscount(MainActivity.this, false); } }); } @Override public void call() { OrderDetailActivity.startActivity(MainActivity.this, "1234"); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/OrderDetailActivity.java ================================================ package com.goodluck.abbott; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; public class OrderDetailActivity extends AppCompatActivity { private static final String EXTRA_ORDER_ID = "orderId"; private TextView mOrderInfoText; private String mOrderId; @Override protected void onStart() { super.onStart(); } public static void startActivity(Context context, String orderId) { Intent intent = new Intent(context, OrderDetailActivity.class); intent.putExtra(EXTRA_ORDER_ID, orderId); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_order_detail); mOrderId = getIntent().getStringExtra(EXTRA_ORDER_ID); mOrderInfoText = (TextView) findViewById(R.id.orderInfo); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/UserConfigCache.java ================================================ package com.goodluck.abbott; import android.content.Context; import android.content.SharedPreferences; /** * Created by zhangfei on 2017/3/31. */ public class UserConfigCache { private static final String PREFERENCE_FILE = "user_config_cache"; private static SharedPreferences getPreference(Context context){ return context.getSharedPreferences(PREFERENCE_FILE, Context.MODE_PRIVATE); } private static final String IS_LOGIN = "is_login"; private static final String DISCOUNT = "discount";//折扣 public static boolean isLogin(Context context){ return getPreference(context).getBoolean(IS_LOGIN, false); } public static void setLogin(Context context, boolean logged) { getPreference(context).edit().putBoolean(IS_LOGIN, logged).apply(); } public static boolean isDiscount(Context context){ return getPreference(context).getBoolean(DISCOUNT, false); } public static void setDiscount(Context context, boolean dis) { getPreference(context).edit().putBoolean(DISCOUNT, dis).apply(); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/valid/DiscountValid.java ================================================ package com.goodluck.abbott.valid; import android.app.Activity; import android.content.Context; import com.goodluck.abbott.DiscountActivity; import com.goodluck.abbott.UserConfigCache; import com.toptechs.libaction.action.Valid; /** * Created by jinyabo on 8/12/2017. */ public class DiscountValid implements Valid { private Context context; public DiscountValid(Context context) { this.context = context; } /** * * @return */ @Override public boolean check() { return UserConfigCache.isDiscount(context); } /** * if check() return false. then doValid was called */ @Override public void doValid() { DiscountActivity.start((Activity) context); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/valid/LoginValid.java ================================================ package com.goodluck.abbott.valid; import android.app.Activity; import android.content.Context; import com.goodluck.abbott.LoginActivity; import com.goodluck.abbott.UserConfigCache; import com.toptechs.libaction.action.Valid; /** * Created by jinyabo on 8/12/2017. */ public class LoginValid implements Valid { private Context context; public LoginValid(Context context) { this.context = context; } /** * check whether it login in or not * @return */ @Override public boolean check() { return UserConfigCache.isLogin(context); } /** * if check() return false. then doValid was called */ @Override public void doValid() { LoginActivity.start((Activity) context); } } ================================================ FILE: app/src/main/java/com/goodluck/abbott/valid/RightValid.java ================================================ package com.goodluck.abbott.valid; import android.content.Context; import android.widget.Toast; import com.toptechs.libaction.action.ActionManager; import com.toptechs.libaction.action.Valid; /** * Created by jinyabo on 8/12/2017. * * 根据传入的数据,判断是否的对应界面的权限操作。 */ public class RightValid implements Valid { String right; String page; Context context; public RightValid(Context context, String right, String page) { this.right = right; this.page = page; this.context = context; } @Override public boolean check() { if(right.equals("2") && page.equals("order")){ return true; } return false; } @Override public void doValid() { Toast.makeText(context, String.format("没有%s界面的权限",page),Toast.LENGTH_SHORT).show(); right = "2"; page = "order"; Toast.makeText(context, String.format("获得%s界面的权限",page),Toast.LENGTH_SHORT).show(); ActionManager.instance().checkValid(); } } ================================================ FILE: app/src/main/res/layout/activity_discount_activivty.xml ================================================