მოგესალმებით, სანამ უშუალოდ დავიწყებდე მაგალითის ჩვენებას, თუ როგორ უნდა გავიგოთ რა დროს ჩავრთეთ/გამოვრთეთ GPS ან Internet-ი ჩვენს ანდროიდ მოწყობილობაზე ჩვენივე დაწერილი აპლიკაციით, მინდა მოკლედ მოგახსენოთ თუ რატომ გადავწყვიტე ამ პოსტის დაწერა. ერთი თვის წინ, ან თვე-ნახევრის წინ დავიწყე ანდროიდზე კოდის წერა და პროექტების შექმნა. რაღაც დეტალებმა დამაინტერესა. კონკრეტული პროექტის შექმნისას დამჭირდა გამერჩია GPS-თან და Internet-თან მუშაობის ნიუანსები. დამჭირდა გამეგო როგორ შეიძლება მოვუსმინო GPS-ისა და Internet-ის ჩართვა/გამორთვის event-ებს და კოდის ძებნა ინტერნეტში დავიწყე, ახლა კი მინდა ჩემი გამოცდილება გავუზიარო ქართველ მკითხველს და მომავალში საჭიროების შემთხვევაში იმედი მაქვს ეს პოსტი დაეხმარება. ახლა კი საქმეზე გადავიდეთ:
არ შევეხები იმას, თუ რა არის Activity, manifest-ფაილი, BroadcastReceiver-ი და ზოგიერთი კლასი, რადგან ეს ფართო თემაა და თან ეს პოსტი არ არის განკუთვნილი.
ჩვენ, რომ ზემოთ ხსენებულ event-ებს მოვუსმინოთ, საჭიროა შევქმნათ ჩვენი Reveiver კლასი, რომელიც იქნება BroadcastReceiver კლასის მემკვიდრე. ვნახოთ ამ კლასის მაგალითი:
package com.example.chalauri.receiverdemo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; /** * Created by chalauri on 10/8/2016. */ public class MyReceiver extends BroadcastReceiver { private static String LOG_TAG = "RECEIVERS_DEMO"; @Override public void onReceive(Context context, Intent intent) { boolean internetState = internetState(context); if (internetState) { Log.i(LOG_TAG, "INTERNET TURNED ON"); } else { Log.i(LOG_TAG, "INTERNET TURNED OFF"); } Boolean gpsState = gpsState(context, intent); if (gpsState != null) { if (gpsState) { Log.i(LOG_TAG, "GPS TURNED ON"); } else { Log.i(LOG_TAG, "GPS TURNED OFF"); } } } private boolean internetState(Context context) { ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected(); } private Boolean gpsState(Context context, Intent intent) { LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) { if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { return true; } else { return false; } } return null; } }
internetState და gpsState მეთოდები აბრუნებენ boolean ტიპს, რომელის true მნიშვნელობა განსაზღვრავს იმას, რომ GSP და Internet-ი ჩართულია. დანარჩენ შემთხვევაში პასუხი უარყოფითია. აქვე არ დაგვავიწყეს, რომ ჩვენ ჩვენი MyReceiver კლასი უნდა დავარეგისტრიროთ manifest ფაილში როგორც receiver-ი და ამავე ფაილში უნდა ჩავწეროთ რომ ჩვენი აპლიკაცია მოითხოვს Internet-სა და GPS-ს. ვნახოთ manifest-ის მაგალითი:
<pre><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.chalauri.receiverdemo"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <action android:name="android.location.PROVIDERS_CHANGED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".MyReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.location.PROVIDERS_CHANGED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> </application> </manifest>
ხოლო დანარჩენ ფაილებს არ ვეხებით და ვტოვებთ ისე, როგორც სტანდარტულად Android Studio ქმნის ხოლმე.