Új hozzászólás Aktív témák
-
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.
-
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.
-
-
Karma
félisten
Az ObjectAnimator a barátod. Az XML-es megoldás is ilyen objektumokat állít össze, ez a guide meg elég alaposan végigmondja az elméletet és a gyakorlatot is.
-
Karma
félisten
válasz
#39560925
#3272
üzenetére
Az OpenShiftnél nem nagyon tudod olcsóbban kihozni, ingyenesen futtathatsz egy kis gépet. Én oda szoktam fellőni a Boot projekteket általában.Bronze módban (ami ingyen van, de már meg kellett adni hozzá a bankkártyádat) már nem alszik el a gép soha; sima freeben inaktivitás esetén leáll és az első bejövő hívásnál ébred fel - késleltetve a választ.
Már másfél hónapja mondjuk nem néztem, de a Java 8-at kézzel kellett megoldani, van rá bejáratott házi sablonom. De egy kicsit több munka, nem egészen plug and play.
A Heroku 7 dolláros hobby dynoja se rossz, bár 7 dollárral több, mint az előbbi példa
Ott a free dyno sajnos többet alszik, kötelezően. Viszont frissebbek a buildpackek és amúgy nagyon király az egész. -
Karma
félisten
válasz
WonderCSabo
#3241
üzenetére
Mármint a Guava EventBusról van szó, vagy lemaradtam valamitől?

-
Karma
félisten
válasz
#39560925
#3238
üzenetére
Megoldható persze, csak a kérdés nem jó. A ThreadEnforcer.ANY konstruktorparaméter is kell hozzá — ez biztosítja, hogy a buszra bármely szálról lehessen üzenetet küldeni —, viszont a szálak közötti átpasszolást neked kell megoldanod. A legegyszerűbb ehhez a Bus osztályból leszármaztatni. Mindjárt megkeresem a megfelelő kódot, csak mobilról nem gyors

Meg is van: [link]
-
Karma
félisten
Egyáltalán nem nehéz, ha az alapfogalmakkal tisztában vagy. Ha minden egyes képernyő egy activity vagy fragment, a válaszok alapján meg mindig a megfelelőt indítod, áttekinthetetlen de legalább triviális eredményt kaphatsz. De van még egy pár variáció az általánosabb, szebb megoldásra.
Mondjuk ehhez tudni kell, mi fán terem a Java és mik az Android alkalmazások alapelemei és alapműködései. Nem tudom, ilyen háttérrel hogy lehetne kezdeni. Affinitásod van hozzá legalább? El tudnád magyarázni a probléma megoldását lépésről lépésre egy külföldi kétévesnek?
-
Karma
félisten
Most esett le amúgy, hogy SharedPreferencest használsz az adatok tárolására, így az egész litániámra semmi szükség. Fel tudsz iratkozni az SP változásokra - ha ezt használod a fragment onAttach/onDetachban, kész is vagy.
-
Karma
félisten
válasz
#39560925
#3218
üzenetére
Azt semmiképp se tartom jó ötletnek, hogy a MainActivity közvetlenül ismerje az ExceptionsFragment példányt. Mivel a ViewPager is virtualizál (azaz a ListViewhoz hasonlóan csak a látható vagy szomszédos viewkat tartja életben), elég kusza helyzetek alakulhatnak ki.
Hogy ezt hogyan kerüld el, van pár lehetőség.
Az első a klasszikus jávás Listener minta. Az activityben definiálsz egy Listener interfészt, amit a fragment megvalósít, valamint egy kis ceremóniát, hogy fel lehessen rá iratkozni. A fragment onAttach metódusában regisztrál, onDetachban pedig deregisztrál - ameddig össze van kötve, az activity tud neki jelezni. Mondjuk a konkrét activity osztályt is elfedném akkor már.
ExceptionChangeListener.java:
public interface ExceptionChangeListener {
void onExceptionsChanged();
}ExceptionSource.java:
public interface ExceptionSource {
boolean addExceptionChangeListener(ExceptionChangeListener listener);
boolean removeExceptionChangeListener(ExceptionChangeListener listener);
}MainActivity.java:
public class MainActivity extends AppCompatActivity implements ExceptionSource {
private final Set<ExceptionChangeListener> mListeners = new HashSet<ExceptionChangeListener>();
...
public boolean addExceptionChangeListener(ExceptionChangeListener listener) {
return mListeners.add(listener);
}
public boolean removeExceptionChangeListener(ExceptionChangeListener listener) {
return mListeners.remove(listener);
}
... amikor módosítottad a listát, hívd meg ezt ...
private void notifyListeners() {
for (ExceptionChangeListener listener : mListeners) {
listener.onExceptionsChanged();
}
}
}ExceptionsFragment.java:
public class ExceptionsFragment extends Fragment implements ExceptionChangeListener {
@Override
public void onAttach (Activity activity) {
super.onAttach(activity);
if (activity instanceof ExceptionSource) {
((ExceptionSource)activity).addExceptionChangeListener(this);
}
}
@Override
public void onDetach() {
if (getActivity() instanceof ExceptionSource) {
((ExceptionSource)getActivity()).removeExceptionChangeListener(this);
}
super.onDetach();
}
@Override
public void onExceptionsChanged() {
adapter.notifyDataSetChanged();
}
}Huh, ez elég hosszú lett. A másik kettőbe inkább nem megyek bele így nyilvánosan kód szinten.
A második az lenne, hogy a fragmented onAttach/onDetach időben egy BroadcastReceivert indít el, az activity pedig Intenteket dobál, ha változás van. Ez lehet közvetlenül a sendBroadcast metódussal, vagy LocalBroadcastManagerrel. Lazább csatolás, de elég sok ceremónia.
A harmadik pedig egy event bus bevezetése (pl. Otto), ahol a logika ugyanaz mint a másodikban, csak kevesebb extra kód (eltekintve a lib dependenciától). Én így 2015-ben egyébként ezt az utat javaslom.
-
Karma
félisten
válasz
#39560925
#3214
üzenetére
Azért sípol, mert nem használod ki a ListView újrahasznosító mechanizmusát, hanem folyamatosan új Viewkat fújatsz fel. Feltételezem, a warning buborék két findViewById hívást takar.
A tökéletes megoldásnak két lépése van, ebből az első a kritikus.
1) Használd a convertView paramétert! Ha nem null, akkor az egy olyan cella, ami kicsúszott a képből és így nincs rá szükség. Ebben az esetben az új cella létrehozása teljesen felesleges, ezt a viewt kellene bekonfigurálnod az új adatokhoz, megspórolva a példányosítást és a GC-zést.
View rowView = convertView != null
? convertView
: LayoutInflater.from(parent.getContext()).inflate(R.layout.exc_row_layout, parent, false);2) A ViewHolder minta ehhez képest már apróság, a findViewById hívásokat lehet megspórolni vele. Egy olyan custom classról van szó, aminek tagváltozóiba elteszed a TextViewk referenciáit (tehát gyártott viewnként egyszer kell keresni), a holdert pedig beállítod Tagként a cellán. Ha a convertView nem null, akkor elkéred a tagből a holdert, és azonnal írhatod az új adatokat.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RowViewHolder viewHolder;
if (convertView == null) {
convertView = ... inflate ...;
viewHolder = new RowViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (RowViewHolder)convertView.getTag();
}
... values tömb ...
viewHolder.bindRow(values[position]);
return convertView;
}
... valahol lejjebb ...
private static class RowViewHolder {
private TextView nameView;
private TextView descView;
public RowViewHolder(View rowView) {
nameView = rowView.findViewById(...);
descView = rowView.findViewById(...);
}
public void bindRow(Exception model) {
nameView.setText(model.getName());
descView.setText(model.getDescription());
}
} -
Karma
félisten
Igen, három platformon közösíteni az üzleti logikát szerintem elég jó húzóérv. Mondjuk ha az ember nem foglalkozik a WP-vel, akkor a Google-féle j2objc-vel is lehet kísérletezni. A Xamarinról egyébként írtam korábban egy logout bejegyzést, ami az akkori gondolataimat összegezte.
-
Karma
félisten
Ha nincs tapasztalatod az Androiddal, akkor szerintem ne a Xamarinnal kezdd. Nincs egyébként semmi baj vele, sőt van egy pár automatizált dolog benne, ami könnyítené a helyzetet, de a lényeg úgyis például az életciklusokban és a különböző osztályok szerepében van, ami mindkét nyelvben/környezetben közös.
Egyébként a Java vonalon a Retrolambda + Retrofit + Realm + ButterKnife négyessel nagyon jól lehet dolgozni.
-
Karma
félisten
válasz
WonderCSabo
#3178
üzenetére
A Picasso is meg tudja ezt csinálni
, csak az elrejtés miatt gondoltam, hogy jobb lehet külön listener. Mondjuk csak most gondoltam bele, de ha a kép szélessége fix, magassága wrap_content, akkor a be-nem-töltött kép amúgy is nulla magas lesz. -
Karma
félisten
A legtöbb képbetöltő library tud visszajelzést adni a képletöltés státuszáról, így ha hiba van, át tudod állítani az ImageView visibility-jét GONE-ra. Ugye használsz képbetöltőt, nem kézzel írtad meg az URL letöltést és Bitmap dekódolást?

Például az Universal Image Loader esetében a SimpleImageLoadingListener a barátod, Picassonál a Picasso.Listener, a Fresconál passzolom.
-
Karma
félisten
válasz
bucsupeti
#3166
üzenetére
No és mi van akkor, ha az alkalmazásod megszakad egy telefonhívás miatt, a rendszer kilövi a JVM processz, de a DownloadManager letölti az anyagot és beröffenti a Receivered? A static tagváltozóid elvesztek, így nem is fog történni semmi. Persze lehet, hogy ez normális, de lehet inkább SharedPreferencesbe kéne menteni az ilyesmit.
-
Karma
félisten
Az életciklus szempontjából ez mindenképpen egy új Activity. Ha nem akarod a jövőben is biztosítani a játék visszatöltését, akkor megteheted, hogy a launcherből indítva törlöd a preferencesből az adatokat.
De talán jobb felhasználói élmény lenne, hogy ha bármilyen okból meg kell szakítani a játékot, akkor is folytathatja akár egy nappal később.
-
Karma
félisten
Ryan a kommentek között elég jó nyomon jár, a saveInstanceState mechanizmus csak újrainduláskor/újrakonfiguráláskor játszik, de ahogy értelmeztem, neked ezekre az értékekre a jövőben is szükséged lenne.
Az onPause-ban kellene kimentened az értékeket SharedPreferencesbe, és onCreate-ben visszahozni.
-
Karma
félisten
válasz
BtommyX
#3095
üzenetére
Ez egy designbeli kérdés; ha csak magadnak fejlesztesz akkor használd amelyik jobban tetszik, ha meg nem, akkor valaki (ügyfél, designer, stb.) meg fogja mondani.
Itt találsz sablont többféle megvalósításhoz is.
Épp most volt rá nekem is szükségem
-
Karma
félisten
válasz
WonderCSabo
#3003
üzenetére
Az event bus szerintem még nem oldja meg a helyzetet, Szerintem az üzleti logikát ki kéne mozgatni a fragmentekből en bloc. Persze feliratkozva lehetnek, de ha egy tőlük független entitás (service) tárolja az állapotot, könnyebb újraindítani mindenkit és onnan folytatni, ahol abbamaradt a folyamat.
-
Karma
félisten
Találtam korábban ezt a folyamatábrát, célszerű végigkövetni, mert jól összefoglalja, hogy mit milyen körülmények között szabad.
Alapvetően veszélyes szerintem az, hogy egy Fragment példányszinten ismeri a másikat.
-
-
Karma
félisten
válasz
doomino
#2951
üzenetére
Eddig "HOX"-ot írtál, a HAXM teljesen más. Kérdések: a processzorod támogatja a virtualizációs kiegészítéseket (VT-x vagy AMD-v, gyártótól függően), illetve fut-e Hyper-V a gépeden (például Windows Phone SDK miatt)?
Mert a HAXM-nek kell a CPU támogatása, viszont összeakad más hypervisorokkal.
-
Karma
félisten
válasz
hyperionbabi
#2943
üzenetére
A Javahoz pedig épp most volt a testvértopikban jó könyv a kezdéshez.
-
Karma
félisten
válasz
kemkriszt98
#2935
üzenetére
Mindenképpen segítene az ügyön, ha byte-onként olvasás helyett nagyobb egységenként haladnál, például 8192 byte, vagy 32768 byte; így nem kéne széthajtani szerencsétlen flash meghajtót.
De amúgy a stream kézzel hajtása helyett használj Apache Commons IO-t, az IOUtils osztály megcsinálja helyetted a lapátolást.
Egyébként remélem, hogy a try/catch/finally és a streamek helyes lezárása csak azért maradt ki, mert a példakódodat rövidítetted, nem mert alapból kihagytad.

