【发布时间】:2018-03-18 12:02:35
【问题描述】:
我正在尝试构建一个提醒应用程序。 在这个应用程序中,用户将选择一个保存在手机上的 WiFi 名称。当用户连接到那个 WiFi 时,电话会振动。手机震动之后,服务就会死掉。
我尝试编写一个服务来每 1 分钟检查一次 WiFi 名称。当我关闭应用程序时,它会再次运行,但与我预期的不同。
服务实现:
public class AlarmService extends Service {
private static final String TAG = "com.wificheckalways";
public static String wifiToCheck = MainActivity.wifiName;
public AlarmService(){
}
public int onStartCommand(Intent intent, int flags, int startId){
Log.i(TAG, "onStartCommand called");
Runnable runnable = new Runnable() {
@Override
public void run() {
String ssid = "";
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
final WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.getSSID())) {
ssid = connectionInfo.getSSID();
}
}
while(!wifiToCheck.equals(ssid)){
Log.i(TAG, "Goes to SLEEP");
synchronized (this){
try{
Thread.sleep(60000);
Log.i(TAG, "WAKE UP");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo.isConnected()) {
final WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
if (connectionInfo != null && !TextUtils.isEmpty(connectionInfo.getSSID())) {
ssid = connectionInfo.getSSID();
Log.i(TAG, "Compare " + wifiToCheck + " with " + ssid);
}
}
}
if(wifiToCheck.equals(ssid)) {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(2000); // 2000 miliseconds = 2 seconds
}
}
};
Thread alarmThread = new Thread(runnable);
alarmThread.start();
return Service.START_STICKY; //Restart service if it got destroyed
}
public void onDestroy(){
Log.i(TAG, "onDestroyCommand called");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
我在 MainActivity.java 中启动服务的地方:
public void SetAlarm(View view) {
if (!wifiName.equals("")) {
Toast.makeText(getApplicationContext(), "Alarm set for: " + wifiName, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, AlarmService.class);
startService(intent);
}
else{
Toast.makeText(getApplicationContext(), "Please choose a WiFi name!!!", Toast.LENGTH_SHORT).show();
}
}
wifiName 是选择的 Wifi。
这段代码有什么问题?
【问题讨论】:
-
我会在服务内使用广播接收器,当 WiFi 连接改变时接收消息。从该消息中,我将提取有关连接的信息并检查 WiFi 的 SSID 是否等于保存的 SSID。如果是,手机会振动。这样你就不必使用线程了。
-
那么,服务将运行以检查 WiFi 连接是否已更改?如果是,那么我将获取当前的 SSID 并与选择的 SSID 进行比较。我对吗?但我仍然不明白如何在其中使用广播接收器:/
-
Context-registered broadcast receiver, broadcast receiver for connection change。创建服务时 (
onCreate) 注册连接更改(当然在onDestroy中取消注册)。您用于检查用户是否连接到特定 SSID 的代码将进入广播接收器的方法onReceive。在这种情况下,您将在振动后停止服务。 -
最后一个问题,如果用户连接的 WiFi 不是选择的 WiFi,会发生什么?
-
什么都没有。你仍然会拥有
if (wifiToCheck.equals(ssid))。如果它们不相等,您的服务仍将等待用户连接到特定(选择的)WiFi。如果它们相等,手机会振动,您将停止服务。
标签: android android-intent service alarmmanager