Оценете темата:
  • 1 гласа - средно 1
  • 1
  • 2
  • 3
  • 4
  • 5

#1

Понеже не искам да си слагам canary версия на Android Studio, но ми е интересно нещо, пиша тук.
Едното ми запитване е, емулатора има ли wifi емулация? Казаха, че трябва да има, но не знам вече дали е пуснато.
Другото ми запитване е само ако на първото отговора е ДА. Ако имате време тествайте този broadcast receiver
Код:
<receiver
           android:name=".WifiService"
           android:enabled="true">
           <intent-filter>
               <action android:name="android.net.wifi.STATE_CHANGE"/>
           </intent-filter>
       </receiver>


   
Код:
public class WifiService extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
       NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
       if (info != null && info.isConnected()) {
           //show toast for example
       }
   }
}

Интересно ми е дали работи. Понеже до сега си работи добре, но от андроид O блокират някои от broadcast receiver-ите и не знам този дали работи. Инсталирал съм си библиотеките за Android O, но няма как да тествам на емулатора дали се пуска кода, защото няма wifi, а кода реално се пуска при връзка към wifi мрежа. Не искам да си слагам и developer preview на телефона.
И последното ми запитване е, ако на второто запитване кода не работи, как ще направя в Android О някакъв код да се пусне при връзка с wifi? Явно няма да стане с такъв receiver.
Попринцип всичко това ще го тесвам като пуснат официално 3та версия на студиото, но ако имате време пробвайте, че ми е интересно как седят нещата. Иначе поне се успокоих, че receiver-а за boot все още ще си работи.
Цитирай
Аксесоари
#2

Тествай onReceive(), ако винаги се извиква метода, то какъв код сложиш в него не е от значение - дали ще гледаш дали е включен wifi, дали батерията е паднала под 50% или си получил емайл от банката.
Цитирай
#3

Не те разбрах какво имаш впредвид. То ясно, че кода от onReceive няма значение какъв е, но onReceive се извиква само в определен момент според receiver-а. В случая по горе, тоя receiver извиква onReceive при връзка с wifi, но няма как да го тествам на емулатор с версия по ниска от андроид О. За това писах, да видя, ако някой е сложил canary на студиото да тества.

п.п. иначе на андроид N си работи, но след O променят някои неща
Цитирай
#4

Ти казваш следното: 
Цитат: но от андроид O блокират някои от broadcast receiver-ите

Затова тестваш 
Код:
@Override
  public void onReceive(Context context, Intent intent) {

  }
А вече какъв код има в тоя метод е все тая.
Цитирай
#5

За да се пусне onReceive в моя случай трябва да има този action на Broadcast Receiver-a в манифеста
<action android:name="android.net.wifi.STATE_CHANGE"/>
Това задава правило, че onReceive ще се извика само при промяна на wifi мрежата. Само в този случай. Виж че съм копнал код и за манифеста.

п.п. onReceive се извиква само според action-а в манифеста, а не при всякакви събития както ти казваш.

реално мен ме интересува дали <action android:name="android.net.wifi.STATE_CHANGE"/> е блокиран в android O
Цитирай
#6

Не, тази акция е с ограничение.

Без промени са следните:
https://cdn-images-1.medium.com/max/1000...a_7AVQ.png
Цитирай
#7

В такъв случай, някой знае ли какъв е най-удачния вариант за стартиране на броадкаст ресийвър в андроид О, при включване на wifi?
Цитирай
#8

Broadcasting ограниченията са само в манифеста (AndroidManifest.xml).

Най-лесната промяна е да регистрираш и премахнеш динамично Broadcast Receiver:
https://developer.android.com/reference/...tFilter%29
https://developer.android.com/reference/...eceiver%29
Цитирай
#9

Така като дам unregister при затваряне на приложението, няма ли да спре да засича Wifi състоянието като е затворено самото приложение?
Цитирай
#10

Най-добрия начин е да погледнеш тази статия. В нея е обяснено различни начини за заобикаляне на ограниченията в Андроид 8.
https://medium.com/exploring-android/exp...384762a66c

Ако имаш услуга (service) която прави нещо в реално време докато екрана е затворен или приложението е затворено (примерно аудио на живо, карти от Интернет, и т.н.), тогава ще се наложи да преработиш кода за да няма проблеми с новата Андроид версия.

Имай впредвид, че Интернет данни могат да се получават не само през Wifi, но и през Mobile Data, и Bluetooth Sharing.
Samsung телефоните предлагат други опции за шерване на Интернет връзка, и т.н.
Цитирай
#11

Не, нямам Service. В приложението ми има опция за показване на нотификации на определен интервал. Но това става само когато човека е в интернет. И понякога, ако човек е извън интернет цяла нощ да кажем, искам да се обнови информацията при wifi връзка. За това съм добавил опция при връзка с WiFi, да се покаже нотификация (ако са изпълнени няколко условия). Та за това ми е този broadcast receiver. Май като гледам трябва да го заменя с JobScheduler. Защото, ако стартирам receiver-а в самото активити, ще трябва и да го махна при затваряне на приложението доколкото разбирам, а това ще спре приложението да слуша за wifi връзка.
Цитирай
#12

