Sisteme İlişkin Bazı Elemanların Ele Alınması

[Dropbox]078-KeyEventsSample

Android işletim sistemi üzerinde bir takım elemanlar programcı tarafından kontrol edilmektedir.

Back Tuşunun Ele Alınması

Programcının herhangi bir activity için geri tuşuna basılıp basılmadağını algılayabilir.

Programcı bu tuşu ele alabilmek için onBackPressed isimli metodu override etmelidir.

    @Override
    public void onBackPressed()
    {
        Toast.makeText(this , "Back Pressed" , Toast.LENGTH_SHORT).show();
        super.onBackPressed();
    }

onBackPressed metodunun taban sınıftaki versiyonu ilgili activity için finish metodunun çağrılması demektir.

Örneğin geri tuşuna basıldığı zaman home tuşuna basıldı izlenimi veren bir kod aşağıdaki gibi oluşturulabilir.

    @Override
    public void onBackPressed()
    {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategorty(Intent.CATEGORY_HOME);
        this.startActivity(intent);
    }

Burada Intent ismi ACTION_MAIN olan kategori ismi CATEGORY_HOME olan bir intent ile activity başlatılmalıdır.

Bu intentin herhangi bir buton için örneği aşağıdaki gibidir.

    @Override
    public void onHomeButtonClicked(View v)
    {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategorty(Intent.CATEGORY_HOME);
        this.startActivity(intent);
    }

Key Eventleri

Klavye veya çeşitli tuşlara basıldığı keyeventleri ile anlaşılabilmektedir. Bunun için onKeyXXX metodları kullanılmaktadır.


    @Override
    public void onBackPressed()
    {
        //super.onBackPressed();
    }


    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        Toast.makeText(this, "Up", Toast.LENGTH_SHORT).show();
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event)
    {
        Toast.makeText(this, "Long", Toast.LENGTH_SHORT).show();
        return super.onKeyLongPress(keyCode, event);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        Toast.makeText(this, "Down", Toast.LENGTH_SHORT).show();
        return super.onKeyDown(keyCode, event);
    }

Keyevent parametreleri o olaya ilişkin çeşitli bilgiler vermektedir.Keyevent sınıfın getDownTime metodu tuşa basılmanın gerçekliştiği zamana ilişkin long değeri vermektedir. getEventTime metodu ise o eventin mesaj kuyruğuna atılma zamanını vermektedir.

Buna göre iki eventin arasında geçen zaman nasıl ölçülebilir? Bu metodlar arkaplanda SystemClock sınıfının upTimeMillis isimli metodunu çağırmaktadır.Bu metod cihazın boot edildiği zamandan itibaren geçen milisaniye sayısını vermektedir.

Programcı iki zaman arasındaki farkı bu metodlarla ölçebilir.

 @Override
    public void onBackPressed()
    {
        //super.onBackPressed();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        m_downTime = SystemClock.uptimeMillis();
        Toast.makeText(this, "onKeyDown", Toast.LENGTH_SHORT).show();
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        m_upTime = SystemClock.uptimeMillis();
        String report = "";

        report += "keyDown arası süre:" + ((m_upTime - m_downTime) / 1000.) + "\n";
        report += "Basılı kalan süre:" + ((m_upTime - m_keyPressDownTime) / 1000.);
        m_textViewReport.setText(report);

        Toast.makeText(this, "DownTime:" + m_downTime, Toast.LENGTH_LONG).show();
        Toast.makeText(this, "KeyPressTime:" + m_keyPressDownTime, Toast.LENGTH_LONG).show();
        Toast.makeText(this, "upTime:" + m_upTime, Toast.LENGTH_LONG).show();
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event)
    {
        m_keyPressDownTime = SystemClock.uptimeMillis();
        Toast.makeText(this, "onKeyLongPress", Toast.LENGTH_SHORT).show();
        return super.onKeyLongPress(keyCode, event);
    }

Anahtar Notlar: Java SE kütüphanesinde System sınıfı altında currentMiliSeconds metodu vardır. Bu metod da çağrıldığı zamanla sistemin boot edildiği zaman arasındaki milisaniye farkını döndürür.

keyUp keyPressed keyDown gibi event metodları tüm tuş mekanizmaları için çalışmaktadır.

Back tuşuna basıldığında yapılan işlemler aşağıdaki koddaki gibi basit bir şekilde gerçekleştirilebilir.

 @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            m_upTime = SystemClock.uptimeMillis();
            String report = "";

            report += "keyDown arası süre:" + ((m_upTime - m_downTime) / 1000.) + "\n";
            report += "Basılı kalan süre:" + ((m_upTime - m_keyPressDownTime) / 1000.);
            m_textViewReport.setText(report);


            Toast.makeText(this, "DownTime:" + m_downTime, Toast.LENGTH_LONG).show();
            Toast.makeText(this, "KeyPressTime:" + m_keyPressDownTime, Toast.LENGTH_LONG).show();
            Toast.makeText(this, "upTime:" + m_upTime, Toast.LENGTH_LONG).show();
            return true;
        }
        //...
        return super.onKeyUp(keyCode, event);
    }

KeyEvent sınıfın keyCodeToString metodu ile sabitin yazısal karşıtı elde edilebilir.

Burada dikkat edilirse tuşlara ilişkin herhangi bir tablo kodu yoktur.Çünkü tüm tuşların unicode tablosunda olması gerekmez. Unicode tablosuna ilişkin kodları tuşlardan gelen kodlarla eşleştirmeyi programcı yapmalıdır.

TextWatcher Arayüzü(AutoCompleteTextView'ın son konusu)

ResultReciver Sınıfı Ile Servis Işlemleri