- 浏览: 5826967 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
项目中需要这样的要求:
启动一个服务一直在背后监听当前位置变化,如果进入到离某个地点n千米内,发出一个Notification提醒用户附近有什么什么......
这里我采用的策略是这样的:
首先监听网络,如果联网了就启动距离监听服务,否则关闭距离监听服务。因为网络一旦断了,何谈距离变化?
其次,是否需要开机自启动网络监听,这样也就等于启动了距离监听服务。
其三,一旦进入到某个范围之内,就马上关闭距离监听服务,否则会不停的提醒,用户会觉得很烦。
基于以上步骤,首先实现一个距离监听服务
网络监听服务,其实注册了一个广播,监听手机CONNECTIVITY_ACTION动作即可
如有必要加上开机启动
以上service,BroadcastReceiver都需要注册,再加上网络权限等
启动一个服务一直在背后监听当前位置变化,如果进入到离某个地点n千米内,发出一个Notification提醒用户附近有什么什么......
这里我采用的策略是这样的:
首先监听网络,如果联网了就启动距离监听服务,否则关闭距离监听服务。因为网络一旦断了,何谈距离变化?
其次,是否需要开机自启动网络监听,这样也就等于启动了距离监听服务。
其三,一旦进入到某个范围之内,就马上关闭距离监听服务,否则会不停的提醒,用户会觉得很烦。
基于以上步骤,首先实现一个距离监听服务
package com.mobovip.app; import java.text.DecimalFormat; import java.util.ArrayList; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class LocationService extends Service{ private Context context; public static ArrayList<Store> stores=new ArrayList<Store>(); public static double distance = 3;//7430km private LocationManager locationManager; private NotificationManager notificationManager; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); context = this; locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){ // locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 1f, locationListener); // }else{ locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000, 1f,locationListener); // } // Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); // if(location != null){ // checkDistance(location); // } } private final LocationListener locationListener = new LocationListener() { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 public void onLocationChanged(Location location) { // log it when the location changes if (location != null) { checkDistance(location); } } // Provider被disable时触发此函数,比如GPS被关闭 public void onProviderDisabled(String provider) { } // Provider被enable时触发此函数,比如GPS被打开 public void onProviderEnabled(String provider) { } // Provider的在可用、暂时不可用和无服务三个状态直接切换时触发此函数 public void onStatusChanged(String provider, int status, Bundle extras) { } }; @Override public void onDestroy() { super.onDestroy(); if(locationManager!=null){ locationManager.removeUpdates(locationListener); locationManager=null; } } private void checkDistance(Location location) { if (location != null) { float[] results = new float[1]; for (Store store : stores) { Location.distanceBetween(location.getLatitude(), location.getLongitude(), store.getLatitude(), store.getLongitude(), results); float result=(results[0] / 1000);//km if (result < distance) { showNotification(store); stopSelf();//不要频繁的提醒 break; } } } } private static final int NOTIFY_ID = 0; private void showNotification(Store store) { notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Intent intent = new Intent(this, BGR.class); // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);// FLAG_ONE_SHOT Notification notification = new Notification.Builder(context) .setTicker(context.getString(R.string.app_name, "")) .setContentTitle(store.getStoreName()+"("+store.getDistance()+")") .setContentText(store.getStoreAddress()) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.ic_launch_notify) .setAutoCancel(true) .setWhen(System.currentTimeMillis()) .setDefaults(Notification.DEFAULT_ALL) .getNotification(); notificationManager.notify(NOTIFY_ID, notification); } }
网络监听服务,其实注册了一个广播,监听手机CONNECTIVITY_ACTION动作即可
package com.mobovip.app; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.IBinder; public class NetworkStateService extends Service { private static final String tag = "tag"; private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); if (info != null && info.isAvailable()) { Intent service = new Intent(context, LocationService.class); startService(service); } else { Intent service = new Intent(context, LocationService.class); stopService(service); } } } }; @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub return super.onUnbind(intent); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mReceiver, mFilter); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } }
如有必要加上开机启动
package com.mobovip.app; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /** * BootReceiver * * @author NGJ * */ public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent i = new Intent(context, NetworkStateService.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startService(i); } }
以上service,BroadcastReceiver都需要注册,再加上网络权限等
<service android:enabled="true" android:name="com.mobovip.app.NetworkStateService" /> <service android:enabled="true" android:name="com.mobovip.app.LocationService" /> <!-- <receiver android:name="com.mobovip.app.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> -->
发表评论
-
利用广播实现强制下线功能
2016-12-28 10:45 1473最近一口气买 ... -
Android百分比布局Percent支持库
2015-09-02 11:08 3150虽然有很多的布局可以在 Android 应用程序开发的世界供我 ... -
ViewDragHelper行为测试
2015-08-12 17:36 2745只是简单记录一下 以后可能会实现一些效果 import ... -
android5.x之Palette调色板
2015-07-17 10:30 3342Palette类可以分析一张图片,取出这张图片的特征色,然后为 ... -
使用ClipboardManager剪贴板实现复制粘贴功能
2015-04-10 14:39 3778经常要使用复制粘贴的功能,比如长安一个TextView弹出一个 ... -
Android下集成FacebookSDk到项目并发表评论
2013-08-28 14:36 4878项目中需要发表自己的评论到Facebook,需要集成Faceb ... -
MediaRecorder录音,MediaPlayer播放
2013-05-23 09:53 7554直接看代码 import java.io.DataOutp ... -
Notification的基本用法
2013-05-22 11:52 5968android4.0以前: private static ... -
android音频、视频、拍照基础操作
2013-03-27 11:55 2831播放音乐和视频用的是类:MediaPlayer 刻录声音和视 ... -
tabhost通过手势滑动切换activity
2013-02-18 17:59 11164package com.mars.mp3player; ... -
VideoView简单视频播放
2013-02-17 17:17 9305只是上上手而已的例子。 package com.chen ... -
android 再按一次后退键退出应用程序
2012-06-15 21:51 4133private static Boolean isExit ... -
AlarmManager全局定时器/闹钟
2012-02-01 10:11 5863http://407827531.iteye.com/blog ... -
倒计时的CountDownTimer
2011-12-23 13:06 31248直接看这里吧,我只是搬运工。 定时执行在一段时候后停止的倒计 ... -
Android流量统计TrafficStats类的使用
2011-12-06 16:25 26467对于Android流量统计来说在2.2版中新加入了Traffi ... -
ScrollView当显示超出当前页面时自动移动到最底端
2011-09-01 09:42 17016卷轴视图(ScrollView)是指当拥有很多内容,一屏显示不 ... -
在SurfaceView上拖动一架飞机
2011-08-23 12:40 2943接上一篇在SurfaceView上拖动一张小图片 什么叫拖动飞 ... -
在SurfaceView上拖动一张小图片
2011-08-22 18:20 5249用手指随便拖。这里采用了线程去绘制,其实也可以在onTouch ... -
用getIdentifier()获取资源Id
2011-07-28 22:36 10776做项目过程中遇到一个问题,从数据库里读取图片名称,然后调用图片 ... -
利用VelocityTracker监控对触摸的速度跟踪
2011-07-28 22:12 10066VelocityTracker就是速度跟踪的意思。我们可以获得 ...
相关推荐
在Android开发中,获取用户地理位置并监听位置变化是常见的需求,尤其在地图应用、导航服务以及定位相关的功能中。本文将详细介绍如何通过GPS提供者在Android中实现这一功能。 首先,我们需要了解Android中的定位...
- 使用LocationListener监听位置变化,当位置变化满足用户设定的触发条件时,启动AlarmManager安排闹钟事件。 **第六章 结论** 通过这次实训,学生不仅能掌握Android开发的基本技能,还能深入了解位置服务的实现...
(1)定时功能的实现,调用系统当前时间,使用...(2)当前位置的获取,使用GPS功能获取当前位置,并且显示出经度和纬度,并且使用位置监听事件LocationListener监听位置变化,当位置改变时,获取新的经纬度,并显。
当设备的位置发生变化时,`LocationManager`会调用`LocationListener`中的方法来通知应用。 - **`Location`**:表示一个具体的位置信息,包含经纬度、海拔、速度等数据。 #### 实现步骤 1. **添加权限** 在`...
第一个参数是定位提供者(这里是GPS),第二个参数是更新间隔时间(单位为毫秒,0表示立即更新),第三个参数是距离变化阈值(单位为米,0表示任何距离变化都会触发更新),第四个参数是我们之前定义的...
通常,推荐在Activity的`onCreate`方法中进行,以便在应用启动时就准备好监听位置变化。实现`LocationListener`的四个回调方法: 1. `onLocationChanged(Location loc)`:当GPS位置更新时,系统会调用此方法,提供...
LocationListener是一个接口,包含onLocationChanged()方法,当位置发生变化时,这个方法会被调用。这里我们定义一个内部类实现LocationListener: ```java LocationListener locationListener = new ...
每次位置发生变化时,LocationManager都会调用onLocationChanged()方法,并传入一个Location对象,该对象包含了更新后的位置信息。 在LocationListener的onLocationChanged()方法中,可以编写处理位置信息的代码。...
在源代码中,开发者会注册一个`LocationListener`来监听位置更新,并设置`ProximityAlert`,当设备进入或离开特定地理区域时触发警报。 1. **Proximity Alert的创建**:在Android中,`addProximityAlert()`方法用于...
4. `new TestLocationListener(myloctionController,mapOverlays, firstOverlay)`:一个实现了LocationListener接口的对象,当位置发生变化时,该监听器会接收到通知。 LocationListener接口包含四个方法,其中最...
当位置改变时,`onLocationChanged`方法会被调用,这里可以获取到新的Location对象,其中包含了经纬度坐标、海拔、速度、时间和精度等信息。开发者可以根据这些信息进行相应的处理,比如显示在地图上,或者发送给...
在这个实例中,我们首先检查了运行时权限,然后设置了LocationListener来监听位置变化。当位置发生变化时,`onLocationChanged` 方法会被调用,从中我们可以获取到最新的经纬度。记得在暂停和恢复Activity时管理位置...
这会持续监听位置变化,当满足特定条件(如时间间隔或距离变化)时触发回调。例如,每2秒更新一次,当位置变化超过10米时: ```java // 创建位置监听器 LocationListener locationListener = new LocationListener...
- **触发距离**:在设置Proximity Alert时,你需要指定一个阈值,当设备与目标位置的距离小于这个值时,警报会被触发。这个值通常以米为单位。 - **移除警报**:为了节省系统资源,应用可能需要在不再需要Proximity...
这里的参数分别代表:位置提供者(GPS)、最小时间间隔(毫秒,0表示立即更新)、最小距离变化(米,0表示任何距离变化都触发更新)和LocationListener实例。 为了获取一次当前位置,你可以调用LocationManager的`...
这里的参数分别是位置提供者(GPS)、最小时间间隔(毫秒)、最小距离变化(米)和`LocationListener`实例。当位置发生变化时,`onLocationChanged()`方法会被调用。 当你不再需要位置更新时,记得移除监听器: ``...
接下来,我们需要创建一个LocationListener来监听GPS位置的变化。在Android SDK中,我们可以使用`LocationManager`来注册和管理这个监听器: ```java LocationManager locationManager = (LocationManager) ...
在Android开发中,实现“定期跟踪用户在后台的位置”是一个常见的需求,特别是在构建导航、健身应用或者提供基于位置服务的应用时。以下将详细介绍这个过程涉及的关键知识点和步骤。 首先,理解Android系统的权限...
需要开启定位服务,并设置LocationListener监听位置变化。在LocationListener中,我们可以获取到经纬度、速度、精度等定位信息。 为了实现打卡功能,我们需要判断用户是否在特定范围内。这通常通过计算用户当前位置...