Activity lifecycle

Bura qədər biz biraz sadə formada müəyyən mövzuları əhatə edəcək məsələlərə baxdıq. Baxdıqlarımız, elədiklərimiz haqda sadə deyərkən, əlbətdəki hər biri hansısa bir real proyektdə istifadə edilir. Sadəcə məsələ təklikdə onların bir məna ifadə etməməsidi. Ümumi başlanğıc səviyyəsindən biraz daha yuxarılara çıxmaq üçün daha qarmaşıq, daha mürəkkəb mövzulara başlamaq lazımdır.

Bugünkü mövzumuz Activity-nin həyat dövrü olacaq. Fikir vermişdizsə köhnə yazılarımızda MainActivity, SecondActivity yaradırdıq. OnCreate daxilində müəyyən proseslər edirdik. Bax bu onCreate dediyimiz var ha, o da özüylüyndə activity-nin həyat dövrünün bir parçasıdır.

Gəlin əvvəl rəsmi səhifədə paylaşılmış bu dövrün şəklili izahına baxaq:

Şəkildən də göründüyü kimi Activity yaradılarkən OnCreate(), onStart(), onResume() metodları sırayla işə düşür. Nəticədə istifadəçi həmin səhifəni telefonunun ekranında görür. Activity-dən çıxıldıqda, başqa activityə keçid edildikdə onPause(), onStop() işə düşür, geri qayıdıldıqda onRestart() vasitəsiylə onStart()-a qayıdılır. Dialoqlara keçərkən onPause()-a keçib ardınca onResume() ilə davam edir. Activity öləndə isə onDestroy()-a düşür.

Bunları belə qısaca dedim, üstündən keçdik. Gəlin bir tədbiqetmə yazaq, ciddi şəkildə bunlara baxaq.

Zəhmət olmazsa, android studionu açıb hazırlayın. Mən adın qoyum: “MyActivityLifecyle“.

Indi 3 ədəd button əlavə edək, onların setOnClickListener-lərin qoşaq. Əlavə edilən kodlara burdan, hal hazırkı son formaya burdan baxa bilərsiniz.

İndi gəlin 1 ədəd başqa activity yaradaq, buttonların biri startActivity, digəri startForResultActivity olaraq həmin activity-ni intent vasitəsiylə açsın. Bir də dialog açdıraq digər button üçün də.

Əlavə edilən kodlara burdan, hal hazırkı son formaya burdan baxa bilərsiniz.

