Android Programjaim

Android fejlesztes, java, kotlin, web.. miegymas:)

Helyzetjelentés 10.0 + widgetek

2018. november 22. 07:53 - lacas82

Na szoval, kicsit regen irtam, nem mindig van kedvem blogolgatni mar. Plusz jelenleg beteg is voltam/vagyok, most kezdek kimenni belole, nevezetesen mindenfele reumas bajaim vannak (utalom az oszt/telet, en egy igazi nyari gyerek vagyok) Szoval kb 1 honapja szenvedek vallizuleti cuccal es elni sincs tul sok kedvem. Raadasul rajon ez a rossz ido es a depresszio is, meg az itthoni helyzetek, hogy mostanaban eleg necces munkat talalni, igy le se tudom az agyam foglalni massal. No meg csaladi problemak.

Igy tehat elkezdtem par regi widgetemet atirni, refaktoralni. Pl. a TV Most-ot, amibol volt egy PRO verzio. Ezzel szenvedek most, mert a kod vagy 5-6 eves lehet es hat minosegileg kivanni valokat hagyott maga utan. Ugy kepzeljetek, hogy angol-magyar kevert kod, meg ilyenek. Jah es java, undormany. A masik, hogy valamiert android 8.0 felett nem futott, de erre kiterek kesobb. Ime kep a regi widgetrol:

tvm1.png

A regi verzio csak 2 meretet tudott, az uj verzio atmeretezheto lesz. A regi kod egy formedveny, az uj kod kotlin mar es szepen refaktoralt, kevesebb redundanciaval.

Persze 2020 van lassan, igy vannak benne ujdonsagok is. Ilyen pl a szinvalasztas, vagy az opciok, amikben mindenfele nyalanksag lesz.

No es egy kis szakma: 8.0+-on nem igazan mukodott mar a widget. Miert?

Ugye 8.0 es felette mar nem tudsz IntentService-el elinditani widgetet. Ezert ezt at kell irni, irom a lepeseket hogyan:

1, IntentService classt atirod JobIntentService-re
2, onHandleIntent-et onHandleWork-re
3, manifestbe addoljuk ezt:

<service android:name=".widget.MyWidgetService" android:permission="android.permission.BIND_JOB_SERVICE"> </service>

4, mar nem pendingIntent.send()-el vagy startService-el inditjuk a service-t, hanem: enqueueWork(context, MyWidgetService.class, JOB_ID, intent);

ahol JOB_ID egy tetszoleges int

5, klikkelnel pl a PendingIntent servicet broadcastre csereljuk:

pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent , PendingIntent.FLAG_UPDATE_CURRENT);
termeszetesen az action, stb megmarad

6, a broadcastnek lesz egy onReceive-je

override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)

if (intent.extras != null) {
val action = intent.action
val appWidgetId = intent.extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID)

if (action != null && appWidgetId != 0) {
val newPendingIntent = makeIntent(context, action, appWidgetId)
enqueueWork(context, UpdateService::class.java, JOB_ID, newPendingIntent)
}
}
}

7, manifestbe kell a WAKE_LOCK, hogy a regi eszkozokon is mukodjon:

<uses-permission android:name="android.permission.WAKE_LOCK" />

Es kesz is, mukodnie kell!

Par kep az uj verziorol:
device-2018-11-22-113017.png

device-2018-11-22-113122.png

Címkék: widget