您的位置:首页 > 移动开发

如何实现监听用户驻留APP的时长(service的简单用法)

2016-04-14 11:48 661 查看
    本文面向新手开发者。很多时候我们需要知道用户驻留在app内多长时间了。比如说我们要实现一个功能,当用户连续使用app20分钟以上时,增加其会员积分。
    最先想到的可能是用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");
}
}

}


    完毕~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: