Sunteți pe pagina 1din 11

Curs 1

Ierarhia de fisiere:

/cache -> datele cache


/sdcard -> aplicatii , poze , etc.
/system -> fisierele OS-ului (exceptie facand kernel-ul)
/data -> datele user-ului (contacte , mesaje , setari)

Formatul APK (Application Package File)


-> este o arhiva ZIP

\META-INF

\lib

\res

\assets

AndroidManifest.xml

Fisierele cu '.dex' contin toate infomatiile necesare pentru Dalvik VM pt a executa


codul

DEX files:
-Header (CheckSum,SHA,..)
-String Indexes
-Type Indexex
-Prototype Indexes
-Field Indexes
-Method Indexes
-Class Definition
-Data (dex code,strings, classed )

Fiecare aplicatie Android are multiple componente cum ar fi:


-Activites
-Services
-Content Providers
-Broadcast Receivers

Fiecare aplicatie Android poate porni alta aplicatie Android prin intermediul
Intent-urilor
Fiecare aplicatie ruleaza in propriul sau proces , fiecare avand cate un Dalvik
VM .
Fiecare proces are un rank. Cu cat este mai important procesul cu atat este mai
mica sansa sa fie oprit (KILL) de catre sistem
Sunt 5 tipuri de procese:
1.Foreground process (Proces de prim-plan)
-o Activitate ce interactioneaza cu user-ul
2. Visible process
3. Service process
-are un serviciu
4. Background process
- o activitate ce a fost oprita
5. Empty process
-folosit in scop de cache-ing
AndroidManifest contine:
- permisiunile
- lista de activitati/servicii/receiveri/provideri

Curs2

Activity Life Cycle


->onCreate(Bundle savedInstanceState)

=> setContentView(R.layout.main_activity)
->seteaza layout-ul activitatii

In fisiserul 'R' putem vedea ce ID unic a fost atribuit fiecarui element

!!!! View este parintele tuturor claselor ce se refera la un elemetn de UI !!!!

-> exista in clasa View niste functii ce ar putea fi suprascrise

Un view poate fi construit in doua moduri:


- XML Design
- sau programatic prin cod

Exista mai multe tipuri de layout:


- FrameLayout : afiseaza un singur element (intr-un frame)
- LinearLayout : aranjeaza elemente din cadrul sau pe linie/coloane
- RelativeLayout : aranjeaza elementele in raport cu alt element
- TableLayout : aranjeaza elementele ca intr-un tabel
- GridLayout : aranjeaza elementele ca intr-un grid

Parametri pentru layout-ul view-urilor:


-android:layout_width:
-android:layout_height:
-> fill_parent (DEPRACETED) Inlocuit cu match parent
-> match_parent : la fel de mare ca printele
-> wrap_content : atat de mare cat sa isi poata afisa continutul + elementele
de padare
-> px, mm, ,in(inches) dp(density indepentent pixels)

android:id="@id+/nume_element" =>utilizat pentru a indentifica obiectul cu


findViewById(R.id.ceva)
android:enabled
android:onClick -> setam un listener pe evenimentul de onClick
android:gravity="bottom/center/top/right/center_horizontal"
android:layout_column="2" ->

LinearLayout -> android:orientation=vertical/horizontal


<TableLayout>
<TableRow>
android:layout_span="2" -> pe cate coloane sa se intinda
</TableRow>
</TableLayout>

You can shrink all columns by using the value "*" instead.

Relative Layout:
->layout_toRightOf :Positions the left edge of this view to the right of the given
anchor view ID
->layout_toLeftOf
->layout_above :Positions the bottom edge of this view above the given anchor view
ID
->layout_below : ma pozitione sub elementul dat ca referinta
->layout_alignLeft: Makes the left edge of this view match the left edge of the
given anchor view
->layout_alignTop
->layout_alingRight
->layout_alignBottom
->layout_alignParentLeft="true/false"->colt
stanga_sus_element=colt_stanga_sus_parint
->layout_alignParentRight
->layout_alingParentTop
->layout_alignParentBottom
->layout_marginLeft
->layout_marginRight => setez unde sa fie marginile
->layout_marginTop
->layout_marginBottom

Curs 3

Putem defini style-uri , in loc sa scrie tot style-ul in-line , in scriem intr-un
fisier separt apoi il setam ca si stim elementului

<Button
style=@style/myStyle
/>

** Fisierele 'Style' vor fi puse la path-ul:


res\values-xxx\styles.xml

In interiorul lui putem defini mai multe stiluri

Ex:

<style name="myStyle" parent="">


<item name="android:backgroud">#RGB </item>
<item name="property_name">property_value </item>
</style>

<style name="anotherStyle" parent="">

</style>

Stilul scris in-line are o prioritate mai ridicata decat scris intr-un fisier
'Style'

Meniuri

Exista 3 tipuri de meniuri:


a)Options Menus : (cele trei puncte din ActionBar)
b)Contextual menu : Asociate cu longClick pe un obiect de tip view
c)Popup menus

Le vom defini folosind XML-uri in folderul \res\menu


Uzual , contin urmatoarele item-uri
- <menu> -> identifica un menu container
- <item> -> identifica un item dintr-un menu containter
->
- <group> -> folosim pentru a defini un grup de cateva item-uri

Options Menu

-> trebuie sa implementam 2 metode


1) onCreateOptionsMenu(Menu menu){

getMenuInflater().inflate(R.menu.main,menu);
return true;
}

2) onOptionsItemSelected(MenuItem item){
item.getItemId() -> pentru a obtine id-ul item-ului de a fost
selectat
return true;
}

-> putem avea un submeniu intr-un meniu


<menu>
<menu>
</menu>
</menu>
INSA nu pute avea SUB-MENIU in SUB-MENIU

Contextual Menus

-> este un meniu asociat unui obiect de tip view

Trebuiesc urmati urmatorii pasi:

a) Creez un MenuXML
b) Atribui meniul unui obiect:
Button b1=(Button) findViewById(R.id.button1)
registForContextMenu(b1)

c) onCreateContextMenu(ContextMenu menu ,View v, ContextMenuInfo


menuInfo){
super.onCreateContextMenu(menu,v,menuinfo);
getMenuInflater().inflate(R.menu.contextual_menu,menu)
}

d) onContextItemSelected(MenuItem item){
item.getItemId()
}
Curs4

AlertDialog:
->similarul lui MessageBox

new AlertDialog.Builder(this)
.setTitle()
.setMessage()
.setIcon()
.setPositiveButton("Ok", new DialogInterface.OnClickListener(){})
.setItems(new CharSequence[]{'Item1','Item2','Item3'},new
DialogInteface.OnClickListener({
public void onClick(DialogInterface dialog,int which){
which -> face referire la ce item din lista a fost selectat
}
}))
.setMultipleChoiceItems( new CharSequence[]{'Item 1','Item 2',"Item
3"},
new boolean[] {true,false,true} ->
default checked,
new
DialogInteface.OnClickListener({
public void
onClick(DialogInterface dialog,int which,boolean isSelected){
which -> face referire
la ce item din lista a fost selectat
}
)
)
.setSingleChoiceItems(
new CharSequence[]{'Item 1','Item
2',"Item 3"},
1 -> index-ul item-ului ce va fi
selectat default
new
DialogInteface.OnClickListener({
public void
onClick(DialogInterface dialog,int which,boolean isSelected){
which -> face referire
la ce item din lista a fost selectat
}
)
)

.setView(getLayoutInflater().inflate(R.layout.alert_layout,null))
-> in modul aste ne putem face noi un CUSTOM_ALERT

.setCancelable(false)
-> dezactiveaza optiune de back a butonului fizic
-> default , putem inchide nu AlertDialog prin intermerdiul
apasarii butonului back

.show()
->putem sa nu avem nici un buton , sa avem doar titlul sau doar mesajul

Toast
new
Toast.makeText(context(this),"Mesaj",lungime(Toast.Length_Short,Toast.Length_Long))
.setView(getInflater().inflate(R.layout.toast_layout,null))
-> in acest mod putem creea CustomToasts
.show()

Intent:
-este un obiect ce contine urmatoarele informatii:
-Component name : Componenta ce trebuie sa primeasca acest intent si sa il
proceseze
-Action : Un string cu actiunea ce poate sa o indeplineasca
-Data
-Category
-Extra : Perechi (cheie,valoare) ce sunt transmise intre intent-uri
-Flags

Ex:
Intent intent= new Intent("<action>")
Intent intent= new Intent("<action>",URI)
Intent intent= new Intent(Context,Class)

startActivity(Intent)
startActivityForResult(Intent,requestCode)
-> Activitatea deschisa trebuie sa:
@Override
public void finish(){
Intent data= new Intent();
data.putExtra("Return1","Return value")
setResult(RESULT_OK,data)
super.finish()
}

-> in activitatea parinte pentru a vedea ce code a intors intent-


ul deschis

protected void onActivityResult(int requestCode,int


resultCode, Intent intent)

Intent pentru:
-Folosirea camerei:

Intent imageIntent= new Intent(MediaStore.Action_Image_Capture)

MediaStore.Action_Video_Capture
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new
File('....')))
startActivityForResult(imageIntent,1278)

Curs 6.Storage
Sunt 5 metoda de storage pentru sistemele bazare pe Android:

1) SharedPreferences : Stocheaza informatia sub forma unui dictionar


2) InternalStorage : Stocheaza datele in memoria interna a device-ului
3) ExternalStorage : Stocheaza datele in memoria externa a device-ului(SD-
CARD)
4) SQLLite DB
4) Via network

1)SharedPreferences
-> folosim clasa SharedPreferences
-> avem la dispozitie 2 metode ce ne intorc un 'SharedPreferences':
- getSharedPreferences("myprefs",0)
-> trebuie specificat numele preferintei de care avem nevoie
- getPreferences(0)
-> daca am nevoie doar de o preferinte pt fiecare activity
-> fisierul de preferinte va avea acelasi nume ca si Activity-ul

-> pot scrie/citi date din clasa SharedPreferences


Ex:
getBoolean,getFloat,getInt,getDouble,getString,getStringSet
putBoolean,putFloat,putInt,putDouble,putString,putStringSet

Pentru editarea valorilor avem nevoide de un obiect SharedPreferences.Editor


Ex:
SharedPreferences sharedPreferences= getPreferences(0)
SharedPreferences.Editor edit= sharedPreferences.edit()
edit.putInt(...)
................
edit.commit()

-> avem posibiliatea de a creea un Activity special pentru vizualizarea si


editatea preferintelor
Pasi:
-creem un my_pre]ferences.xml file in \res\xml
<PreferenceScreen>
<EditTextPreference
android:key -> trebuie neaparat deoarece
SharedPrefereces= Un DICTIONAR
>
<ListPreference
android:title
android:key
android:summary>

-creem o activitate de extinde PreferenceActivity


-la onCreate()
getPreferenceManager().setSharedPreferences("my_prefs")
addPreferencesFromResource(R.xml.my_prerences)

2)InternalStorage
-> fisierele salvate aici pot fi accesate doar de aplicatia care le-a creat
-> odate ce aplicatia a fost dezinstalata , toate fisierele aferente , ce au
fost salvate anterior, vor fi sterse
-> Ex:
FileOutputStream fos=
openFileOutput("internal_file.xml",Context.ModePrivate);
fos.write("test".getBytes());
fos.close();

3) ExternalStorage
-> avem nevoie de permisiunea "WRITE_EXTERNAL_STORAGE"
-> pentru a obtine path-ul catre ExternalStorage:
File path =Environment.getExternalStorageDirectory();

4)SQLLite
-> SQLLiteDatabase db;
SQLLiteOpenHelper helper= new SQLliteOpenHelper(.......) -> trebuie
implementate 2 metode
db=helper.getReadableDatabase();
db=helper.getWritableDatabase();
db.execSQL(".........."");

Curs7.Sensors

Obiecte in legatura cu senzorii:

SensorManager
Sensor
SensorEvent
SensorEventListener

Doua tipuri de senzori:


a) Streaming Sensors : returneaza date la un anumit interval
b) Non-streming : returneaza date doar atunci cand sufera o modificare

Pentru a vedea de ce tip este senzorul:


=> gerMinDelay() ==0 => Non-Streaming

