Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用密碼的實現

Android應用密碼的實現

編輯:關於Android編程

最近做了一個demo——功能是給自己的應用加鎖,訪問的時候需要輸入密碼,並且每次鎖屏再開之後都需要重新輸入密碼。

主要思路:

設置一個全局變量表示當前應用的狀態(布爾值:已鎖定|已解鎖),在每個Activity顯示之前進行狀態判斷,如果當前為鎖定狀態,則終止顯示,跳轉到密碼界面。在密碼界面輸入正確的密碼之後,將應用狀態改為已解鎖,並返回繼續顯示之前的Activity;否則繼續要求輸入密碼。注冊一個廣播接收,監聽系統的鎖屏事件,有鎖屏事件發生時,將應用的狀態改為已鎖定。(即每次鎖屏之後需要重新輸入密碼)

具體實現:

1. 全局變量的實現

1.1 用一個全局的靜態變量當然是OK的。

1.2 不過在Android上我們可以用一個更“優雅”一點的實現:利用Android的Application對象(文檔)。

寫一個MyApplication類,繼承自android.app.Application。在MyApplication中定義一個狀態變量,並且在onCreate()方法中進行初始化。在AndroidMainfest.xml中在標簽添加name屬性,值為MyApplication的完整類名。

android:name="barry.demo.passwordApp.MyApplication"dg

則在此標簽下的所有Activity中,都可以用MyApplication myApplaction = (MyApplication) getApplication();來獲取MyApplication的實例並使用或修改其中的變量了。

2. 根據狀態判斷是否需要輸入密碼

由於onResume()方法是Activity每次顯示或者重繪都會調用的方法(見Activity的生命周期),所以可以在此方法中進行狀態判斷。

具體做法可以是:

寫一個用於輸入密碼的界面PasswordActivity;

寫一個BaseActivity,在其中的onResume()方法中寫入判斷代碼,然後其余所有Activity都繼承自此BaseActivity——當然,密碼界面PasswordActivity除外。

BaseActivity大概長這個樣子:

public class BaseActivity extends Activity {
    MyApplication myApplaction;
    protected void onResume() {
        super.onResume();
        myApplaction = (MyApplication) getApplication();
        if (myApplaction.isLocked) {//判斷是否需要跳轉到密碼界面
            Intent intent = new Intent(this, PasswordActivity.class);
            startActivity(intent);
        }
    };
}

PasswordActivity大概長這個樣子:

public class PasswordActivity extends Activity {

    MyApplication myApplaction;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_password);
        myApplaction = (MyApplication) getApplication();
        
        final EditText editTextPassword = (EditText) findViewById(R.id.editTextPassword);
        
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                String password = editTextPassword.getText().toString();
                if (password != null && password.equals(myApplaction.password)) {
                    Toast.makeText(PasswordActivity.this, "密碼正確!", Toast.LENGTH_SHORT).show();
                    myApplaction.isLocked = false;
                    PasswordActivity.this.finish();
                } else {
                    Toast.makeText(PasswordActivity.this, "密碼錯誤!", Toast.LENGTH_SHORT).show();
                    editTextPassword.setText("");
                }
            }
        });
    }
}



3. 監聽鎖屏事件

經過以上兩步,就可以實現應用的加鎖了——在打開的應用的時候,就會自動跳轉到密碼界面,輸入密碼之後再進入內容Activity。——但是這只會在程序打開的時候輸入一次密碼,如果程序沒有徹底關閉,那麼把手機鎖屏之後再打開,依然還是不需要輸入密碼。

要實現在手機鎖屏之後再打開就要求密碼,就必須要監聽手機的鎖屏事件了,在鎖屏之後把應用狀態改為鎖定,這樣再打開就會重新要求輸入密碼了。

3.1 監聽鎖屏的實現

諸如系統開機、鎖屏、開屏、聯網狀態改變、有電話進來、有短息進來、系統電量過低等等,各種系統狀態發生改變的時候,Android系統本身都會發一個廣播。

我們要做的,就是要注冊一個廣播接受器,用其監聽系統廣播,當發現有鎖屏事件發生的時候更改應用的狀態。

由於這個廣播接受器應該是啟動應用時就創建的,而且是屬於應用全局的,所以我們把它創建在MyAppLication類中,在MyApplication的onCreate()方法中進行初始化,在onTerminate()方法中取消注冊。

3.2 構建廣播接受器

構建一個廣播接受器很簡單,只需要繼承android.content.BroadcastReceiver類,並且實現其中的onReceive()方法就好,在onReceive()中做接到廣播之後的處理。

    class LockScreenReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            /* 在這裡處理廣播 */
            if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
                isLocked  = true;//把應用狀態設為鎖定
            }
        }
    }

3.3 注冊廣播

構建一個IntentFilter過濾器,在其中添加需要接收的廣播類型,然後調用Context的registerReceiver方法。

        //注冊
        receiver = new LockScreenReceiver();
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        this.registerReceiver(receiver, filter);
        //取消注冊
        this.unregisterReceiver(receiver);




至此,一個輸入密碼才能訪問的應用demo就基本OK了。

Demo代碼下載: 地址

界面比較丑陋,有時間再改一下。


同步發表在 http://www.barryzhang.com/archives/146

廣告一下我的新博客,歡迎訪問哈~:BarryZhang.com



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved