转载地址:http://www.jianshu.com/p/f25395047402
一般涉及到用户登录注册的应用都有这样的需求:
在执行某一项需要登录之后才能操作的任务之前先检查当前用户有没有在应用里登录过,如果没有需要跳转到登录页面进行登录或者注册,在登录成功之后返回来接着执行之前的操作。
问题是,需要检查用户是否登录的触发点很多,为了避免在每个触发点进行重复的工作,可以写这样一个工具类:
-
第一步:定义工具类,注意,此类继承自Activity,需要设置主题为NoDisplay(见第二步)
public class LoginUtil extends Activity { static LoginCallback mCallback; public interface LoginCallback { void onLogin(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NavigateUtil.navigateForResult(this, LoginActivity.class, 22); } public static void checkLogin(Context context, LoginCallback callback) { //此处检查当前的登录状态 boolean login = AccountManager.get().isVerify(); if (login) { callback.onLogin(); } else { mCallback = callback; context.startActivityForResult(context, LoginActivity.class, 22); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { finish(); if (resultCode == RESULT_OK) { mCallback.onLogin(); } mCallback = null; } }
- 第二步:AndroidManifest.xml里需要配置此activity主题:
注意:此种方式只适用于v23版本的sdk之前,SDK23版本以后此主题会报错.<activity android:name=".util.LoginUtil" android:theme="@android:style/Theme.NoDisplay"/> <activity
An activity without a UI must call finish() before onResume() completes
参见https://commonsware.com/blog/2015/11/02/psa-android-6p0-theme.nodisplay-regression.html
解决办法:
创建主题<style name="NoDisplay" parent="android:Theme.NoDisplay"></style>
所以需要在values-v23文件夹下面新建一个适配主题:
<style name="NoDisplay" parent="android:Theme.Translucent.NoTitleBar"></style>
然后修改AndroidManifest.xml里activity的主题为
<activity android:name=".util.LoginUtil" android:theme="@style/NoDisplay"/> <activity
-
第三步:在你的处理登录的Activity里登录成功之后调用:
setResult(Activity.RESULT_OK); finish();
-
这样,如果需要登录操作的地方直接调用:
LoginUtil.checkLogin(context,new LoginCallback(){ public void onLogin(){ //TODO 此处写之前的操作代码 } });
文/水底鱼(简书作者)
原文链接:http://www.jianshu.com/p/f25395047402
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/f25395047402
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。