- Bluetooth-headsetekről általában
- Samsung Galaxy A71 - elég ennyi?
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Milyen okostelefont vegyek?
- Fotók, videók mobillal
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Yettel topik
- iPhone topik
- Telekom mobilszolgáltatások
- Motorola Moto G24 Power - hol van az erő?
Hirdetés
-
Miniképernyős, VIA-s Epomaker billentyűzet jött a kábelmentes szegmensbe
ph A megfizethető, szivacsokkal jól megpakolt modell ötfajta kapcsolóval és kétféle színösszeállítással/kupakprofillal szerezhető be.
-
Olcsó 5G-s ajánlatot nyújt a Realme Indiának
ma Megérkezett a Realme C65 5G, az első készülék a MediaTek Dimensity 6300-zal.
-
A személyre szabott reklám lehet a streaming következő slágere
it A jobb célzott hirdetések érdekében adatplatformot indít a Warner Bros Discovery.
Új hozzászólás Aktív témák
-
Karma
félisten
Semmi sincs kőbe vésve. Bármikor nyomhatsz egy New -> Activityt, ott kiválaszthatod megint a szimpatikus sablont, sőt még launcher activitynek is jelölheted. Az AndroidManifest.xml-ben elég látványos, mi alapján kerül a launcherbe valami, kézzel is oda rakhatod, ahova kell.
Egyébként javaslom ezt a cikket végigolvasásra és alapnak felhasználásra. A Design Support Library elég sok nüanszán végigvezet.
“All nothings are not equal.”
-
rgeorge
addikt
válasz Oppenheimer #3298 üzenetére
Vajon mennyibe fog ez kerülni? A már említett Xamarin nem olcsó.
Picard: "What we leave behind is not as important as how we've lived. After all, Number One, we're only mortal." Riker: "Speak for yourself, sir. I plan to live forever."
-
thon73
tag
Véleményt szeretnék kérni:
Van egy Service (InputMethodService). A feladatokhoz a Service metódusai szükségesek. Ezért egy elég gigantikus (adat) osztályhalmaz (melyet a Service rak össze) minden egyes példányának átadtam a Service-t, hogy meg tudja hívni a metódusait. Kicsit hasonlóan, ahogy a Context utazik.De:
A Service egyúttal egy singleton is. Megtehetem-e, hogy a Service-n belül egy static metódus visszaadja magát a service-t, és akkor nem kellene az egész osztály-kaszkádon végig átadnom a címét?
Igazából nem látom, hogy ez miért ne működne (ugyanúgy mint egy sima singletonnál), de valamiért mégsem látok erre példát. Pl. a context-et miért nem oldották meg ugyanígy?
Köszönöm, ha útba igazítotok!
-
Szmeby
tag
A Servicenek van állapota?
Amúgy próbáld meg unit tesztelni a singletonra hivatkozó osztályaidat, és rájössz, miért nem jó.
Persze a célnak megfelel, csupa static hivatkozással is lehet programot építeni, a sok hülye meg erőlteti itt az objektumokat, mi?Én nem érteni Android, de minek van a context, ha abból sem nyerhető ki a kívánt service?
-
thon73
tag
Köszönöm. Bár ezzel a válasszal nem sokra mentem.
Megpróbálom kicsit érthetőbben elmagyarázni. Az InputMethodService több billentyűzet adatait tartalmazza a nagyjából a következő módon:
InputMethodService - KeyboardView - GeneralKeyboardData - Keyboard - Button - Text
Természetesen egy kicsit összetettebb az egész, de a sor minden egyes gomb esetén ezen alaposztályok leszármazottaiból áll össze. A sor végén álló "Text" pl. definiálja az "A" karaktert (néhány egyéb tulajdonsággal, pl. hogy . után legyen nagy, meg ilyesmi.)
A mi szempontunkból az egyetlen lényeges dolog, hogy amikor a "Text" osztály el szeretné küldeni az 'A' karaktert, akkor az InputMethodService osztály metódusaira van szüksége. (Amire viszont senki másnak.)
Eddig pont ugyanúgy oldottam meg, ahogy pl. a Context-nél történik (Tehát nem a service-t szerettem volna contextből kinyerni.), vagyis az InputMethodService szépen végigutazott az egész soron, és az összes "Text" példány tárolta a hivatkozást, hogy tudjon kommunikálni.
A változáson pedig azért kezdtem el gondolkodni, mert szerettem volna az egész adatstruktúra legenerálását leválasztani a Service-ről. Emiatt viszont az InputMethodService nem áll rendelkezésre akkor, amikor az adatstruktúra elkészül.
Több lehetőséget találtam:
Amikor a kész adatstruktúrát a Service-hez kapcsolom, végigmegyek az összes elemen és megadom az InputMethodService-t.
Vagy egyedül a GeneralKeyBoardData (az adatstruktúra legalsó eleme) kapja meg, és a Text ettől kérdezi le.
Vagy valahogy kiszedem az InputMethodService hivatkozását magából az InputMethodService-ből, amiből egyébként egyetlen van, és addig folyamatosan él, amíg nem váltok másik billentyűzetre (ilyenkor viszont az adatstruktúra sem létezik tovább.)Amúgy eddig az "erőltetett objektumokkal" szépen működik, de azt gondoltam, kell legyen ennek egyszerűbb módja is. Csak éppen még nem jöttem rá, mi az, ezért kértem segítséget az utolsó elgondoláshoz.
((A fentiektől függetlenül filozófiailag "sok hülye meg erőlteti itt az objektumokat" kijelentésnek igen komoly háttere van. Nagyon sok, nálamnál sokkal komolyabb programozó vitatja az objektum-orientált programozás előnyeit szemben a hagyományos, lineáris programozással. Mielőtt mindenki nekem ugrana és szétszedne, nem állást foglaltam mellettük, csak tényként megemlítettem ezt az iskolát is. Én ugyan nem tudom megítélni, de valószínűleg amúgy a java egy objektum-orientált android környezetben nem is alkalmas erre.))
-
Szmeby
tag
"Bár ezzel a válasszal nem sokra mentem."
Szóval van állapota? Van unit teszt?De mindegy is, inkább írok.
A singleton önmagában nem ördögtől való. Probléma akkor lehet, ha van állapota, és azt a tőle függő komponensek változtathatják. Ugyanis ha a sigletonban van field, és az nem csak olvasható, akkor nem tudod előre megjósolni, hogy a singletonod éppen milyen állapotban van, mivel azt a komponensek kedvük szerint állítgatják. Sztochasztikussá válik a viselkedése. Ugyanez igaz a random vagy az idő használatára is. A random viselkedés pedig rejtett bugokat szül.
Info: shared global stateTegyük fel, téged ez a veszély nem fenyeget, mert nincs benne field, vagy az csak olvasható. Ilyenkor még mindig probléma lehet, ha a singletont használó osztályaidat (unit) tesztelni akarod. Pl.:
public class MyClass {
//...
public String doingSomethingCool(String id) {
Entity e = MyDatabaseAccessorSingleton.getInstance().findById(id);
// ...
return coolStuff;
}
}Hogyan teszteled a metódust, ha nem szeretnél mellette egy működő adatbázist is futtatni. Sajnos sehogy.
Lehetséges megoldás:
public class MyClass {
private final MyDatabaseAccessorSingleton db;
public MyClass(MyDatabaseAccessorSingleton db) {
this.db = db;
}
//...
public String doingSomethingCool(String id) {
Entity e = db.findById(id);
// ...
return coolStuff;
}
}A teszt immáron helyettesítheti az adatbázisos objektumot egy teszt double (mock) példánnyal. Ez esetben viszont már megkérdőjelezhetővé válik, hogy valóban szükséges-e singletonként definiálni azt. De ez már messzire mutat.
Leszámítva a fenti két problémát a singleton egy tök jó pattern, és bátran alkalmazhatod, ha szükségét látod. Csak ésszel kell csinálni.
Ez talán válasz arra a kérdésedre, hogy a contextet miért nem oldották meg így. A contextnek szerintem van változó állapota. Ebből singletont csinálni egyenlő a káosszal.
-----
Áttérve a konkrét problémára. Sajnos tényleg nem ismerem az android architektúráját, és lehet, hogy a singletonnal jársz jobban. Ezt megerősíteni és cáfolni sem tudom. Majd a tapasztalt androidosok biztos leírják a véleményüket.
Remélem, nem értelmezem félre a dolgot, de nekem az jött le, hogy az InputMethodService megsérti az SRP principlet, mert nemcsak az a dolga, hogy felépítsen egy billentyűzetet (KeyboardView - GeneralKeyboardData - Keyboard - Button - Text), hanem ki is kell szolgálnia a billentyűzetre tapicskoló eventeket. Ezt talán célszerű lenne két külön osztályban megvalósítani. Talán te is pont ezt írtad.
Legalábbis ha jól értem, hogy az "adatstruktúra" alatt a billenyűzetet érted, rajta a gombokkal, textekkel.Véleményem szerint az elnevezések alapján az event fogadása nem feltétlenül a text feladata, hanem a buttoné. Legalábbis ha én olvasok egy kódot, akkor arra számítok, hogy a text csak a gombon lévő szöveg tartalmáért felel, annak stílusáért, stb. Az esemény pedig a gombon keletkezik. De ez akár elnevezési probléma is lehet. Én mindenesetre a gombra fogok hivatkozni, a textet nagyon nem ideillőnek érzem.
Szóval a gombok event listenere pedig továbbpasszolja az eseményt egy event handlernek (talán az InputMethodServicenek?), ami elvégzi a gombnyomás mögé rejtett logikát. A gombnak tehát szüksége van ebből egy példányra, hiszen mit ér a gomb, ha nem csinálhat semmit.
Nincs sok lehetőség:
1. Leküldöd a billentyűzet legyártásakor minden gombnak ezt a referenciát.
2. Vagy csak a GeneralKeyBoardDatáig. Bár akkor a GeneralKeyBoardData példányt kell majd továbbpasszolnod a gombok felé, hogy azok lekérdezhessék. Tehát ígyis-úgyis utazik lefelé egy referencia, így ha ez a megoldás nem hoz látható javulást, akkor nem éri meg, csak ront az átláthatóságon.
3. Használod a gombban a singletont.
4. Használsz valamilyen android hókuszpókuszt. Az előző hozzászólásomban a contextre gondoltam, legalábbis a neve alapján arra asszociáltam, hogy ezen keresztül elérhetők ill. elérhetővé tehetők a szükséges komponensek. A válaszodból az jött le, hogy nem."Vagy valahogy kiszedem az InputMethodService hivatkozását magából az InputMethodService-ből"
Ezt nem értem, itt a singleton.getInstance()-ra gondoltál, ugye?Nekem ez az egész egyébként UI-szagúnak tűnik, és backend fejlesztőként én úgy gondolom a UI-t nem is igazán kell tesztelni. Legalábbis nem így. Állapota meg biztos nincs, ugye? Szóval menjen az a singleton!
Sajnálom, hogy nem tudtam érdemben segíteni, csak a java oldalt ismerem.
Senki sem fog programozási paradigmákról flame wart indítani, annyi féle létezik, imperatív, deklaratív, oo, stb, egyesek valamennyire átfedésben vannak másokkal, mindegyiknek van előnye és hátránya, ostobaság lenne erről vitatkozni. A programozás úgyis arról szól, hogy kiválaszd a neked/projektnek megfelelőt, és megtanulj együtt élni a hátrányaival.
Vagy készítesz egy új programnyelvet, új megoldásokkal, és majd csak utána jössz rá, hogy a többinél nem jobbat alkottál, csak másabbat.
Szóval a "komoly" emberek vitassák bátran az oo-t, ha nincs jobb dolguk. Én is fel tudok hozni egy csomó hátrányt az OOP-ben, de ugyanúgy a funkcionális nyelvekben is, stb. De miért tenném? A világ nem lesz jobb, ha elkezdek fikázni egy paradigmát, vagy egy nyelvet.
Amit viszont én írtam (static hívások, globális állapottal, javaban) az egy erősen kisarkított példa volt, természetesen ironizáltam. Bele kell törődni, hogy a java egy oo nyelv, és a szabályokat ugyan meg lehet szegni, csak hosszútávon legtöbbször nem éri meg.A "lineáris programozás" alatt mit értesz?
[ Szerkesztve ]
-
thon73
tag
Így már értem, és az utolsó szaváig egyet is értek vele. Az ördög az Android felépítésében rejlik, ezért csak a konkrét részekkel foglalkozom, a többi az absz. úgy van, ahogy írod.
Az InputMethodService felelős a billentyűzetért, ami ugye a képen van, tehát UI. Sajnos ez a Service igen gyengén dokumentált, többnyire a forráskódból meg próbálkozásokból jöttem rá egy-két dologra.
A mi szempontunkból fontos: a billentyűzet kiválasztásakor elindul a service és örökön-örökké él, amíg új billentyűzetet nem választ ki a felhasználó. No, és persze egyetlen példányban él. De ha szigorúan akarok fogalmazni: nem singleton, legfeljebb hasonló.
A service elindításakor szükség van valamilyen adatstruktúrára, ami a billentyűzetet reprezentálja. Az első megvalósításban ezt a struktúrát egy leírófájl alapján maga a service készíti el; ami leginkább idő. Ez a rész háttérszálon fut, de akkor sem tudom a billentyűzetet használni, amíg kész nincs. Ez persze idő, akár 10-20 másodperc is lehet; igaz csak a billentyűzet legelső kiválasztásakor kell kivárni. Nem tudom külön előkészíteni, mert a konkrét gép adatira is szüksége van. Viszont ezt szerettem volna úgy különválasztani, hogy mondjuk egy program legenerálja a használható adatstruktúrát (oké, ez egy fél perc), aztán azt az adatstruktúrát már azonnal tudja használni a service.
A speciális View egyik metódusa (onTouch()) kerül meghívásra érintéskor, egy másik (onDraw()) rajzoláskor. Az eddigieket nem én találtam ki, ez gyárilag így van.
Természetesen az onDraw() is eljut a példánkban Button-ként szereplő osztályig, ami megrajzolja a billentyűt (ennél kicsit bonyolultabb a dolog, mert egy köztes képet használ, de ez nem érdekes), és persze az onTouch() végrehajtása is a Button()-on keresztül történik, pontosabban a Text és Key további osztályokon, mert egy Button (joystick pl), akár négy ilyet is tartalmazhat. A lényeg csakis annyi, hogy az egész hosszú struktúrán végiggörgetem a referenciát, egészen pontosan úgy, ahogy írod. Mert ugyanis a leütött billentyűt CSAK a legelsőként szereplő Service tudja elküldeni. Van emögött persze logika, de néhány lépésben nehéz megfelelni neki.
A végső kérdés abszolút android specifikus: ennek a nem-singelton, nem-teljesen-standard-service, nem-minden-ízében-ismert InputMethodService-nek a referenciáját - vagyis inkább annak az átadását ki tudom-e kerülni valahogy. Magával az InputMethodService-szel nagyon kevesen foglalkoznak (szerintem), ezért örülnék, ha lenne valakinek tapasztalata vele.
Az állapot kérdésére meg nem tudok válaszolni. Ez egy bővített gyári osztály - fogalmam sincs arról (és doksi sincs), hogy egészen pontosan hogyan viselkedik. Azért persze valamennyit már tudok róla, csak félek, ez kevés, hogy egy ilyen huszárvágást bátran megcsináljak.
Az apróságokra:
jogos, én sem text-nek hívom, hanem packet-nek, amiből kettő van: vagy stringet vagy hard-keyt (kódot) tudok átadni. De ez a referencia utazása szempontjából csak még egy lépcső...A felsorolt opciók közül jelenleg 1-es működik. 2-est érzem megvalósíthatónak. A 4-es a kérdés, van-e ilyen, esetleg 3-assal kombinálva.
((A programozási cikket sajnos már nem találtam meg. Én magam nem vagyok elég felkészült, hogy bármi ilyen vitában részt vegyek, de a cikk nagyon érdekes volt. A "lineárisra" emlékszem, lehet, hogy rosszul idéztem, minden estre számomra a nem objektum-orientált, nem event-driven struktúrát jelentette (mondjuk basic ?). Nem ide tartozik, de nagyon tetszett a hasonlat, amit az egyik fél alkalmazott: Az objektum orientált programozás nagyon jó, de ha szükség van egy banánra, akkor meg kell teremteni hozzá a majmot is, meg az egész őserdőt. Bocs, ha ez se pontos. És még egyszer: részemről ez semmilyen állásfoglalás, tényleg nem tudok mit mondani róla; épp csak feldobtam, hogy ilyen is van a nap alatt.))
Nagyon köszönöm a választ, mert segítettél továbbgondolni, és így a probléma is sokkal jobban kezd körvonalazódni bennem!
-
Szmeby
tag
Nem sok az a 10-20 másodperc? Biztos nem lehet rajta gyorsítani? Ez borzasztóan soknak tűnik. Egy pc ennyi idő alatt megszámlálhatatlanul sok objektumot tud gyártani. Még néhány full gc is megfuthat közben.
Gondolom az io viszi el az idő nagy részét, de kizártnak tartom, hogy az android ne tudná ezt a fájlt már induláskor cache-elni. Hiszen előszeretettel használ ui leíró config xml-t. A legkevesebb, hogy ezt gyorsan tudja is használni.Ha először váltok egy másik billentyűzetre, nekem azonnal megjelenik a cucc, szóval valahogy tuti meg lehet ezt oldani. Opensource, (elvileg) saját billentyűzetet is tartalmazó app: Keepass2Android. Talán segít.
Az android dev tutorial egy mondattal elintézi a dolgot: preload, de semmi részletezés, hogy hogyan kellene. Egy pörgő animáció a billentyűzet helyén nem tűnik valami szép megoldásnak.Olyan lifecycle eseményhez nem tudod kötni az objektumok legyártását, vagy legalább a fájl felolvasását, ami nem a billentyűzet kiválasztása esemény? Hanem valami korábbi időpont. Mondjuk a telefon elindulása.
Ezt találtam, nem egy komplex billentyűzet, de én nem látom, hogy az InputMethodService referencia bárkinek is átadásra kerülne. Viszont a getCurrentInputConnection() meg a BroadcastReceiveres megoldás érdekesnek tűnik azzal a queueval. Bármit is csinál...
-
thon73
tag
Hát, ne egy hétköznapi billentyűzetre gondolj. Valójában akivel terveztük/teszteltük könyveket ír rajta több nyelven. Az eredetileg gigantikusnak gondolt határértékek a keze között akadállyá váltak: jelenleg 10 (külön keskeny és széles) layout a teszt, akár több, mint 1000 tényleges billentyűvel.
Ha ehhez hozzávesszük, hogy egyetlen billentyű leírásához akár 20 token is kellhet; ill. hogy ez legalább 2500 objektum; ráadásul egy igen részletes log is tartozik hozzá - akkor már nem is olyan sok az az idő. De az oroszlánrészét az objektumok veszik el, meg persze GC is dolgozik közben - a log tanúsága szerint.Mindegy, három próbálkozáson keresztül jutottunk ide, és ez jónak tűnik: nagyon gyorsan és könnyen módosítható, és mindent tud, amit szeretnénk. No persze, az okostelefon elgondolásba ez a (mondjuk log nélkül talán) 10 másodperc már nem fér bele, tegyük hozzá a három sem. Ezért szeretném pontosan ezt: szétválasztani a kettőt. Akár install során legyártja a szükséges adatokat, aztán a mentés meg a töltés már nem sok idő.
A Broadcast ötleten is gondolkodtam (ez jó, hogy példa is van hozzá), de az egyik előző elgondolásban az előző karakter átírását a DELETE majd ÚJKARAKTER elküldésével oldottam meg. legnagyobb meglepetésemre teljesen összekeveredett a sorrend, az elküldött értékek nem ugyanabban a sorrendben érkeztek meg. (A doksi csak arra hívja fel a figyelmet, hogy ez ún. IPC - vagyis nagyon lassú. De keveredésről nem volt szó.) Megoldható persze, egy blokkban kell a kettőt (néha többet) elküldeni. Épp csak attól tartottam, hogy a Broadcast még tovább rontja ezt az időt - talán az editor kellene a receiver legyen, de ez persze nem realitás.
Ebben a Broadcast megoldásban elmélyedek, mennyire nehéz bele-aplikálni. (Loadernél használtam, ott nagyon jó volt)
Még egy kiegészítés:
Amúgy a Broadcast megoldás is singletonnal operál a példában (ami gyári); no ezt csak azért írom, hogy csak azért betenni, hogy egy másik singleton-szerű megoldást kiváltson, lehet h. felesleges.Szerintem kipróbálom mind a hármat (referncia átadása - service elérése singletonként - broadcast; aztán meglátom, mennyire idő/helyigényes és mennyire dönti romba a kód szépségét
[ Szerkesztve ]
-
diablo1984
veterán
sziasztok!
adott egy telefon, ami már 2 éves és járt rajta pár rom(lenovo a800) és olyan hibába ütköztem, hogy egy korábbi romot raktam rá, de a lenovo logonál megáll a tudomány, onnan nem megy tovább! mondom én vagyok a hülye, wipe-oltam, újra feltoltam, megint addig jutott, sőt azóta próbáltam még 4 romot, az is a lenovo felíratnál megáll!
flash tollal tooltam fel egy orosz romot, az felmegy, el is indul, csak nem magyar!2 kérdésem lenne:
- ha recoveryvel így járok, akkor hol lehet a hiba, már recovery-t is cseréltem, de nem változott a helyzet
- az orosz romba vajon bele lehet-e rakni a magyar nyelvet? mert a flash tool az azt az orosz romot fel tudja tolni úgy hogy el is induljon...... -
lord.lakli
őstag
válasz diablo1984 #3312 üzenetére
Hivatalosan ez android szoftverfejlesztős topik. A teló fórumát keresd meg.
-
diablo1984
veterán
válasz lord.lakli #3313 üzenetére
megkerestem, de az a topic halott!
itt a fejlesztés részhez a nyelv integráció tartozna és mondjuk egy hiba, amit nem tudom hol csúszik el....
-
rgeorge
addikt
Van egy laikus kérdésem. Egy 4.0-s Android alkalmazásról lenne szó, ami itt nem kifejthető okok miatt adb shell parancsokkal kapja és küldi az adatokat PC felé. Ez 4.4-es eszközön nem megy, mert az alkalmazás visszaadja a PC-s alkalmazásnak azt az elérési utat, ahová másolni kell (Environment.getExternalStorageDirectory().getAbsolutePath()), és ez egy "/storage/emulated/0/" kezdetű útvonal. Ezt az adb shell nem látja, csak "/storage/emulated/legacy/" kezdettel. Mit lehet ezzel tenni?
Picard: "What we leave behind is not as important as how we've lived. After all, Number One, we're only mortal." Riker: "Speak for yourself, sir. I plan to live forever."
-
kisvuk2
csendes tag
Tiszteletem minden Nagy Gurunak!
Egy kérdésem lenne: barátom vett (kínai) fejegységet a kocsijába, kitkat 4.4 rendszerrel. Minden szép és jó, csak egy a baj: a canbus-on keresztül minden egyes liter üzemanyag fogyás után iszonyatos hangjelzés jön a gépből. A rendszerhangokat nem lehet állítani (legalábbis nem találtam ilyen menüpontot). Ha nincs csatlakoztatva a canbus csati, el sem indul a fejegység, van egy app, a canbus apk, de ezt én filekezelővel nem találtam meg, az alkalmazáskezelőben csak kényszeríteni lehet a leállítását, mást nem enged, de a következő jelre (ami pár másodperc múlva bekövetkezik) már indul is újra az apk. Valakinek nincs erre ötlete?
Előre is köszönet a segítségért! -
vlevi
nagyúr
válasz kisvuk2 #3316 üzenetére
nem ide tartozik, de ha rendszer alkalmazás, akkor csak root browserrel fogod megtalálni
/data/app könyvtárban a "szokásos" alkalmazások vannak, amiket egyébként is látsz a telepített alkalmazások között
/system/app Ide már kell a root jog. Itt azok az alkalmazáso vannak, amik gyárilag előretelepítve vannak az eszközön.
És, kitkattól van a /data/app-private könyvtár. Itt is lehet. -
crhis86
tag
Sziasztok,
Aránylag új vagyok Android fejlesztésben, ezért tanácsot szeretnék kérni a következőben:
Adott egy szerver, melyet bizonyos okokból csak pollozni tudok REST-en. Ezt elég gyakran meg kell csinálnom (kb. 1-2 másodpercenként) és az onnan jövő json-t feldolgozva update-elnem kell a UI-t: egy activity-ben is és akár a notification bar-ban megjelenő szöveget is (tehát nem biztos, hogy az activity előtérben lesz). Egy-egy ilyen művelet nem időigényes. Ennek az egésznek elég akkor megtörténnie, amikor maga az app fut az eszközön (tehát nem egy olyan service kell, ami mindig minden körülmények között fut).Nézegettem megoldásokat, de nem tudom melyik lenne a legjobb erre a feladatra. Talán egy IntentService-t hívogatva bizonyos időközönként lenne a legjobb megoldás, melynek eredményével megoldható a UI manipulálása is.
Van jobb ötletetek erre?
Köszi -
Karma
félisten
válasz crhis86 #3319 üzenetére
Mindenekelőtt rendet kell tenned a saját és a megrendelőd fejében. Mit jelent szerinted az, hogy az alkalmazás fut, de nincs előtérben? Miért és meddig kéne ilyen állapotban maradnia az alkalmazásnak?
Egyébként ha ez egy konzumer alkalmazás (tehát nem belső használatra készül, olyan környezetben ahol fix az áramellátás és az internet), egy ilyen akkuzabáló sűrű poll megoldás csak egy csillagot majd azonnal törlést, esetleg egy goromba hangulatú HVG cikket ér. Megfontolandó lenne rakni valamit a REST interfész elé, ami előtérben futó alkalmazásnál websocketen (vagy pèldául Pusheren) keresztül realtime öntené a kliensekbe az adatokat, háttérbe pedig a GCM-nek delegálná ezt. Persze minden esetben egyértelművé téve a felhasználónak, hogy tud kiszállni.
Az eredeti kérdésre visszatérve, egy started service lenne szerintem a megfelelő hely, ami ordered broadcastot küld, amikor új adat van. Ha van élő activity, akkor úgy csináld hogy ő kapja meg először, frissítve a UI-t, ha nincs, akkor meg alacsony prioritással a notif. frissítés fusson le.
[ Szerkesztve ]
“All nothings are not equal.”
-
bucsupeti
senior tag
Sziasztok!
A problémám a következő. Szeretnék egy frissítést beletenni az alkalmazásomba, ami egy vpn hálózatban elérhető szerverről töltene le egy JSON-t. A frissítést a háttérben szeretném megcsinálni akkor, amikor a VPN kapcsolat aktív lesz. Hogyan tudom detektálni azt ha aktiválják a VPN-t (McAfee EMM-el kapcsolódnak a VPN-re)
Néztem az McAfee EMM-nek nincs semmi olyan szolgáltatása ami broadcastolná ha kapcsolódott. Android szinten próbálkoztam a CONNECTION_CHANGE-re BroadcastReceivert állítani, de ez nem tüzel ha VPN címet kap a készülék.
Ha más megoldás nincs akkor beállítom hogy bizonyos időközönként nézze meg hogy elérhető-e a szerver és ha igen akkor frissítsen.
Arra gondoltam hogy szebb, jobb és biztosabb lenne ha észlelni tudnám ha új network interface aktiválódik.Ha a VPN bekapcsol akkor a NetworkInterface.getNetworkInterfaces() metódusával kapott listában megjelenik egy egy tun0 interfész is aminek az IP címe VPN-ből való.
Valahogy el lehet csípni ezt az eseményt amikor új IP címet kap a készülék?
Előre is köszi a segítséget!
"Nem gond ha nem vágod a párologtatók bináris nyelvét..."
-
Karma
félisten
válasz bucsupeti #3322 üzenetére
Még nem csináltam ilyet, de a CONNECTIVITY_ACTION broadcastet próbáltad már?
“All nothings are not equal.”
-
musculus
tag
Kedves Szakik!
Mit gondoltok, ezt a bash scriptet hogy lehet android 4.4 alatt működésre bírni, nekem nem sikerült
http://hup.hu/node/137311
A rádió hangtár app egy irgalmatlan programozási hulladék
lefagy, mobilneten fél óra után elölről kezdi a fájlt, és ezek után a másfél centi a görgetőn bohóckodsz vezetés közben...Szerintetek?
előre is kösz#!/bin/bash
if [ -z "$3" ];
then
echo "Nincs minden paraméter beállítva!";
echo "Paraméterek: ÉÉÉÉHHNN ÓÓPP PP";
echo "ahol első paraméter felvétel kezdésének dátuma, második a kezdésének óra-perc időpontja, harmadik paraméter a felvétel hossza PERCEKBEN, negyedik pedig az un. csendes (háttérben zajló) letöltés.";
echo "Ha nem szeretnéd, hogy outputra beszéljen a wget akkor negyedik paraméternek állítsd be: -b";
else
ulimit -f $((12*60*$3)); wget http://stream001.radio.hu:443/stream/${1}_${2}00_1.mp3 $4;
fi[ Szerkesztve ]
Homo sapiens non urinat in ventum - "And so it goes..."
-
Horv
csendes tag
Sziasztok!
Androidra és iOS-ra szeretnék egy alkalmazást, amit C++-ban írok meg. A wrappert a dropbox djinniével generáltatom, és eddig nincs is gond, viszont cpp oldalon használom az openssl könyvtárat. Lefordítottam armeabi, armeabi-v7a, x86 és mips archokra az openssl-t, és meg vannak a .so fájlok. Viszont az NDK-ban nem nagyon vagyok otthon, és nem tudom, hogyan lehetne linkelni az openssl könyvtárat.
Így néz ki az Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libssl_jni
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/openssl
LOCAL_LDLIBS += -L$(LOCAL_PATH)/../libs/system
LOCAL_SHARED_LIBRARIES := libandroid libdl libz libcrypto libssl
LOCAL_LDLIBS += -landroid -ldl -lz
include $(BUILD_EXECUTABLE)a build.gradle-be hozzáadtam a flagekhez az -lssl-t és -lcryptot, illetve a könyvtárakat is ahol keresse a linker.
De így is valamiért folyton undefined reference-t kapok minden SSL-s függvényre.
(Android Studio 1.3 stabilt használok 2.5-ös gradle-vel)
iOS-on sikerült életre kelteni az appot, a cpp és az ios-ra fordult openssl jó és tudja linkelni is, de az android nem akar összejönni...
Csinált valaki valami hasonlót, van valakinek valami ötlete?
-
Horv
csendes tag
Bocs a dupláért:
Asszem megoldottam, rossz flagekhez adtam a libeket
Habár az android.mk fájl mintha ott se lenne, mert nem nagyon veszi figyelembe mit szerencsétlenkedek benne...
Viszont most a studio mindig más toolchainnal fordít, és sosem a jó mappában keresi a libet, pedig beállítottam az összes arch mappájátNem tudjátok, hogy lehetne beállítani android studioban melyik toolchaint használja az ndk?
-
thon73
tag
Meg tudná mondani nekem valaki az igazságot az Enum-ról? Csak a vitákat olvasom.
Egy négy elemű állapotot kell tárolnom (ON OFF WAIT HOLD), de ezt mintegy 1000 elemben, ahol az osztálynak csak egyetlen másik belső változója van, egy String. (lehet, hogy még lesz valami flag-szerű apróság)
Érdemes enum-ot használni, vagy tilos, ahogy az android útmutatja?
Ha tilos, akkor int-et használjak, vagy nyerek valamit egy byte alapú konstanssal.
Technikailag bármelyik elkészíthető, csak melyik a jobb?
Az érték szigorúan belső, az osztály belső állapotát regisztrálja. Kifelé majd csak egy ACTIVE vagy INACTIVE jelzés megy, ez a belső osztály csak azt írja elő, hogy ez mikor menjen ki.
Előre is köszönöm!
((Megjegyzem: a program képeket is használ, amik még ezen a tenyérnyi képernyőn is olyan hatalmasak, hogy az adatok mennyiség egyetlen kép mellett is eltörpül. Ezért törpölök azon, hogy kell-e foglalkoznom a memóriával?))
-
rgeorge
addikt
A Java Enum implementáció memóriaigénye miatt ellenjavalt a használata Android programokban, leginkább persze akkor, a felhasználás számossága elég nagy. Helyette az IntDef, StringDef is használható.
Picard: "What we leave behind is not as important as how we've lived. After all, Number One, we're only mortal." Riker: "Speak for yourself, sir. I plan to live forever."
-
diablo1984
veterán
sziasztok
twrp-s fullos mentésből lehet valahogyan flastoolos mentést csinálni? arra az esetre, ha a telefonon a kijelző nem kapcsolna be, mert akkor a flashtool-al még restore-ozható lenne......
-
Karma
félisten
Mondjuk a Java enumoknak nem sok közük van a C-s formához, ahol nem volt több egy nevesített int konstansnál. Itt azért azáltal, hogy ezek singleton Java objektumok, amiknek saját metódusaik is lehetnek, sokkal vagányabb dolgokat össze lehet hozni. Például a Command GoF mintát elég triviális így megírni.
Hah, jó sokáig ültem a hozzászóláson.
[ Szerkesztve ]
“All nothings are not equal.”
-
thon73
tag
Igen, többek között pont ezért szerettem volna enum-ot használni. Rosszul fogalmaztam: már a C-ben is nagyon szerettem, amikor még tized ennyit sem tudott.Mondjuk azt még mindig nem értem, hogy pontosan mi is az, ami olyan "nagy". Egy integer konstansnál nyilván nagyobb, de egyébként éppen pont akkora kell legyen, mint egy másik objektum-hivatkozás (mármint egy osztálypéldányban.)
Vagy az osztály létrehozásához szükséges nagyobb terület? De számít ez az egyszeri fél-egy kilobyte?Most már egy egyre speciálisabb billezeten ügyködünk, ahol eredetileg 1000 billentyűvel számoltam. Ha ezt beszoroztam egy-egy osztálypéldánnyal, akkor elég elképesztő értéket kaptam. (Többet, mint az első számítógépem agya, pedig ez csak egy billentyűzet.)
Viszont magát a billentyűzetet képként jeleníti meg. Nekem csak kb. félmillió képponttal kell számolnom, de az új gépeken ez megtöbbszöröződött. A képek mérete mellett eltörpül a - humán fogalmak szerint - gigantikus adatmennyiség. (jó, ettől még nem kell pazarolni.)
Viszont rögtön jött ebből egy másik kérdés is: a dokumentáció óvva int a képek gátlástalan használatától, mert elfogy a terület. Nem töröltem ki az elavult képeket (véletlenül), és érdekes módon nem kapok hibaüzenetet még sok-sok egész képernyőnyi tárolt kép mellett sem.
Megváltozott vajon a memóriakezelés, és nagyobb területet kap a program? A dokksi szerint 16 mbyte körül van minden program lekorlátozva, aminek már számításaim szerint el kellett volna fogynia. -
Karma
félisten
Az enumok memóriaigényéről nem tudok semmit (eredetileg az óva intésről se tudtam, én vígan használtam ha azt ítéltem a megfelelő eszköznek ).
A képekkel valószínűleg szerencséd volt, vagy nem foglalnak annyit, mint gondoltad. Még mai eszközökön is jókora OOM pofonokat lehet kapni, ha mondjuk fényképeket olvas fel az ember sampling nélkül, és nem hív rájuk recycle-t.
A 16 MB-os korlát már nagyon régen volt egyébként, platformonként és eszközönként is ingadozik. Némi olvasnivalót találtam a témában SO-n: [link][link] Az utóbbiban van egy lista pár modern eszközről is, hogy hogyan alakultak a számok.
“All nothings are not equal.”
-
thon73
tag
válasz rgeorge #3331 üzenetére
Köszönöm az IntDef ötletet, ezt korábban nem olvastam.
Megtaláltam az "ideális" megoldást:
Amikor csak a korlátozott számú elemre van szükség, akkor az IntDef-et fogom használni. ("hagyományos" enum)
Ha az enumnak szüksége van metódusokra is (vagy valami működésre, mint most), akkor meg azt!
to Karma:
A linkeket is köszönöm, nagyon hasznosak. Ekkora memórianövekedésre nem gondoltam, így persze, hogy nem jelez. Egyébként a doksi még mindig tartalmazza a 16 Mbyteot is (Igaz, hozzáteszi, hogy ha 2.2-re is akarunk fejleszteni), és az enum szigorú tiltását is.
[ Szerkesztve ]
-
veterán
ART-ban már compacting GC van? Gyors keresgélés során csak Lollipop előtti cikkeket találtam arról, hogy egy compacting GC fejlesztés alatt áll, és majd jön az ART-ba. Itt azt írják az van, de nem tudom higgyek-e neki.
https://play.google.com/store/apps/details?id=com.lovemap.lovemapandroid
-
Karma
félisten
válasz Oppenheimer #3342 üzenetére
Mi biztosan jobban tudjuk, mint a Google
Egyébként itt a kapcsolódó forráskód, ez biztosan nem hazudik.[ Szerkesztve ]
“All nothings are not equal.”
-
vlevi
nagyúr
Új vagyok android témakörben, de most hirtelen belefutottam egy furcsaságba.
double adattípus mennyire jó számításokhoz?
debugolom az appot, és ezt látom a kódban
double fogy=0;
double mn_kezdoallas=OraErtek(mn_min); // debugger 14170.3-t ír ki
double mn_vegallas=OraErtek(mn_max); // debug szerint 15274.0 Valóban ennyi, én adom vissaz az értékeket
fogy=mn_vegallas-mn_kezdoallas; // 1103.7000000000007
float fogy2=(float)mn_vegallas-(float)mn_kezdoallas; // 1103.7002A kérdésem az, hogy valamit el...tam, vagy tényleg ennyire pontos (pontatlan) már 1 tizedesjegynél is?
Számít valamit az, hogy android 4.2-t adtam meg MinSDK versionnak (a telefonomon 4.2 van, nincs kitkat, lolipo), de a targetsdk már 23-as? Tegnap ugyanis frissített az android studio, már a 6-os droidhoz való sdk-t is lehúzta. -
Karma
félisten
Az IEEE754 lebegőpontos számok már csak ilyenek, hja. A tízes számrendszerben leírható számok kettesben elég gyakran csak végtelen törtként írhatóak fel. Nem véletlenül szigorúan tilos bármilyen pénzügyi, vagy precíziót igénylő számításhoz használni.
Van helyette BigDecimal osztály, ami bár sokkal körülményesebb (immutable, és metódusokat kell hívni az operátorok helyett), mégis tökéletes pontosságot ad, használd azt.
A floatra castolást meg pláne felejtsd el, hacsak nem valami androidos API-nak kell floatot átadni.
---
Az SDK verziós kérdésre: a double működésében nem számít. A target SDK-t célszerű a legújabbon tartani, hogy az új telefonokon ne legyen gond (figyelmeztet is az IDE, ha le vagy maradva). A minimum pedig az, aminél régebbire fel se települhet az alkalmazásod.
Gyakorlatilag azokat az osztályokat használhatod gondtalanul, amik a min. SDK-ban már elérhetőek voltak. Ha nagyon muszáj, újabb rendszereken, verzióellenőrzésekkel körülvéve a target SDK-ból is hívhatsz dolgokat, de ezek a sorok felrobbannának régebbi telefonokon.
[ Szerkesztve ]
“All nothings are not equal.”
-
thon73
tag
Lehet, hogy hülyeséget kérdezek.
Ha csupán egy tizedes pontosság kell, akkor nem lehet kerekítéssel használni a double-t? Mert a hiba mindig csak a sokadik értéken jelentkezik?
((Én egyébként ilyen "kis" értékeknél szoktam int-et is használni, 100 v. ezerszeres szorzóval. Pl. képernyőméret és szövegméret kiszámításánál.))Mondjuk, biztos, hogy a BigDecimal a legpontosabb, csak igen kacifántos. Na jó, ez nem igazi androidos kérdés.
-
sztanozs
veterán
Csak ne akard őket (sokszor) összeadni vagy kivonni (vagy más matematikai műveletet végezni). A kerekítési hiba elég gyorsan tud eszkalálódni. De akár egyetlen kerekítés is hozhat meglepő eredményt.
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
Új hozzászólás Aktív témák
- Fűnyíró topik
- Vezetékes FÜLhallgatók
- Bluetooth-headsetekről általában
- Kerékpárosok, bringások ide!
- Skoda, VW, Audi, Seat topik
- Samsung Galaxy A71 - elég ennyi?
- Hobby rádiós topik
- Amit látnod kell 80’ – 90’ évek, egész estét betöltő mozi filmjei.
- A fociról könnyedén, egy baráti társaságban
- Háztartási gépek
- További aktív témák...
- Bomba ár! HP EliteBook 840 G5 - i5-8G I 8GB I 128GB SSD I 14" FHD I HDMI I Cam I W10 I Gari!
- The Last of Us Part I Ps5
- Bomba ár! HP EliteBook 830 G6 - i7-8G I 8GB I 256GB SSD I 13,3" FHD I HDMI I Cam I W11 I Gari!
- Bomba ár! Dell Latitude 5580 - i5-G6 I 8-16GB I 256 SSD I 15,6" FHD I HDMI I CAM I W10 I Garancia
- Bomba ár! Dell Latitude 5490 Touch - i5-8G I 8GB I 256SSD I 14" FHD Touch I Cam I W11 I Garancia!