Activity, Intent i przechowywanie danych

Slides:



Advertisements
Podobne prezentacje
NIE TAKI KOMPUTER STRASZNY JAK GO MALUJĄ PODSTAWY OBSŁUGI KOMPUTERA.
Advertisements

Android WYKŁAD 3. Agenda Odtwarzanie stanu Activity Walidacja danych z widoków Przycisk "wstecz" Material Design Fragmenty Implementacja GUI opartego.
Tworzenie odwołania zewnętrznego (łącza) do zakresu komórek w innym skoroszycie Możliwości efektywnego stosowania odwołań zewnętrznych Odwołania zewnętrzne.
PRACA Z APLIKACJAMI SYSTEM PRZEMIESZCZANIA oraz NADZORU WYROBÓW AKCYZOWYCH EMCS PL 1.
Wyszukiwanie informacji w Internecie. Czym jest wyszukiwarka? INTERNET ZASOBY ZAINDEKSOWANE PRZEZ WYSZUKIWARKI Wyszukiwarka to mechanizm, który za pomocą.
ELEMENTY ZESTAWU KOMPUTEROWEGO
Niepewności pomiarowe. Pomiary fizyczne. Pomiar fizyczny polega na porównywaniu wielkości mierzonej z przyjętym wzorcem, czyli jednostką. Rodzaje pomiarów.
Poczta elektroniczna – e- mail Gmail zakładanie konta. Wysyłanie wiadomości.
Literary Reference Center Przewodnik
Model warstwowy OSI Model OSI (Open Systems Interconnection) opisuje sposób przepływu informacji między aplikacjami programowymi w jednej stacji sieciowej.
Instalacja nienadzorowana windows xp Jakub klafta.
Usługa ePodatki (MF) Michał Dobrzyński, Departament Informatyki MRPiPS tel
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Marek Kozłowski Ekosystem PBN. Wprowadzenie Polska Bibliografia Naukowa to portal Ministerstwa Nauki i Szkolnictwa Wyższego gromadzący informacje dotyczące.
Urządzenia i technologie mobilne. Tablet Mobilny komputer większy niż telefon komórkowy, którego główną właściwością jest posiadanie dużego ekranu z zastosowaną.
Moduł SDI – zasilanie węzłów IIP oraz wykorzystanie danych. Wprowadzenie. Szkolenie przeprowadzone w ramach projektu „TERYT 3 – Rozbudowa systemów do prowadzenia.
API jądra do obsługi przestrzeni użytkownika Co jest tematem tej prezentacji: Transport danych pomiędzy przestrzeniami użytkownika i jądra (asm/uaccess.h)
System operacyjny Renata P. System operacyjny - jest to zbiór nadrzędnych i niezbędnych programów umożliwiających pracę na komputerze. Jest on pośrednikiem.
Język Java Paweł Rajba
Dziedziczenie, polimorfizm, Interfejsy
Mikroprocesory.
Programowanie Obiektowe – Wykład 1
Ucz i ucz się z TIK!.
Przeglądarka stron WWW
Komunikacja ze szkołą i nauczycielami - dziennik elektroniczny
Schematy blokowe.
Podstawowe polecenia systemu
On-the-Fly Garbage Collection
Liczby pierwsze.
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Quick Tips Tutorial Jak uzyskać dostęp do raportów EBSCOhost i EBSCO Discovery Service w EBSCOadmin support.ebsco.com.
Akademia C# lab. 9 Zdarzenia i delegaty.
Programowanie obiektowe
Lekcja 1 – Hello World! Visual Studio, coś łatwego na początek 
Wstęp do Informatyki - Wykład 8
Kurs języka C++ – wykład 13 ( )
Dobieranie komputera Podzespoły.
PROGRAMY DO KONTROLI RODZICIELSKIEJ
Bartosz Kowkrak i Aleksander Szydłowski.
System operacyjny cz.2.
Git - system kontroli wersji
Bezpieczeństwo dostępu do danych w systemie Windows
Języki programowania.
Dynamics 365 CE i język TypeScript
SMB – Pierwszy projekt Michail Mokkas.
GRUPY DANYCH : Funkcje dostępne z poziomu GRUP DANYCH
The Game Engine For Mobile
Jak korzystać z usługi Video s i Raportu Kontaktów
Zaawansowana administracja systemem operacyjnym GNU/Linux
Zapraszamy do nowego programu PowerPoint
Koszyk danych.
SYSTEM KONTROLI FREKWENCJI
Podstawy informatyki Zygfryd Głowacz.
Zapraszamy do nowego programu PowerPoint
Zapraszamy do nowego programu PowerPoint
Strukturalne wzorce projektowe
SMB – Procesy i wątki Michail Mokkas.
SKJ Serwer WWW Michail Mokkas.
Zmienne i typy danych w C#
PGO Kolekcje Michail Mokkas.
Znajdowanie liczb pierwszych w zbiorze
POZNAJEMY PULPIT Opracowanie: mgr Barbara Benisz SP nr 20 w Rybniku
Obsługa bazy danych z poziomu phpMyAdmin
Autor: Magdalena Linowiecka
SMB - Fragmenty Michail Mokkas.
Asynchroniczne operacje I/O za pomocą IOCP
Najważniejsze operacje graficzne w programie GIMP
Platforma LearningApps
Najważniejsze operacje graficzne w programie GIMP
Platforma LearningApps
Zapis prezentacji:

Activity, Intent i przechowywanie danych Michail Mokkas

Context Klasa ta stanowi źródło informacji na temat środowiska aplikacji oraz jej zasobów Activity i Service dziedziczą po klasie Context Za jej pomocą można też m.in. : sprawdzić rozmiar przekątnej ekranu uzyskać dostęp do usług systemu tworzyć nowe obiekty (adapterów , listenerów) Możemy otrzymać kontekst na kilka sposobów (klasa musi dziedziczyć po Context): this getApplicationContext() getContext() getBaseContext()

Activity Jedna skoncentrowana czynność, którą użytkownik może wykonać. Główny komponent poprzez, który użytkownik wchodzi w interakcję z aplikacją. Może reprezentować: pełnoekranowe okienko okienko typu "floating window" okienko wbudowane w inne Activity - (Fragment) Posiada cykl życiowy i zależnie od jego przebiegu znajdować się w jednym z czterech możliwych stanów.

Activity kont. 1 Ogólne wskazówki co do efektywnego wykorzystania metod względem stanu Activity: onCreate() - statyczne definicje, tworzenie widoków, łączenie danych z listami itp. onRestart() - reinicjalizacja komponentów, które zostały wyczyszczone lub zlikwidowane w onStop(), odczytanie danych zapisanych podczas onStop() onStart() - rejestracja BroadcastReceivera, inicjalizacja stanu jakiegoś elementu graficznego onResume() - aktualizacja danych, rekalkulacja czynności związanych z funkcjonalnością Activity, odczytanie danych zapisanych podczas onPause()

Activity kont. 2 onPause() - zatrzymanie animacji w GUI, zapisanie danych do ponownego odczytu w onResume() onStop() - wyrejestrowanie BroadcastReceivera, zapisanie danych do ponownego odczytu w onRestart() onDestroy() - zakończenie wszelkich wątków związanych z Activity, zapisanie danych do ponownego odczytu w onStart() Warto zaznaczyć, że ponieważ statystycznie onPause wywoła się częściej niż onStop oraz onDestroy, to w tej pierwszej powinniśmy wybrać jedynie najistotniejsze dane do zapisu (wpłynie to korzystnie na szybkość działania aplikacji)

RecyclerView Wykorzystywane do tworzenia skrolowalnej listy z danymi. Powinna posiadać: Adapter, który linkuje strukturę danych wraz z jej zawartością z listą LayoutManagera, który zarządza rozmieszczeniem danych i wyglądem listy (opcjonalnie) DividerItemDecoration, który będzie rozdzielał elementy (np. poziomą linią)

Obiekt reprezentujący element (przykład) public class ListItem { private String name; private int price; private boolean checked; ListItem(String name, int price, boolean checked) { this.name = name; this.price = price; this.checked = checked; } void setName(String name) { this.name = name; } void setPrice(int price) { this.price = price; } void setChecked(boolean checked) { this.checked = checked; } String getName() { return name; } int getPrice() { return price; } boolean isChecked() { return checked; } }

RecyclerView (przykład) public class MainActivity extends Activity { private RecyclerView irv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); irv = (RecyclerView) findViewById(R.id.items_list); LinearLayoutManager rlm = new LinearLayoutManager(this); irv.setLayoutManager(rlm); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(irv.getContext(), rlm.getOrientation()); irv.addItemDecoration(dividerItemDecoration); MyAdapter rva = new MyAdapter(getItems(), this); irv.setAdapter(rva); } private List<ListItem> getItems() { List<ListItem> il = new ArrayList<ListItem>(); il.add(new ListItem("Item1", 10, true)); il.add(new ListItem("Item2", 5, true)); il.add(new ListItem("Item3", 32, true)); il.add(new ListItem("Item4", 13, false)); il.add(new ListItem("Item5", 51, true)); il.add(new ListItem("Item6", 89, false)); return il; } }

Adapter danych (przykład) cz. 1 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<ListItem> list; private Context context; public MyAdapter(List<ListItem> lil , Context ctx) { list = lil; context = ctx; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder h, int position) { ListItem li = list.get(position); h.name.setText(li.getName()); h.price.setText("" + li.getPrice()); if (li.isChecked()) { h.bought.setChecked(true); } else { h.bought.setChecked(false); } } @Override public int getItemCount() { return list.size(); }

Adapter danych (przykład) cz. 2 public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView name; public TextView price; public CheckBox bought; public ViewHolder(View view) { super(view); name = (TextView) view.findViewById(R.id.tv_name); price = (TextView) view.findViewById(R.id.tv_price); bought = (CheckBox) view.findViewById(R.id.tv_bought); view.setOnClickListener(this); bought.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { Toast.makeText(MyAdapter.this.context, name.getText()+ "is bought!", Toast.LENGTH_LONG).show(); } else { } } }); } @Override public void onClick(View v) { Toast.makeText(MyAdapter.this.context, "Selected item is" + name.getText(), Toast.LENGTH_LONG).show(); } } }

Wynik (Lista w Activity)

Intent Jeden z podstawowych elementów, z których budujemy aplikacje androidowe Często używany do uruchamiania kolejnych aktywnośći (Activities) w aplikacji Może także służyć jako sposób komunikacji pomiędzy komponentami (Service, Activity) lub aplikacjami w sposób asynchroniczny

Intent kont. 1 Przejście do kolejnej aktywności: Odpalenie usługi (Service): Intent intent1 = new Intent(this, SecondaryActivity.class); startActivity(intent1); Intent intent2 = new Intent(this, MyService.class); startService(intent2);

Intent kont. 2 Typy Intent: Jawne (explicit): Niejawne (implicit): Użytkownik ma możliwość wyboru aplikacji, za pomocą której dokona dalsze akcje (np. przeglądarka do wyświetlenia strony Google) Intent intent1 = new Intent(this, SecondaryActivity.class); startActivity(intent1); Intent intent3 = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));

Intencje kont. 3 Wymiana danych: Przesłanie z MainActivity: Otrzymywanie w SecondaryActivity: Intent intent4 = new Intent(This, SecondaryActivity.class); intent4.putExtra("val1", 1); intent4.putExtra("val2", 2); Intent intent = getIntent(); int value1 = intent.getIntExtra("val1", 0);

Sposoby przechowywania danych Shared Preferences (para: id + wartość) Internal Storage (pamięć wewnętrzna) External Storage (pamięć zewnętrzna) SQLite Database (baza danych) Network Service(usługa sieciowa)

Shared Preferences Nadaje się do przetrzymywania prymitywnych typów danych (boolean, float, int, String, long) Dane zostaną przechowane pomiędzy sesjami (nawet jeżeli aplikacja zostanie zatrzymana) Przeznaczone głównie do przechowywania informacji o ustawieniach Dane są współdzielone ze wszystkimi komponentami aplikacji

Shared Preferences kont. 1 Aby skorzystać z Shared Preferences, należy zinicjalizować objekt SharedPreferences za pomocą jednej z metod: getSharedPreferences(pref_name): jeżeli potrzebujemy kilku osobnych plików preferencyjnych getPreferences(): jeżeli będziemy korzystać tylko z jednego pliku preferencyjnego

Shared Preferences kont. 2 Aby zapisać wartości w dowolnym Activity: 0 = MODE_PRIVATE //dostępne tylko z poziomu tej samej aplikacji (lub aplikacji o tym samym user ID) Editor - interfejs modyfikujący wartości SharedPreferences. Aby odczytać wartości z dowolnego Activity: Boolean bool = true; SharedPreferences settings = getSharedPreferences("preference_name", 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("val1", bool); editor.apply(); SharedPreferences settings = getSharedPreferences("preference_name", 0); boolean val1 = settings.getBoolean("val1", false);

Pamięć wewnętrzna Istnieje możliwość bezpośredniego zapisu danych w pliku na pamięci wewnętrznej urządzenia Domyślnie, pliki zapisane na pamięci wewnętrznej są prywatne dla naszej aplikacji (inne aplikacje nie mają prawa dostępu) Użytkownik także nie ma do nich dostępu Po odinstalowaniu aplikacji, pliki te są usuwane

Pamięć wewnętrzna kont. 1 Zapis: String str = getString(R.string.text1); FileOutputStream fos = null; try { fos = openFileOutput(getString(R.string.filelocation), Context.MODE_PRIVATE); fos.write(str.getBytes()); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

Pamięć wewnętrzna kont. 2 Odczyt: String str = ""; File file = new File(R.string.filelocation); int character; try { FileInputStream fis = new FileInputStream(file); while((character = fis.read()) != -1){ str+=(char)character; } fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

Pamięć wewnętrzna kont. 3 Tryby zapisu: MODE_PRIVATE: tworzy i/lub nadpisuje plik (ustawia by był prywatny) MODE_APPEND: dopisuje do końca pliku do dodania dwóch na raz wystarczy wykrozystać operator OR | MODE_WORLD_WRITEABLE: pozwala na dostęp oraz nadpisywanie tego pliku innym aplikacjom MODE_WORLD_READABLE: pozwala na dostęp i możliwość odczytania zawartości tego pliku innym aplikacjom

Pamięć wewnętrzna kont. 4 Metody pomocnicze: getCacheDir(): wykorzystywane do tymczasowego przechowywania danych getFileDir(): zwraca pełną ścieżkę katalogu w którym znajdują się pliki (na wewnętrznej pamięci) getDir(): tworzy lub otwiera wcześniej stworzony katalog na wewnętrznej pamięci deleteFile(): usuwa plik fileList(): zwraca listę plików, które dana aplikacja zapisała

Pamięć zewnętrzna Zwykle jest to wymienna karta SD Może być w każdej chwili wyjęta z urządzenia Nie każde urządzenie posiada tego typu pamięć Dodatkowo, jeżeli urządzenie jest podpięte do komputera i jego zewnętrzna pamięć zamontowana do przeglądu, uniemożliwia to jej użytkowanie w innych celach

Pamięć zewnętrzna kont. 1 Aby uzyskać dostęp do pamięci zewnętrznej, nasza aplikacja powinna w AndroidManifest zawierać: android.permission.READ_EXTERNAL_STORAGE Dodatkowo, by mogła tworzyć i/lub zapisywać pliki: android.permission.WRITE_EXTERNAL_STORAGE Zezwolenia te nie są potrzebne, jeżeli: przeglądamy/zapisujemy prywatne pliki naszej aplikacji (możliwość ta jest dostępna od wersji KitKat) Do uzyskania ścieżki korzystamy z metody: getExternalFilesDir()

Pamięć zewnętrzna kont. 2 Pliki publiczne powinny znajdować się w publicznie dostępnych katalogach, jak np. Music/ i Pictures/ Powyższy fragment kodu tworzy katalog na nowy album ze zdjęciami Dodatkowo także i tu mamy możliwość utworzenia tymczasowych plików getExternalCacheDir() File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "gallery_name"); file.mkdirs();

Baza danych Android w pełni wspiera SQLite Po stworzeniu bazy danych przez aplikację, mamy do niej dostęp z poziomu każdej z jej klas Rekomendowanym sposobem tworzenia bazy danych jest stworzenie subklasy SQLiteOpenHelper i przesłonięcie (override) metody onCreate() W metodzie onCreate() możemy wykonać polecenia SQL tworzące tabele w bazie danych

Baza danych kont. 1 public class DBOpenHelper extends SQLiteOpenHelper{ private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "table_name"; private static final String TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + " (" + "kolumna1" + " TEXT, " + "kolumna2" + " TEXT);"; DBOpenHelper(Context context){ super(context, context.getString(R.string.db_name), null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db){ db.execSQL(TABLE_CREATE); } }

Baza danych kont. 2 Następnie tworzymy instancję tej klasy i korzystamy z metod: getWritableDatabase() getReadableDatabase() Obydwie z nich zwracają nam obiekt reprezentujący bazę danych, który udostępnia dodatkowe metody potrzebne do zadań bazodanowych (insert, delete, update, itp.) Możemy wykonywać zapytania za pomocą metod query(), które zwrócą nam obiekt Cursor (zestaw wyników)

Baza danych kont. 3 Przykład dla operacji insert : ContentValues cv = new ContentValues(); cv.put(ITEM_NAME_FIELD, editTextItemName.getText().toString()); cv.put(PRICE_FIELD, Integer.parseInt(editTextItemPrice.getText().toString())); db.insert(TABLE_NAME, null, cv); db.close();

Content provider Zazwyczaj tworzony po to, aby umożliwić dzielenie się danymi (przechowywanymi w bazie danych) z innymi aplikacjami Aby uzyskać dostęp do danego content providera, musimy go uwzględnić w AndroidManifest.xml Musimy znać konkretny URI (Uniform Resource Identifier) Warto używać synchronized przed nazwami metod korzystających z content providerów (dopuści tylko jeden wątek na dostęp w tym samym czasie)

Przykład – Historia połączeń String[] projection = new String[]{CallLog.Calls._ID, CallLog.Calls.NUMBER}; Cursor query = getApplicationContext() .getContentResolver() .query(CallLog.Calls.CONTENT_URI, projection, null, null, null);//selection, selectionArgs, sortOrder StringBuilder builder = new StringBuilder(); for(String s : query.getColumnNames()){ builder.append(s+" "); } Log.i("Call History", builder.toString()); query.moveToFirst(); Log.i("Call History", query.getString(0)+" "+query.getString(1)); query.moveToNext(); Log.i("Call History", query.getString(0)+" "+query.getString(1));