Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Activity, Intent i przechowywanie danych

Podobne prezentacje


Prezentacja na temat: "Activity, Intent i przechowywanie danych"— Zapis prezentacji:

1 Activity, Intent i przechowywanie danych
Michail Mokkas

2 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()

3 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.

4 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()

5 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)

6 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ą)

7 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; } }

8 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; } }

9 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(); }

10 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(); } } }

11 Wynik (Lista w Activity)

12 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

13 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);

14 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("

15 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);

16 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)

17 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

18 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

19 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);

20 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

21 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(); }

22 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(); }

23 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

24 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

25 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

26 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()

27 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();

28 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

29 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); } }

30 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)

31 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();

32 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)

33 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));


Pobierz ppt "Activity, Intent i przechowywanie danych"

Podobne prezentacje


Reklamy Google