-
Karma
félisten
-
Karma
félisten
Elaltatni a DevicePolicyManager.lockNow()-val tudsz, ha az alkalmazásodból admin alkalmazást csinálsz - ennek menete is le van írva a dokumentációban.
Feloldani nem tudom viszont, hogy lehet.
-
Karma
félisten
válasz
kemkriszt98
#2868
üzenetére
Természetesen igen, ha LinearLayoutba rakod őket, a felső layout_widthje 60dp, az alsóé 0dp + layout_weight 1.
-
Karma
félisten
válasz
plüssgrizzly
#2864
üzenetére
username
Az inputok, pontosabban azok name attribútuma számít.
-
Karma
félisten
válasz
plüssgrizzly
#2860
üzenetére
Inkább innen a második példa.
-
Karma
félisten
Ez kicsit töményre sikeredett. Mit jelent az, hogy az Activity "használja" az pre- és postExecute metódusokat? Ezek az AsyncTaskok anonim osztályok, belső osztályok, vagy mik?
Ez a felállás biztosan nem jó, akármelyik kombináció is igaz. Ha tényleg muszáj az Activitynek kezelnie a taszkokat, akkor is azok legyenek inkább önálló osztályok, vagy static inner classok, és legyen jól definiált, hogy hogyan adnak eredményt. Vagy interfésszel, vagy busszal (ld. Otto).
Ha a viselkedésüknek van értelmezhető közös része, akkor az AsyncTask osztályok között örökléssel jól meg tudod oldani a közösítést. Csak legyen két külön interfész/buszüzenet hozzájuk.
-
Karma
félisten
válasz
plüssgrizzly
#2854
üzenetére
Könnyen lehet, hogy nincs szükséged egyáltalán a WebViewra, és hogy JavaScripttel szórakozz.
Sima Android kódban, a HttpClient segítségével tudsz küldeni egy olyan HTTP POST kérést a
http://wifi-gateway.website.hu/ címre, amibe a form mezőit kulcs-érték párokként rakod be (username, password; a "name" attribútumok a HTML-ben). A böngésző is pontosan ezt teszi submitkor. -
Karma
félisten
válasz
kemkriszt98
#2817
üzenetére
Ha a szobában próbálkoztál, az egész mérésed egy nagy GPS hiba volt. Kültéren is több méteres a maximális pontosság, hát még beltérben...
Oda kell figyelned az accuracy értékre a mérési pontjaidon, és ha túl pontatlan, azt a pontot ne tedd el, ne vedd bele a számításba.
Ha meg csak megjeleníteni akarod az aktuális sebességet, WonderCSabo ötlete jobban működik.
-
Karma
félisten
válasz
kemkriszt98
#2749
üzenetére
Ilyenkor azonnal a Logcatet kéne nézned, mert ott kiírja, milyen exception hatására és hol omlott össze az alkalmazásod. Valószínűleg valami null pointer okozza.
-
Karma
félisten
válasz
BalanceR
#2728
üzenetére
Jók a megérzéseid, erre nincs lehetőség. Root után is nagyon alacsony szintre kell nyúlkálni, és nem nagyon találok olyan aktívan karbantartott megoldást, ami például Windowson is működik. 2010-ből itt van egy példa.
-
Karma
félisten
Igen. Mindenre, amire szükséged van.
Alternatívaként használhatsz Fragmentet, aminek a setRetainInstance metódusával meg tudod tartani az adattagokat egy ilyen konfigurációváltás alatt. A layout XML-es történet pontosan ugyanígy működik akkor is, tehát lesz onCreateView hívás, és ott feltöltheted a tagváltozóidból.
-
Karma
félisten
A portrait módhoz tartozó XML-t a /res/layout/ mappába rakod, a landscape-et pedig a /res/layout_land/ mappába. Lehetőleg ugyanazokat az ID-ket használd az azonos funkciójú elemekhez, és ami sokkal fontosabb: kezeld az adatok kimentését az onSaveInstanceState és onRestoreInstanceState metódusokkal.
-
Karma
félisten
Sajnos rossz irányba lépkedsz a megoldás útján
Azzal hogy main függvényeket írtál, nem jutottál sehova. Desktopon se jelentene semmit ebben a formában, itt meg végképp nem.Mindenekelőtt el kéne olvasnod valami Android oktatóanyagot - a developer.android.com-on például van training, de nem biztos hogy jó a tematikája neked.
Esetleg ha vondolod, holnap megírom a feladatod és a kész kódból levonhatod a következtetéseket.
-
Karma
félisten
El kellett mennem itthonról, úgyhogy csak most volt lehetőségem megnézni. Nincs fenn Eclipse a gépemen, csak Xamarin Studio (és az általa felrakott Android SDK), de parancssorban le tudtam fordítani az anyagot.
Nekem nem fagy le, nem crashel, meg semmi csúnyát nem csinál. Annyit változtattam csak, hogy a libs mappából töröltem a Picassot (UIL mellett felesleges) és a v4 support libet (az appcompat v7-ben is benne van), majd rátettem a Nexus 7-emre és megy.
Egyébként nagyon rossz forma, sőt mondhatni szigorúan tilos bekódolni azt, hogy "/mnt/sdcard". Csak rosszul sülhet el egy olyan telefonon, aminek nincs belső tárhelye és SD kártyája.
Javaslom az Environment osztályt tanulmányozásra.Zedz: Az AsyncTask osztály, amit az esetek döntő többségében ajánlott használni az ilyen háttérben végzett feladatokhoz, alaphelyzetben egy négy háttérszálból álló poolt használ, amit a framework menedzsel. Szóval igen, a droid intézi

Nagyon ritka az, hogy valami külső/belső okból ez a felállás nem jó, és az AsyncTask helyett más megoldást kell keresni. Az viszont például biztos, hogy Thread vagy Timer/TimerTask osztályokat használni mobilon súlyos hiba, mert van erőforrásbarátabb megoldás.
-
Karma
félisten
Mindjárt megnézem a projektet is, de elöljáróban két nagyon fontos dolgora szeretném felhívni a figyelmed:
1) Miután beraktál valamit a libsbe, azt ne vedd fel a build path-ra, mert automatikusan felkerül.
Sőt, továbbmennék, soha ne nyúlj a build path-hoz!
2) Az, hogy "lefagy" ebben a formában nem hordoz információt. Lehet ANR (application not responding), vagy force close; ez utóbbi esetben nézd meg mindig, hogy mit logol az alkalmazásod, mert 99%, hogy ott lesz a kiváltó ok érthető angolsággal. -
Karma
félisten
válasz
WonderCSabo
#2588
üzenetére
Elfogadom, valószínűleg a problémás esetben generikus volt a tartalmazó osztály is, de azt már elhomályosította az idő a fejemben.

-
Karma
félisten
válasz
WonderCSabo
#2584
üzenetére
Hm. Határozottan emlékszem pedig, hogy TypeToken nélkül nekem ez a felállás nem működött, a Listbe ArrayElement példányok helyett Map<string, object>-ek kerültek - ami futásidőben ClassCastExceptiont okozott.
Az egyetlen különbség, amit így ránézésre látok az, hogy én default constructort hagytam az osztályban, míg nálad van egy elements paramétere. Nem tudom, emiatt tudja kitalálni, vagy sem, de mindenképpen érdekes.

Majd kísérletezek én is kicsit.
-
Karma
félisten
válasz
WonderCSabo
#2581
üzenetére
2) Túlbonyolítod, a LogHoldernek nem kell generikusnak lennie, viszont a TypeTokenre szükség van. Tegnap este telefonon nem volt hangulatom kisakkozni, úgyhogy köszi hogy beírtad

Szóval végeredményben így festene:
public class LogHolder {
List<ArrayElem> ReturnDataSet;
}
gson.fromJson(in, new TypeToken<LogHolder>(){}).getType()); -
Karma
félisten
válasz
WonderCSabo
#2579
üzenetére
A nagy hajrában két dolgot hadd tegyek hozzá:
1) Hálózati kommunikációt nem UI szálon kéne csinálni, szerintem az URL.openStream el fog hasalni.
2) A LogHolder.class nem lesz elég, mert a generikus lista típusparamétere addigra elvész. TypeTokent kéne beadni a LogHolderre. -
Karma
félisten
Sajnos nem ennyire egyszerű. Mi úgy szoktuk csinálni, hogy írunk egy TextView leszármazott osztályt, ami konstruktorban beállítja magának a betűtípust, és ezt az osztályt használjuk a gyári TextView helyett a layoutokban.
Fontos, hogy a betűtípus objektumot lehetőleg csak egyetlen egyszer töltsd be a memóriában assetből, ezért célszerű egy statikus osztályt írni erre a feladatra, akitől el lehet kérni a betűtípus(oka)t.
Ha több egyedi betűtípus is kell, akkor írhatsz egy egyedi XML attribútumot, amivel szabályozhatod, hogy melyik typeface kell. Például akkor, ha külön font fájlod van regular, bold, light, stb. változatokhoz, és nem akarsz emiatt négy subclasst külön.
-
Karma
félisten
Soha, de soha nem szabad fotókat a createScaledBitmappel skálázni!
Az Android Training külön fejezetet szentel ennek a kérdésnek, azt mindenképpen ajánlom megértésre, aztán meg használj egy kész libet erre a munkára.
Az előbb linkelt Picasso például teljesen jó.
Én meg az Universal Image Loadert szoktam használni. -
Karma
félisten
Ha kicsiben csinálod, akkor a Nexusok elég jó választásnak számítanak, hiszen sokáig megkapják a legújabb OS-t. Ha viszont komolyabban bele akarsz folyni a piacba, előbb-utóbb célszerű lesz kiszélesíteni a palettádat kis/gyenge telefonokkal és csúcstelefonokkal is, mert egyrészt egy app jó, ha minden vason jól fut, másrészt rengeteg gyártófüggő meglepetést rejt az Android.
-
Karma
félisten
1) A megjelenítéssel az a baj, hogy létrehozol TextView-kat kódban, beállítod a szövegüket, de aztán nem rakod őket sehova se. Azt felejtsd el, hogy kódban csinálsz ilyesmit! Erre való a layout XML, ott rakd össze a felületet!
2) Semmi akadálya annak, hogy a harmadik Activityt a második indítsa. Szabadon építheted láncba őket - ha a második elfinisheli magát a harmadik indítása után, akkor a visszagombbal az elsőre jutsz. Ha nincs finish, akkor 3 -> 2 -> 1 lesz a visszairány.
-
Karma
félisten
válasz
laslie92
#2519
üzenetére
Egy értesítéseket fogadó alkalmazáshoz alapvetően három dolgot kell összekapcsolnod: a PHP-s webalkalmazásodat (továbbiakban webapp), a Google Cloud Messaging szolgáltatást (GCM), és az újdonsült Android alkalmazást (mobilapp).
A folyamat nagy vonalakban így néz ki:
1) A Google Developers Console-on regisztrálod magadat, és létrehozol egy azonosítót a webappnak (azaz a küldő félnek).2) A webappot kiegészíted két modullal:
a) az egyik a felhasználókat, azon belül a telefonjaikat gyűjti egy adatbázisba (innen fogod tudni, hogy hova kell küldeni az értesítéseket), és ehhez nyújt valamilyen web service-t a mobilappnak;
b) másrészt a tényleges küldést is a webappban kell megírnod: ha valaki kap egy új üzenetet, akkor meg kell nézni a DB-ben a hozzá tartozó telefont, és arra/azokra lőni egy üzenetet a GCM-en keresztül. Ez egyébként nem bonyolult, csak kell a webapp azonosítója, a címzett, meg a tartalom.3) Megírod a mobilappot.
a) Nem árt, ha a push fogadáson túl van más funkciója is, de ez most mellékes.
b) A mobilappnak regisztrálnia kell a GCM-hez (ez kód szempontjából egyszerűen, egy BroadcastReceiverrel és pár hívással megoldható). A GCM ad a telefonnak ad egy egyedi azonosítót, amit el kell juttatnod a 2a) pontban írt web service-en keresztül a szerverednek, hogy mostantól meg tudja címezni a telefont. A regisztrációnak egyébként illik minden alkalmazásinduláskor lefutnia, és az appnak frissítenie a szerveren a címét, mert változhat. Az se árt, ha közben belecsempészed a felhasználó nevét is.
c) Meg kell írnod, hogy mi történjen, amikor jön egy értesítés, például felraknod egy értesítést az értesítési sávra, vagy ha fut a program, egy dialógust feldobni. Az Android semmit se csinál meg helyetted.És igazából ennyi.
Vannak meglévő szolgáltatások, amivel a folyamat egyes részei felgyorsíthatóak/leegyszerűsíthetőek. Kettő jutott eszembe hirtelen, mert ezeket elég sűrűn használom: a PushBullet és az Azure Notification Hub.
A PushBullet egy önálló alkalmazás és pushküldő szolgáltatás, amivel regisztráció után bármit lehet küldözgetni magadnak az eszközeid, szervereid között. Ha csinálsz a webappodhoz egy modult, ami össze tud kötni egy felhasználót egy PB fiókkal, akkor tudnak értesítéseket fogadni iOS-en, Androidon és asztali böngészőkben is - és akkor nem kell saját appot írnod.
Az Azure Notification Hub meg a 2)-es pontot tudja lényegesen leegyszerűsíteni. Elvégzi az eszközök begyűjtését, karbantartását, és még a GCM-mel is beszél helyetted, cserébe használat alapon fizetni kell érte. De nagy tételben elég jó dolog.
Azt te tudod, hogy a konzerv social networködet mennyire tudod módosítani kézzel, nem tudom megítélni azt se, mennyi elszántságod van hozzá. Azzal nyugodtan számolhatsz viszont, hogy egy ilyen fejlesztés hatszámjegyű tétel, ha valakit keresel hozzá.
Egyébként ez milyen PHP motor? Több helyen láttam, de mindenhol már átírták benne a neveket, nem tudom mi az eredeti.
-
Karma
félisten
Valószínűleg túlkomplikáltad fejben. Ahány input meződ van, annyiszor hívd meg a putExtrát, más-más kulccsal. Ez a "user" kulcs nem tudom honnan jön, valószínűleg valami üzenettel kapcsolatosat akartál volna írni a kódodban.
Célszerű egyébként az extrák kulcsait public static final Stringekben tárolni, és változóként hivatkozni rájuk, mert akkor kisebb az elgépelés esélye.
Megpatcheltem a példád:
public class MainActivity extends Activity {
public static final String EXTRA_MESSAGE = "com.valami.MainActivity.EXTRA_MESSAGE";
public static final String EXTRA_TARGET_USER = "com.valami.MainActivity.EXTRA_TARGET_USER";
Button _button1;
EditText _messageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_button1 = (Button) findViewById(R.id.button1);
_messageText = (EditText) findViewById(R.id.editText1);
_button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String message = _messageText.getText().toString();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TARGET_USER, ...); // peldaul
startActivity(intent);
}
});
}
}Bátorkodtam a magyar megnevezéseidet és inkonzisztens kis-nagybetűidet egységesíteni. Mindenkivel jót teszel, különösen magaddal, ha csak egy nyelven és csak egy stílusban írsz kódot.
-
Karma
félisten
Egy kérdés, ami nagyon kikívánkozik: ezt a kódot, különösen a break labeleket, te írtad kézzel? Meg a static változóba lerakott adattagokat? Vagy ez egy visszafejtett projekt, amit elkezdtél kézzel reszelni?
Mert ha bármelyikre is igen a válasz, sőt, még anélkül is, nagyon javaslom hogy kuka az egész adatkezelésre és oldd meg rendesen. Például JSON-re a manuális feldolgozás helyett használd a Gson-t a modell osztályoddal és majd ő kitölti a mezőket.
A 173-as sort egyébként tényleg nem lehet elérni, hiszen előtte ott a return vagy a break minden esetben. A 202-essel ugyanez a helyzet, ott van előtte a return. A sor így felesleges. Egyben indikátora, hogy itt gondok vannak, nem kicsit.
-
Karma
félisten
Igen, bekerülnek, amikor az R újragenerálódik (Anttal fordítás elején, Eclipse-ben azonnal kellene a fájlváltozáskor, de legrosszabb esetben egy Refresh után a res könyvtáron).
Ezen kívül semmilyen dolgod nincs, csak megfelelően hivatkoznod kell (név alapján) az új fájlokra. Pl. XML-ben <include> tag, és benne @layout/uj_layout_file, ha pl. a layoutod neve az volt, hogy uj_layout_file.xml. Java kódban meg R.layout.uj_layout_file lesz a konstans.
-
Karma
félisten
Mindenképp. Az alapokkal tisztában kell lenni akkor is, ha webes technológiával megy neki a fejlesztésnek az ember; ehhez meg célszerű ismerni legalább egy platform lelkivilágát meg mondjuk az MVC alapelveket.
Egyébként az Ionic Frameworkkel elég jó tapasztalataim vannak.
-
Karma
félisten
Virtuous Ten Studiót használok erre mindig.
-
Karma
félisten
Ez a jó megoldás

