service服务一般主要是作为后台服务使用的,前台服务一般结合通知一起。
service一般主要用作长期后台服务的,而且和Activity结合性不那么紧密,
一般如果需要频繁的更新UI主要是用Activity里面直接开Thread,然后用handler
传到UI线程中去更新UI。
不过我在用Activity这种方式去跑大量的压力测试的时候,发现经常Activty
会崩溃掉。开始是以为6.0的原因,不过另一个小伙伴的用service跑的就没有
出现我这种情况。于是我花了一两天也更换成用service去跑,不知道结果怎么样。
先大概记录下。
作为四大组件之一,需要在manifest里面配置一下,才可以启动。
service有几个主要回调方法,
onCreate:service第一次启动时会调用的方法,后面再startService时则不会调用,
因为service已经启动了。
onStartCommand(onStart已经被google宣称为过时的方法):在OnCreate方法之后会
调用的方法,当多次startService时会多次调用该方法。带有intent参数,这个
方法可以从其它地方传递数据过来。
onBind: 这个主要是方便其它组件和service进行即时调用而需要的一个方法,IBinder
比较容易让人想起Binder也就是进程间调用IPC,这里需要返回一个IBinder类型的
对象。我们可以在类的其它地方extends一个Binder类,在这个类中不需要重写任何方
法,只需要写一个我们需要在service进行调用的一个方法就好了。
onUnbind:接触绑定时需要作的一些工作可以在这个方法里面写入。
service怎么和Activity之间进行数据的传递呢,广播。
首先在Activity里面注册广播,广播可以注册很多个,
主要是用action来区分的,如registerReceiver(receiver,new IntentFilter(CURRENT_ENCRYPT_SPEED))
,可以对一个写在Activity里面写一个内部类广播接收器,其中注册多个action,
而在service里面如下:
Intent intent = new Intent(intentMsg);
intent.putExtra(name,data);
sendBroadcast(intent);
这样就可以把数据发送到Activity里面进行更新数据了。我这里用注册了14个广播,
从以前经理说过的或者网上说的,广播用多了不好。我这里出现了一个内存泄漏的问题
,A resource was acquired at attached stack trace but never released. memory leak
*之后说是要用MAT分析,出现的比较少,还没有去分析。
在Activity里面要service停止,可以直接执行stopService方法,不过一般
我都是在onStartCommand方法里面开一个标志位true进行死循环。
我需要从Activity里面传递一个参数到service里面让标志位变为false就可以结束掉
执行的任务。
Intent service = new Intent(WorkActivity.this, WorkService.class);
conn = new MyServiceConnection();
bindService(service, conn, Context.BIND_AUTO_CREATE);
关于conn的实现如下,
public class MyServiceConnection implements ServiceConnection
{
//当绑定服务成功的时候会调用此方法
public void onServiceConnected(ComponentName name, IBinder service)
{
AppLogger.w("service Connected");
myBinder = (WorkService.MyBinder) service;
myBinder.setPressureing(false);
stopTest.setText("测试停止");
PRESSUREING = false;
}
public void onServiceDisconnected(ComponentName name)
{
}
}
当service正在执行的时候,执行bindService方法的时候是不会再次执行
onStartCommand方法,只会执行bind里面的方法,这样就会避免再次执行任务
的问题。
首先执行onServiceConnected里面的方法,再执行bind里面绑定的方法。
这样就完成了数据的传递。
记得解绑广播和解绑服务,不然又是红红的报错。
@Override
protected void onDestroy() {
PRESSUREING = false;
unregisterReceiver(receiver);
if (conn != null) {
unbindService(conn);
}
super.onDestroy();
}
service
enabled=true|false 一般默认地设置为true,表示该service可以被
system实例化。
exported=true|false,默认设置为false,表示该service不能
被其它应用程序使用,只能本应用程序内使用。