我們來看一個樣本圖:
首先我們看到一篇很有吸引力的文章時候都會忍不住去評論,可是在我們評論時候,會突然蹦到登入頁面,才發現我們根本就沒有登入,這也是現在大部分應用的結構吧,目的是先吸引住你,然後你會不自覺的想註冊登入,反過來如果應用首先就登入,會覺得比較繁瑣,心情不好,直接就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 {@Overrideprotected 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)和這裡面的參數一致的. */@Overrideprotected 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() {@Overridepublic 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,如果在登入介面,你點擊返回鍵就知道,其實我們應該監聽登入的返回鍵的。下面是處理:
只是個方案,我們還可以根據需求進行調整,就說這麼多了,如有好的建議,請給透漏給我一下.
@Overridepublic 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);}
源碼下載