Ако правилно съм разбрал, тогава един от начините да направиш това е следния:
- използвай JobScheduler, който да извиква JobService през определeн период от време
- в JobService провери за наличие на Wifi, и ако такава съществува, дръпни информацията, която те интересува от Интернет, след което покажи (ако се налага) нотификации

Когато приложението ти се стартира, прeмахни JobScheduler дейността.
След което добави динамично receiver да върши същата работа, и така докато приложението ти е във фокус или във фонов режим (foreground or background).

Когато Activity.onDestroy(), активирай JobScheduler да събужда услугата през определния интервал.
И премахни (unregister) динамично създадения Receiver.
Цитирай
#13

май и аз така ги виждам нещата, само че без broadcast receiver когато е отворено приложението. тогава не ми трябва да излизат известия, тъй като потребителя вижда нужната информация. само при затворено приложение ме интересува. ще се позанимавам с jobscheduler да видя как се оперира с него, но първо трябва да изчакам официалното орео на нексуса ми, че да мога да тествам, защото емулаторите за орео още нямат wifi (малко тъпо след като емулатора за нуга има).

Сега си поиграх с JobScheduler, но ако искам да ми върши работа трябва на определен период да се включва и да проверява каквото ми трябва. Това не ми върши работа, защото аз искам веднага при първоначална връзка с wifi да се стартира. А ако го направя да се пуска всеки 30 секудни да кажем, ще е кофти за батерията. Така или иначе сега си имам AlarmManager, който да върши каквото ми трябва на всеки 2 часа. Проблема си остава, какво да ползвам за да се активира само при първоначална връзка с WiFi, и след това да спре да работи, чак до следващото закачаване (след евентуално разкачване) към WiFi мрежа. Ако имате идеи помагайте...
Цитирай
#14

Няколко допълнения:
- JobScheduler е за Android 5+, сиреч API 21+
- промени кода да изпозлва JobScheduler, не само ако устройството е Андроид 8+
- ако поддържаш по-ниска версия от Андроид 5 (API 21-), тогава можеш да използваш Firebase JobDispatcher (https://github.com/firebase/firebase-job...er-android)
- Android 8.0 е официално обявен, и не е нужно да чакаш Google да изпрати съобщение че можеш да го смъкнеш през Wifi (OTA). Аз си инсталирах версията през техния сайт. Това е идентична версия, но OTA е на райони и брой устройства, т.е. може да получиш съобщение дори след повече от месец. Линк и пълни обяснения как да го инсталираш през ADB. Отнема 10 мин.:
https://developers.google.com/android/images
Цитирай
#15

Аз ако подкарам като хората функционалността на нуга, ще работи и на орео, не бързам за update-а. Въпроса е, както написах по горе, че с тоя JobScheduler няма да стане това, което ми трябва, освен ако не му задам интервал 1 минута, което ще е ужас.
Цитирай
#16

Има и други варианти.
Можеш да стартираш service с приоритет (foreground service) когато Activity.onDestroy().
Вярно, ще свети нотификация че има нещо от приложението което работи във фонов режим, но и това е алтернатива.

- https://developer.android.com/about/vers...l#back-all
- https://developer.android.com/reference/...ground(int, android.app.Notification)

За този случай, който те интересува обаче, нещата са малко размазани.
Ако нощен режим е подходящ, примерно можеш да използваш JobScheduler да се стартира в 5 сутринта, и след което на всеки 5 мин. До момента до който получи данни от сървър и покаже съобщение. След което спираш таймера.
Вярно, няма да е идеалния случай, но е относително подходящо.

Друг вариант е да определиш подходяща времева граница за нови съобщения и толеранс на бездействие (малко странно звучи всичко това на български).
Примерно не по-стари от 4 часа. Таймер на всеки 5 минути.

Т.е.
1. Стартираш JobScheduler 4 часа след като приложението е затворено.
2. Ако няма Wifi, промени да се обновява на всеки 5 минути
3. Ако открие Wifi и издърша данни за ново съобщение, занули JobScheduler да се стартира пак след 4 часа
4. Ако все така няма Wifi след 24 часов период (примерно), увеличи толеранса на веднъж на 10 мин. (или 20 мин.)
Цитирай
#17

Аз попринцип на всеки 2 часа си показвам нотификация, ако има интернет, било то и мобилен, просто исках когато телефона не е имал нет при първо пускане да дръпне информацията, но ще е малко сложно. Ще опитам това онова, ако не ще си стоя само с AlarmManager на всеки 2 часа и това е. Мерси за инфото.
Цитирай




Потребители разглеждащи темата: 1 гост(и)