Azzal a Canvasszal csak onDrawban rajzolhatsz, különben nem lesz hatása. Nem szabad referenciát eltenned arra a példányra.
Viszont nincs akadálya annak, hogy saját Canvast hozz létre egy saját Bitmap köré, mint például ez az átméretezetted, amire akkor rajzolsz amikor akarsz.
Itt van egy kis infomorzsa.
-
Karma
félisten
Semmiképp se mátrixszal! Úgy kiszaladsz a memóriából, mint a huzat!
Helyette a BitmapFactory.Options.inSampleSize lesz a barátod, ezzel csak minden n-edik pixelt dolgozza fel az Android a képből, nagyságrendekkel csökkentve a memóriaigényt.
Ezt elmulasztani a halálfejes hibák egyike.
-
Karma
félisten
válasz
BtommyX
#2477
üzenetére
Semmi jogi gond nincs azzal, ha leírod. Mondjuk az se árt, ha tudod mit jelent, és hogy ennek leírása már nem szükséges (Wikipédia alapján, nem vagyok jogász).
-
Karma
félisten
A közelmúltban semmiképp, mert sértené a kauzalitás elvét, és kiszámíthatatlan következményei lennének az univerzumra.

Viszont az a helyzet, hogy abszolút nulla háttérrel a közeljövőben se valószínű, hogy megvalósítható a dolog. Könnyebb lenne az ötlet ismeretében nyilatkozni, de az írott angol nyelv értését, a Java programozási nyelv ismeretét, se az alapvető szemléleteket és fogalmakat nem nagyon lehet megspórolni.
Ha például elkezded olvasni az Android Traininget, ami a Java ismeretében egy egész jó bevezető (és némely kérdésben irányadó) anyag, és kínainak érzed, akkor inkább keress tovább olyan embereket, akiknek tetszik az ötleted.
Ebben mondjuk tényleg segítene az ötlet megosztása.

-
Karma
félisten
válasz
levente1227
#2460
üzenetére
Ezt a kérdést inkább az Androidos tablet topicban tedd fel, mert az alkalmazásfejlesztéshez nincs sok köze. Köszi.
-
Karma
félisten
válasz
vazee00
#2455
üzenetére
A ProGuard, ami az Android SDK része is, tudja obfuszkálni a metódusokat és változókat a kódodban, megnehezítve a visszafejtést. Ha 4.1-es Android fölé targetelsz, még az APK-t is titkosíthatod, ami kvázi lehetetlenné teszi az illetéktelen kibontást.
Viszont. Ahogy sztanozs is írta, ezeket ne használd egy potenciálisan végzetes biztonsági hiba palástolására!
-
Karma
félisten
Mondjuk úgy látom, hogy egy éve kezdte el ezeket a videókat, akkor még én is az ADT-t javasoltam volna

Azt nem tudom, hogy a videók és a kód milyen minőségűek, de a tartalomjegyzék alapvetően rendben van. Az ActionBarSherlock helyett mondjuk már ott van az AppCompat - de ez csak apróság.
Személy szerint nagyon nem szeretem az ilyen kód-oktató videókat. Sokkal jobban értékelem, ha cikkeket írnak videó helyett, könnyebben navigálható és sokkal kevesebb idő feldolgozni. De ez csak magánvélemény

-
Karma
félisten
válasz
sylvia_1988
#2448
üzenetére
A neve a legnagyobb céltábla, hiszen könnyen (automatizáltan) kereshető, és 1000%, hogy levédték.
Itt tudsz keresni az USA-ban érvényes védjegyek között.Ha sikeres az alkalmazásod, szinte biztos, hogy nem lesz jó vége

Esetleg a paródiával lehetne takarózni, ha olyan jellegű a program, de inkább csináld generikusan. -
Karma
félisten
válasz
sylvia_1988
#2446
üzenetére
Ez egy érdekes és felettébb veszélyes aknamező. Nem vagyok jogász, de azt tudom, hogy az ilyen sztárok imázsát rengeteg védjeggyel bástyázzák körül: a nevet, a jellegzetes mondatokat, sőt néha a pózokat, még extrémebb esetekben a ruházatot is levédetik.
Ha ezeket megsérted és észreveszik, levetetik Playből azonnal (idáig biztos), és az ügyvédeiken múlik, hogy megúszod figyelmeztetéssel, vagy perrel jönnek - legalábbis amikor amerikai a jogsértő. Nemzetközileg nem tudom, hogy megy.
Mindenesetre nagy körültekintőség kell.
-
Karma
félisten
Igazából Ubuntun is próbálkozhatsz, ha az eszközön tesztelést be tudod lőni (sok múlik a szerencsén, meg ha más nem, az udev konfigon, amit az internet leír).
Választanod kell, hogy az Eclipse vagy az IntelliJ IDE szimpatikusabb - én már lehet, hogy az utóbbival mennék neki, sokkal okosabb -, az előző két link a komplett csomagokra visz.
A teljesség kedvéért meg hagy oldjam fel a rövidítéseket:
SDK: az a csomag, ami az IDE-től függetlenül a fejlesztéshez kell. Tipikusan egy Android alverzió = egy API level, és ilyen szintenként van SDK külön; de ezeket kézzel nem fogod kezelni, hanem a csomagban lévő SDK Manager programon keresztül rakhatod fel azt, ami kell. A legújabb benne van a bundle-ben.
NDK: olyan fordító meg headercsomag, amivel C/C++ részeket lehet fordítani az alkalmazásodhoz. Szerintem a letöltésével is bőven ráérsz, miután a Java oldalt (mondjuk az Android életciklusait, mechanizmusait) már kívülről fújod.
ADT: ez az Android fejlesztéshez szükséges Eclipse plugin neve. Felrakhatod az előbb linkelt bundle-lel (Eclipse + ADT + egy Android SDK), meg ha kitartó vagy, saját Eclipse-be is egy update site-on keresztül. De tanulni egyszerűbb a kész csomaggal szerintem.
Android Studio: ez meg az az IntelliJ-alapú környezet, ami teljesen kiváltja az ADT-t, és sok szempontból még így bétaként is jobb annál (pl. új Gradle-alapú buildrendszer).
Új hozzászólás Aktív témák
- Apple iPhone 14 Pro 128GB 100% Akku Újszerű,Kártyafüggetlen,Dobozos,Tartozékaival! 1 Év Garanciával!
- Karcmentes Fóliás Apple iPhone 17 Pro 256GB Cosmic Orange 1OO% ! még 1OHó nemzetközi APPLE GaranciA
- Eladó Nvidia GeForce GTX 1080 Ti olcsóbban, hibás ventivel
- LOQ 15AHP10 15.6" FHD IPS Ryzen 7 250 RTX 5060 16GB 512GB NVMe magyar vbill gar
- Lenovo Legion 5 15IAH7H - 32GB, 1TB, 12700H, 3070 Ti, 165Hz WQHD
- Új és újszerű 13-14 Gamer, ultrabook, üzleti, 2in1, X360, Touch készülékek kedvező áron Garanciával
- Bomba ár! Lenovo X1 Carbon G7: i5-8265U I 8GB I 256SSD I 14" FHD Touch I HDMI I Cam I W11 I Gari!
- Azonnali készpénzes Apple Macbook Air felvásárlás személyesen / csomagküldéssel korrekt áron
- AZONNALI SZÁLLÍTÁSSAL Eladó Windows 8 / 8.1 Pro
- Akciós kisWorkstation! Dell Precision 3570 i7-1255U 4.7GHz / 32GB / 1000GB / Quadro T550 4GB FHD 15"
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopműhely Bt.
Város: Budapest
(AS 1.3 elkélhet hozzá).

, csak az elrejtés miatt gondoltam, hogy jobb lehet külön listener. Mondjuk csak most gondoltam bele, de ha a kép szélessége fix, magassága wrap_content, akkor a be-nem-töltött kép amúgy is nulla magas lesz.

Azzal hogy main függvényeket írtál, nem jutottál sehova. Desktopon se jelentene semmit ebben a formában, itt meg végképp nem.