İndi gələk əsas məsələyə. Bayaqdan bu qədər özümüzü niyə yoruruq? “Activity Lifecycle” necə işlədiyinə baxmaq üçün. Haydi, son əlavələrimizi də edib, Log-ları artıraq, sonra oturaq proseslərə baxmağa.

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        Log.e("ActivityLifecycle", "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e("ActivityLifecycle", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("ActivityLifecycle", "onResume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e("ActivityLifecycle", "onStop");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e("ActivityLifecycle", "onPause");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("ActivityLifecycle", "onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("ActivityLifecycle", "onRestart");
    }

– Etdiyimiz dəyişikliklərə burdan abxa bilərsiniz.

Gəlin başlayaq səhifənin ilk açılmasında. Tədbiqetməni işə salırıq və Log-lara baxırıq görək, ekranda tədbiqetmə görünən zaman, loglar bizə nə deyəcək?

Ardıcıllığımız belə oldu: onCreate(), onStart(), onResume().

Gəlin indi ilk buttonumuza klikləyib digər activity-ni açaq, sonra back düyməsin basıb geri qayıdaq görək nə baş verir:

Main-imiz onPause()-a düşür, SeconActivity-nin onCreate()-hissəsi bitdikdən sonra həmin activity ekranda görünür, nəticədə bizim MainActivity onStop()-a düşür. Geriyə qayıtdıqda isə onRestart(), onStart(), onResume().

Gəlin indi də startActivityForRresult olan buttonu işə salaq və metodların ardıcıllığına baxaq:

Bu səfər də oxşar proseslər bax şerdi. Digərindən tək fərqi əvvəlcə onActivityResult()-a düşüb, sonra onRestart()-a keçdi.

İndi sıra dialogda:

Dialog göründü, və getdi. Activity üçün heçnə dəyişmədi!.Bəs deyirdilər dialog falan çıxanda onPause()-a düşür ordan qayıdanda onResume()-a düşür? Hə, bax o bizim çağırdığımız dialoglara aid deyil. Digər tədbiqetmələrə aiddi. Messengerdən, whatsappdan mesaj gəlib popup dialoglar çıxanda olur:

 

Bəs telefonun üzərindəki “home” düyməsi basaraq tədbiqetmədən çıxsaq necə olar?

Bu zaman diqqət etdinizsə activity-miz onDestroy()-a düşmədi, sadəcə onStop() oldu. Telefonda düymə var ey açıq qalan tədbiqetmələri görmək üçün basırıq. Həmin hissədən tədbiqetməyə yenidən qayıda bilərik.

Bu zaman onDestroya düşmədiyi üçün onRestart-dan davam etdi. Əgər sistem ehtiyac duyara (RAM-da lazımınca yer qalmadıqda) özü tədbiqetməni onDestroy()-a sala bilər. O zaman yenidən onCreate()-dən başlayacaq hər şey.

Burda xüsusi bir qeyd. Bəzi telefonlarda RAM kiçik olduğu üçün sistem bir activity-dən başqa yerə keçəndə avtomatik onu onDestroy()-a salır.

Belə, ümid edirəm yazı sizin üçün faydalı olar.

Son olaraq, kodlara baxmaq üçün: Muzafferus/my-activity-lifecycle


*Bu hissə yazıya sonradan əlavə edilib.

Əlavə olaraq gəlin iki məsələni də yoxlayaq.

  1. Ekranı kilidə salsaq nə baş verəcək?
  2. 2. Ekranı tərs çevirsək nə baş verəcək?

İlk öncə kilidi yoxlayaq:

Sanki “Home” düyməsin basmış kimi olduq. Əvvəl onStop()-a düşdü, sora geri qayıdanda onRestart() activity-ni yenidən işə saldı.

İndi isə telefonu yan tərəfə çevirək və baxaq:

Maraqlı bir məqam yarandı. Activity onDestroy() oldu, sonradan yenidən yarandı. Burda vurğulanmalı məsələ – sizin activity-də hansısa bir user datası varsa, telefon yana çevrildikdə activity-niz destroy olduğu üçün data (informasiya) itə bilər. Nəzərə alın. Ya informasiyanı saxlayın, ya da activity-ni sadəcə portrait olaraq AndroidManifest-də təyin etmək lazımdır:

Bunun başqa bir yolu da var, qoy mən onSaveInstanceState deyim, siz özünüz axtarıb araşdırın. Uğur olsun!

 

 

Advertisements

Android 47: HTTP Status Codes (HTTP Status Kodları)

  1. İnformational (İnformasiya xarakterli status kodlar)
    • 100 Continue (Sorğunun uğurlu olduğu də davam edilə biləcəyini bildirir)
    • 101 Switching Protocol (Server aldığı “protokol dəyişdirmə” istəyini yerinə yetirəcəyini bildirir)
  2. Success (Uğurlu sorğu bildirən status kodları)
    • *200 OK (Sorğu uğurla tamamlanmış və nəticə qaytarılmışdır)
    • *201 Created (Sorğu uğurla tamamlanmış və nəticədə yeni mənbə yaradılmışdır)
    • 202 Accepted (Server sorğunu qəbul edib lakin hələ yerinə yetirməyib)
    • 203 Non Authoritative İnformation (Soru uğurludur lakin başqa mənbədən nəticə qaytarılır)
    • *204 No Content (Soruğu uğurludur amma nəticə yoxdur)
  3. Redirection (Yöndərilən sorğuları bildirən status kodalrı)
    • 300 Multiple Choices (Serverdə sorğuya uyğun bir çox variant olduğunu göstərir)
    • 301 Moved Permonetly (Bir mənbənin həmşəlik başqa ünvana köçürüldüyünü və həmin yeni ünvana yönləndirildiyini bildirir)
    • 302 Moved Temporalily (Bir mənbənin müvəqqəti olaraq başqa ünvana köçdüyünü bildirir, ilkin ünvanın dəyişmədiyini bildirir)
    • 303 See Other (Fərqli bir mənbəyə GET sorğusunun göndərilməsi lazım olduğunu bildirir)
    • *304 Non Modified (İstənilən mənbədə əvvəlkindən fərqli yeni bir informasiyanın olmadığını bildirir və informasiya göndərilmir)
  4. Client Error (Göndərilən sorğu xətasını bildirən status kodları)
    • *400 Bad request (Sorğu səhv göndərilib)
    • *401 Unoutharized (Sorğu üçün profilə ehtiyac var)
    • 402 Payment Request (Ödənişə ehtiyac var)
    • *403 Forbidden (Mənbənin qadağan olunduğunu bildirir)
    • *404 Not found (Sorğu göndərilən ünvanın tapılmadığını bildirir)
    • *409 Conflict (Sorğu daxilində ziddiyət var)
    • 410 Gone (Mənbə yoxdur)
  5. Server Error (Server xətalarını bildirən status kodalrı)
    • *500 İnternal Server Error (Serverdə bir problem yarandı və sorğu cavablandırılmadı)
    • 505 HTTP Version not supported (HTTP Protokol versiyası dəstəklənmir)

 

* (ulduz) işarəsi “TOP-10” sorğuları göstərir

Qeyd: Azərbaycan dilində olan yazıların (Hətta türkcə), çox böyük bir hissəsi tərcümə, kopyadır. Ona görə də özünüzü ingiliscə oxumağa öyrəşdirməyiniz, ingilis dili öyrənməyiniz xahiş olunur.

Bu yazını yazarkən tərcümə, kömək aldığım linklər aşağıdakılardır:
1. https://www.mediaclick.com.tr/blog/http-server-durum-hata-kodlari-ve-anlamlari
2. https://www.restapitutorial.com/httpstatuscodes.html

OOP Java 22: Stack

Stack “Data structure” (Verilənlər strukturu) olub aşağıdakı formada extent/implement münasibətində olur:

(Şəklin mənbəsi)

Stack deyərkən last-in-ferst-out (sonuncu daxil olan ilk çıxar) başa düşülməlidir. Bunu da biz aşağıdakı şəkildə rahatlıqla görə bilərik:

(Şəklin mənbəsi)

Stack-in list yaradarkən aşağıdakı formada kodlardan istifadə edə bilərsiniz:

Stack<Integer> stackInteger = new Stack<>();
Stack<String> stackString = new Stack<>();

Stack-in əsas 5 metodu vardır:

  • boolean isEmpty(); – Stack listimizin boş olub olmadığını yoxlayır.
  • void push(Object item); – Stack-imizə yeni elemet əlavə edir.
  • Object peek(); – Stack listimizin sonuncu elemetini qaytarır.
  • Object pop(); – Stack listimizin sonuncu elemetini qaytarır və onu silir.
  • int search(Object item); – hansısa bir elementin stackdə varsa index-sini (yerini) qaytarır.

Gəlin bir ədəd nümunəylə məsələni yekunlaşdıraq:

import java.util.Stack;

public class Main {
	public static void main(String[] args) {
		Stack<Integer> stack = new Stack<>();
		System.out.println("Empty: " + stack);
		System.out.println("Empty: " + stack.isEmpty());
		
		stack.push(1001);
		
		System.out.println("Empty: " + stack);
		System.out.println("Empty: " + stack.isEmpty());

		stack.push(1002); 
		stack.push(1003);
		stack.push(1001);
		
		System.out.println("Non-Empty stack : "  + stack);
        System.out.println("Non-Empty stack: Pop Operation : "  + stack.pop());
        System.out.println("Non-Empty stack : After Pop Operation : "  + stack);
        System.out.println("Non-Empty stack : search() Operation : "  + stack.search(1002));
        System.out.println("Non-Empty stack : "  + stack.isEmpty());
	}
}

Android 46: Intentlə obyekt ötürmək

Xatırlayırsınızsa 27-ci yazımızda inentdən söz açmış, ardınca intent vasitəsiylə məlumat ötürmüş, almışdıq. Bu səfər isə intent vasitəsiylə obyekt ötürməyə çalışacağıq.

Gəlin “IntentObject” adında bir layihə başladaq, ardınca Student adlı sinif yaradaq. Bu bizim şagird üçün formalaşdırdığımız modelimiz olacaq. Daxilində şagiridn adı, soyadı, yaşı, oxuduğu sinif olacaq. Burada yaşı integer, digərləri String formada saxlanılacaq. Hamısı “private” olaraq qorunacaq, getter və setter (inkapsulasiya) istifadə ediləcək. Bura qədər olan hissəni özünüz həll edin. İndiyə qədər çox işləmişik. Bunu belə rahatlıqla edə bilmirsinizsə, bir problem var. Dostlar. Ciddən problem var. Yalandan üzdən oxuyub keçməyin. Nəyisə siz özünüz etməyi bacarmalısınız. Normal materialı bitirdik, xırdaçılıqlara keçirik. Siz artıq harasa staj üçün müraciət etmək yaşınızdasız, böyümək vaxtıdı. Bir iki aya iş üçün müraciət edəcəyik. Bərabər open source layihələr üzərində işləyəcəyik. Məni tək qoyacaqsınız? Olmaz helə. Hadi hadi. Yuxardakı linklərə keçid et bir də bax. Özün qurmağa çalış. Qura bilmirsən, araşdır, yenidən oxu, qur. Sonra sil. Heç bir yerə baxmadan yenidən qur. Sonra gəl yazının davamını oxu. Belə də, bəyənmirsən, boşdu, bu sayta göz at burdan öyrən. Əsas odu öyrən. Lap bilirsənsə, sən də yaz, izah etməyə çalış, blogunun linkini rəy yerinə qeyd et biz də gələk oxuyaq, biz də səndən öyrənək. Hamı hər şeyi bilir – ifadəsi doğru deyil. Mən “a”-nı bilirəm, sən “c”-ni, başqa biri “a”-nı məndən yaxşı bilir, “c”-ni səndən zəif. Yazsın, mən ondan “a”-nı öyrənim, sən də yaz ki, səndən “c”-ni öyrənsin. Söhbət açılmışkən, bu yaxınlarda kodrea komandası fəaliyyətə başladı, mediumdan tutmuş youtube-a qədər. Axtarış edin, tapın, onlardan öyrənin (mən də onarın materiallarını oxuyuram).

Qayıdaq mövzumuza. Burada Student sinfimiz Serializable sinfini implements etməlidir. Etdirin.

Burda diyanıb keçirik dizayna. Burada SecondActivity adlı activity yaradın. Xml-ində bir textView olsun (id vermək yadddan çıxamasın). Activity-də textView-i tanıdın (findViewById). Ardınca MainActivity-ə keçək. Onun xml səhifəsində bunlar olacaq: 4 ədəd editText, 4 ədəd textView, 1 ədəd Button. MainActivity-də isə editText və buttonları tanıdın. Yadınızdadı buttona klikləyərkən ediləcəklər proseslərini necə yazırdıq? Bilmirsizsə linkə klikləyib baxın. Həmin prosesi yerinə yetirdikdən sonra (Tamam, tamam kömək edim, setOnclickListener, ordanda new View.OnClickListener) Student sinfimizin obyektini yaradaq, editText-lərimizdəki məlumatları bir-bir obyektimizə ötürək. (Kodların hamısı sonda sizindir, özünüz etməyə çalışın.)

İndi intent yaradırıq. Ardınca putExtra ilə obyektimizi ötürürük, startActivity(intent)- yaddan çıxmasın. Bu hissə hazır. Keçirik SeconActivity-nin içinə. İntent yaradıb getIntent() edirik. İndi gələk əsas məsələyə. Normalda informasiya ötürəndə (ibtidai tip və ya String) necə idi? Onun üçün getExtra edirdik. Lakin indi getSerializableExtra() metodunu işlədcəyik. Ad tanış gəldi? Student sinfinə hansı sinfi implement etmişdik, bir bax gör? Aha, o. Əla.

Bir ədəd Student sinfinin obyektini təyin edək, intentin metodundan aldığımız obyekti buna mənimsədək (Student-ə casting edərək). Sonrada bunu ötürək textView-ə. Tadam: Bitdi.

Xeyir, bir ədəd String qaytaran toString() – metodu yazın SecondActivity daxilinə. İçdədə mətniniz ekranda necə görünsün, onu yazın. Və artıq bitdi.

Bu yazıdan da bu qədər. Kodlara burdan baxa bilərsiniz. Uğur ola!

 

 

Android 45: REST və SOAP

Əvvəl gəlin “REST nədir?” və “SOAP nədir?” suallarına qısa cavab verək, sonra aralarındakı fərqə baxarıq.

REST nədir?

REST (REpresentational State Transfer – Nümunə Status Transferi) HTTP ilə asan və sürətli şəkildə client-server əlaqəsi qura bildiyimiz strukturdur. REST üçün URL adresləri üzərindən əlaqələr qurulur, hər bir metod url adresi üzərindən fərqli olur. REST XML və ya JSON-dan istifadə edir (məlumat ötürmək üçün). Əsas da JSON-dan istifadə edilir. Çünki çox sürətli və azhəcimli olduğu üçün. [1]

SOAP nədir?

SOAP (Simple Object Access Protocol – Sadə Obyektə Giriş Protokolu) ən sadə formada internet üzərində az miqdarda məlumatları köçürmə protokoludur. SOAP mesajları XML formatında olub əsasən HTTP (Hyper Text Transfer Protocol) protokolundan (bəzən də TCP/IP) istifadə edilərək göndərilir. Burada diqqət edilməsi vacib olan nöqtələrdən biri SOAP bizi sadəcə XML formatından istifadə etməyə məcbur edir. [2]

REST və SOAP arasındakı fərqlər:

REST SOAP-dan daha sürətli və yüngüldür. [4] REST-i öyrənmək SOAP-a nəzərən daha sürətli və rahatdır. REST kiçik informasiyalar üçün istifadə edilir, SOAP böyük məlaumatlar üçün (Bu hissə necə də GET və POST-a oxşadı). [3] REST, SOAPdan daha az bant genişliyi və resurs tələb edir. [5]

Mənbələr:

[1] https://youtu.be/FlkGlHZZLTQ
[2] http://www.erenguvercin.com/2013/05/soap-ve-rest-mimarilerine-genel-baks.html
[3] http://kodkosesi.blogspot.com/2014/01/rest-vs-soap.html
[4] http://www.ateam-oracle.com/performance-study-rest-vs-soap-for-mobile-applications/
[5] https://www.javatpoint.com/soap-vs-rest-web-services
[6] https://blog.westmonroepartners.com/mobile-web-services-jsonrest-vs-xmlsoap/
[7] https://javapapers.com/web-service/rest-vs-soap/
[8] https://www.youtube.com/watch?v=pJxYARgvn7U
[9] https://stackoverflow.com/questions/6929180/rest-and-soap-webservice-in-android
[10] https://www.captechconsulting.com/blogs/soap-vs-rest-for-mobile-services

Android 44: Android Permissions

Android Permissions – deyərkən android tədbiqetmələrində istifadəçi tərəfindən verilən müəyyən icazələr nəzərdə tutulur. Misal üçün Düzəltdiyiniz tədbiqetməyə internet əlaqəsi lazımdırsa istifadəçidən internet istifadəsi üçün icazə almalısınız. Bunlara User-Permission deyilir, yəni istifadəçi icazələri.

Bu icazələr normal və təhlükəli olmaqla iki yerə ayrılır.

İnternte istifadəsi, Bluetooth istifadəsi, Alarm, Time zone (saat qurşağı) və bu kimi icazələr normal dərəcəli icazələrdi.

Kameradan istifadə, yaddaşdan istifadə, kalendardan istifadə, sms göndərmək və ya oxumaq kimi icazələr isə təhlükəli icazələr sayılır.

Təhlükəli deyərkən “Şəxsi məlumatların qorunması” baxımından təhlükəli. Bu kateoqriyalara buradan göz ata bilərsiniz.

Yaxşı, bu icazələri hara əlavə edəcəyik bəs? Əlbətdəki AndroidManifest səhifəmizə. Aşaıdakı şəkilə baxaq (şəklin mənbəsi):

<uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Əlavə olaraq bubu yazıya göz ata, bu videonu izləyə bilərsiniz.

Android 43: ActionBar və ToolBar

Əslində yazının adına baxıb axtardığınız informasiyanı bu yazıda görməyəcəyiniz üçün üzr istəyirəm. Bu ümumiyyətlə yazı deyil.

ActionBar:

ToolBar ActionBar-ın biaz daha üstün versiyasıdır deyə bilərik. Material Design ilə (Android API 21, Android 5.0) ilə gəlib.

Bu mövzu haqqında geniş mənbələr var, əvvəl türkc sonra ingiliscə olmaqla linklər aşağıda:

[1] https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-201/action-bar-eklemek
[2] http://www.androidevreni.com/material-design-toolbar-kullanimi/
[3] https://canaltinova.com/blog/gule-gule-action-bar-hosgeldin-toolbar/
[4] https://blog.xamarin.com/android-tips-hello-toolbar-goodbye-action-bar/
[5] https://www.appcelerator.com/blog/2013/09/using-androids-actionbar/

[6] https://youtu.be/kmUGLURRPkI