Avem nevoie de un SensorManager pentru a accesa senzorii

SensorManager sensorManager = (SensorManager)


getSystemService(SENSOR_SERVICE);
Sensor accerometerSensor =
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener((SensorEventListener) this, accerometerSensor,
SensorManager.SENSOR_DELAY_NORMAL);

List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);


for (Sensor sensor : sensors) {
Log.v("TAG", String.format("Name:%s , vendor:%s", sensor.getName(),
sensor.getVendor()));
}

-> trebuie sa am grija sa scot listener0ul la on pause , on stop ,si la il


repornesc la onResume
Location

->avem nevoie de permisiunile: android.permision.ACCESS_FINE_LOCATION/INTERNET


->LocationManager,LocationListener

LocationManager locationManager = (LocationManager)


getSystemService(LOCATION_SERVICE);
boolean gps =
locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean internet =
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
3000, 5, this);

public void onLocationChanged(Location l) {


Log.v("TAG",String.format("Location changed: Long:%f,Lat:%f",
(float)l.getLongitude(),(float)l.getLatitude()));
}

Sound
-> doua modalitati de a utiliza sound managerul din Android

a) Clasa MediaPlayer : folosita pentru fisiere audio mai mari


b) Clasa SoundPool : folosita pentru fisiere audio mici (cateva secunde)

->fisiere trebuies puse in res/raw

Curs8.Camera

-aceasta poate fi accesata prin intermediul unui intent sau direct prin intermediul
obiectului Camera
-am nevoie de niste permisiuni:
-android.permision.CAMERA
-android.hardware.camera
-android.permision.RECORD_AUDIO (aceasta daca am nevoie sa inregistrez si
sunetul)
Camera.open()
Camera.open(cameraID)

Pasi:
1) Obtin o instanta de tip Camera
2) Preview
3) Take a picture/video

Am nevoie de o clasa:

public class CameraPreviewSurface extends SurfaceView implements


SurfaceHolder.Callback{
private PictureCallback pictureCallbackObject= new PictureCallback(){

@Override
public void onPictureTaken(byte[] data,Camera camera){

public void TakePicture(String fileName){


if(cameraObject!=null){
pictureFileName=filename

cameraObject.takePicture(null,null,pictureCallbackObject);
}
}
}
}

Curs9.SMS

SMSManager -> obiect ce poate fi folosit pentru a trimite SMS-uri programatic


Avem nevoie de urmatoarele permisiuni:
- android.permission.SEND_SMS
- android.permission.WRITE_SMS

Ex:
SmsManager smsManager = SmsManager.getDefault()
smsManager.sendTextMessage(number, null,text,null,null)

Primrea de SMS-uri
-am nevoie de permisiuni
android.permission.RECEIVE_SMS

Get all contacts list


-am nevoie de urmatoarea permisiune
android:permission.READ_CONTACT

Create a contact
-am nevoie de urmatoarea permisiune
android:permission.WRITE_CONTACT

Curs10

Intent intent= new Intent(........)


PendingIntent pendingIntent= PendingIntent.getActivity(this,0,intent,0)

NotificationCombat.builder=NotificationCompat.Buildet(this)
builder.setContentIntent(pendingIntent)

NotifyManager notificationManager=getSystemService(Notification_Service)
notificationManager.notify(1234,builder.build())

JNI

Folosirea unei functii din C in Java

1) Create a wrapper class in Java

public class MyWrapper {


static{
System.LoadLibrary("my_library");
}

public static native void function_1(int param1,int param2);


public static native void function_2();
public static native char function_3(int param1);

2) JNIEXPORT void JNICALL Java_com_teststudento_MyWrapper_function_1(JNIEnv* env,


jobject obj, jint
param1 , jint param2)

JNIEXPORT void JNICALL path_spre_functie(JNIEnv* env , jobject obj , parametri)

jobjectArray

jclass = env->FindClass()
jstring = env->NewStringUTF("")

jmethodID classMethod= env->GetMethodID(env,classObject,"<function


name>","(Ljava/lang/String;)Ljava/lang/String;"

jobject result=env->CallObjectMethod(env,obj,classMethod,txt)

S-ar putea să vă placă și