我们来看一个示例图:
首先我们看到一篇很有吸引力的文章时候都会忍不住去评论,可是在我们评论时候,会突然蹦到登录页面,才发现我们根本就没有登录,这也是现在大部分应用的结构吧,目的是先吸引住你,然后你会不自觉的想注册登录,反过来如果应用首先就登录,会觉得比较繁琐,心情不好,直接就drop了。我个人认为啊.不多说了,看下面实现.
我们这里主要用到的方法:
跳转:startActivityForResult(new Intent(this, LoginActivity.class), 1);
在LoginActivity中要执行setResult(RESULT_OK); finish(); 记住finish不可缺省的.不然回调后的页面会在LoginActivity这个页面下面,这肯定不是我们要的效果.原因简单,我不多说了.
最后我们要在本Activity回调:
/***
* requestCode 这个参数和上面startActivityForResult里面的requestCode是一一对应的.
* requestCode这个参数主要是用在同一个activity当中
* ,如果有好几处调用startActivityForResult,这时为了区分回调是谁执行的,就用requestCode来区分,
* 而由哪个activity返回的我们只需要resultCode就可以了.
* 所以onActivityResult里面的resultCode是setResult(RESULT_OK)和这里面的参数一致的.
* data用于传些数据或过滤.这里么有用到
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
代码片段:
public class OneActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Session.username == null || Session.password == null
|| !Session.username.trim().equals("123")
||! Session.password.trim().equals("123")) {
startActivityForResult(new Intent(this, LoginActivity.class), 1);
return;
}
TextView textView = new TextView(this);
textView.setText("OneActivity...");
setContentView(textView);
}
/***
* requestCode 这个参数和上面startActivityForResult里面的requestCode是一一对应的.
* requestCode这个参数主要是用在在同一个activity当中
* ,有好几处调用startActivityForResult,这时为了区分谁执行的,就用requestCode来区分,
* 而由哪个activity返回的我们只需要resultCode就可以了.
* 所以onActivityResult里面的resultCode是setResult(RESULT_OK)和这里面的参数一致的.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Session.username != null && Session.password != null
&& Session.username.trim().equals("123")
&& Session.password.trim().equals("123")) {
Intent intent = new Intent(OneActivity.this, OneActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
finish();
}
}
这里需要说明一下:
这里我们需要在回调后执行这个activity的oncrate方法,可是我直接调用oncreate方法,没有反应,一气之下就这样搞了,效率不高,如果有好的解决方案给俺说一下,共同进步嘛.
下面是loginActivity.java代码片段:
findViewById(R.id.bt_login).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String username = ((EditText) findViewById(R.id.et_username))
.getText().toString();
String password = ((EditText) findViewById(R.id.et_password))
.getText().toString();
if (!username.equals("123") && !password.equals("123")) {
Toast.makeText(LoginActivity.this, "用户名密码错误", 1000).show();
((EditText) findViewById(R.id.et_username)).setText("");
((EditText) findViewById(R.id.et_password)).setText("");
return;
}
// 模拟保存数据
Session.username = username;
Session.password = password;
setResult(RESULT_OK);
finish();
}
});
这样就实现效果了。其实很简单很简单吧,主要是实现这个效果的思路,其实还有很多,有隐试Intent什么实现不了,哈哈.
效果如下:
我还讲解一下吧:
首先你点击oneActivity,TwoActivity,ThreeActivity她们会直接跳转至登录页面,因为你首次登录且没有登录.
在你点击TwoActivity后会跳转至登录页面,你输入好用户名密码,点击登录,这个时候会跳转至TwoActivity页面,相应的你点击ThreeActivity她会调转只ThreeActivity页面。做的非常丑陋,不过实现我期望的效果了,其实很简单,我想你早就OK了.
bug修改:
上面有个bug,如果在登录界面,你点击返回键就知道,其实我们应该监听登录的返回键的。下面是处理:
只是个方案,我们还可以根据需求进行调整,就说这么多了,如有好的建议,请给透漏给我一下.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
return super.onKeyDown(keyCode, event);
}