如何实现监听用户驻留APP的时长(service的简单用法)
2016-04-14 11:48
661 查看
本文面向新手开发者。很多时候我们需要知道用户驻留在app内多长时间了。比如说我们要实现一个功能,当用户连续使用app20分钟以上时,增加其会员积分。
最先想到的可能是用timer来计时,其实并非如此。我们可以使用线程,其中的Thread.sleep(1000);方法。为了不影响用户使用,我们还需要一个service,在后台来操作。
以下是Service代码:
一个项目中有很多页面,为了避免重复操作,我们需要创建一个BaseActivity,然后让其他页面来继承这个Activity。
在这个BaseActivity中需要注意以下两点:
1、在 onResume()中启动service
2、在 onStop() 中关闭service
上面说到的启动service和关闭service用的分别是bindService()和unBindService()。至于为什么在onResume()和onStop()方法里面开启和关闭service,测试结果如下。
首先说明一下为什么不在onDestroy()中关闭service,最主要的原因就是app使用过程中当用户按了Home键返回桌面,或者用户按了电源键关闭了屏幕,这种情况下我们不可能继续计时,但是Activity在短时间内不会(或者根本不会)调用onDestroy(),所以我决定在onStop中关闭service。由于项目中的Activity都继承了BaseActivity,所以不管之间怎么跳转都不会使service解绑。如果有特殊原因不能继承BaseActivity,如用到fragment需要继承FragmentActivirty等等,可以把BaseActivity中的代码拷贝到相应的Activity。
以下是BaseActivity代码:
完毕~
最先想到的可能是用timer来计时,其实并非如此。我们可以使用线程,其中的Thread.sleep(1000);方法。为了不影响用户使用,我们还需要一个service,在后台来操作。
以下是Service代码:
public class TimerService extends Service { /** * 创建参数 */ boolean threadDisable; int count; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); /** 创建一个线程, 每秒计数器加1, 并在控制台进行Log输出 */ new Thread(new Runnable() { @Override public void run() { while (!threadDisable) { try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } count++; Log.e("驻留时间:", count + ""); // 判断时间,这里默认的是2min if (count == 2 * 60) { //用戶持续使用app已达2min } } } }).start(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("onStart()","service的onstart()执行了"); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { /** 服务停止时, 终止计数进程 */ this.threadDisable = true; Log.e("onUnbind()","service的onUnbind()执行了"); return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); Log.e("onDestroy()","service的onDestroy()执行了"); } }
一个项目中有很多页面,为了避免重复操作,我们需要创建一个BaseActivity,然后让其他页面来继承这个Activity。
在这个BaseActivity中需要注意以下两点:
1、在 onResume()中启动service
2、在 onStop() 中关闭service
上面说到的启动service和关闭service用的分别是bindService()和unBindService()。至于为什么在onResume()和onStop()方法里面开启和关闭service,测试结果如下。
首先说明一下为什么不在onDestroy()中关闭service,最主要的原因就是app使用过程中当用户按了Home键返回桌面,或者用户按了电源键关闭了屏幕,这种情况下我们不可能继续计时,但是Activity在短时间内不会(或者根本不会)调用onDestroy(),所以我决定在onStop中关闭service。由于项目中的Activity都继承了BaseActivity,所以不管之间怎么跳转都不会使service解绑。如果有特殊原因不能继承BaseActivity,如用到fragment需要继承FragmentActivirty等等,可以把BaseActivity中的代码拷贝到相应的Activity。
以下是BaseActivity代码:
public class AppLifeTimeActivity extends Activity { Intent intent; MyServiceConnection myServiceConnection; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_applifetime); intent = new Intent(AppLifeTimeActivity.this, TimerService.class); myServiceConnection = new MyServiceConnection(); } @Override protected void onResume() { super.onResume(); AppLifeTimeActivity.this.bindService(intent, myServiceConnection, Context.BIND_AUTO_CREATE); Log.e("onResume()", "注册监听,绑定服务"); } @Override protected void onPause() { super.onPause(); Log.e("onPause", "onPause执行了"); } @Override protected void onStop() { super.onStop(); Log.e("onStop", "onStop执行了"); // 解绑service AppLifeTimeActivity.this.unbindService(myServiceConnection); } class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { Log.e("info", "Service Connection Success"); } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub Log.e("info", "Service Connection Filed"); } } }
完毕~
相关文章推荐
- iOS 设置启动图片
- iOS 视频相关
- IOS Quartz2D简介
- Objective-C Runtime之着魔的UIAlertView
- 关于getContext()、getApplication()、getApplicationContext()、getActivity()的区别
- android录音时弹出权限选择框影响录音动画显示问题
- Spring MVC异常处理SimpleMappingExceptionResolver【转】
- atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
- iOS 自动布局库 SDAutoLayout
- 用gradle在编译得的时候修改app的名字
- MyBatis直接执行SQL的工具SqlMapper
- IOS 对象的归档与解档
- Swift笔记:数组
- iOS 局部变量 setTag后可在别的地方调用 viewWithTag
- Android自定义控件开发实战之实现ListView下拉刷新实例代码
- SimpleMappingExceptionResolver的使用
- ios配置xmpp即时聊天-服务器端
- cocos2d-html5 Schedule定时器
- 使用Android Studio应用打包+代码混淆
- 微信开发<三> 自定义菜单