四大组件——service
服务:service是安卓中实现程序后台运行的解决方案,它非常适合执行那些不需要和用户交互而且还要求长期运行的任务。需要注意:服务不是独立运行在进程中的,依赖于服务创建的应用程序进程,当其被杀死时,服务也会被终结。
定义一个服务:
public class Myservice extends Service{
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy(){
super.onDestroy();
}
}
建立完类后,每个服务还需要在AndroidMainifest.xml文件注册才能生效:
Intent startIntent=new Intent(this,Myservice.class);
startService(startIntent);//启动服务
Intent stopIntent=new Intent(this,Myservice.class);
stopService(stopIntent);//停止服务
上面Myservice类里有个onBind()方法我们还没有解释,其实它的作用就是用于活动和服务的通信。
具体方法:
public class Myservice extends Service{
private DownloadBinder mBinder=new DownloadBinder();
class DownloadBinder extends Binder{
public void startDownload(){
Log.d("Myservice","start");
}
public int getProgress(){
Log.d("Myservice","getProgress");
return 0;
}
}
@Override
public IBinder onBind(Intent intent){
return mBinder;
}
}
创建一个mBinder实体写入方法,然后在MainActivity里开启连接:
private ServiceConnection connection=new ServiceConnection(){
@Override
public void onServiceDisconnected(ComponentName name){
}
@Override
public void onServiceConnected(ComponentName name,IBinder service){
downloadBinder=(Myservice.DownloadBinder)service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
}
然后使用两个Button一个绑定服务,一个解绑服务:
case R.id.bind_service:
Intent bindIntent=new Intent(this,Myservice.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE);//绑定服务
break;
case R.id.unbind_service:
unbindService(connection);//解绑服务
break;
这样就基本实现了服务的绑定和解绑。
服务的更多技巧
由于郭霖大神的建议,为了更好的程序性能和优化用户体验我们应当:节制地使用Service
如果应用程序当中需要使用Service来执行后台任务的话,请一定要注意只有当任务正在执行的时候才应该让Service运行起来。另外,当任务执行完之后去停止Service的时候,要小心Service停止失败导致内存泄漏的情况。
当我们启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留,这样就会导致这个进程变得非常消耗内存。并且,系统可以在LRU cache当中缓存的进程数量也会减少,导致切换应用程序的时候耗费更多性能。严重的话,甚至有可能会导致崩溃,因为系统在内存非常吃紧的时候可能已无法维护所有正在运行的Service所依赖的进程了。为了能够控制Service的生命周期,Android官方推荐的最佳解决方案就是使用IntentService,这种Service的最大特点就是当后台任务执行结束后会自动停止,从而极大程度上避免了Service内存泄漏的可能性。
详情请见:http://blog.csdn.net/guolin_blog/article/details/42238627
使用IntentService例子 :
public class MyIntentService extends IntentService{
public MyIntentService(){
super("MyIntentService");//调用父类的有参构造函数
}
@Override
protected void onHandleIntent(Intent intent){
Log.d("MyIntentService","Thread id is "+Thread.currentThread().getId());
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("MyIntentService","onDestroy excuted");
}
}
其他步骤和一般Service差不多,不再做赘述。
IntentService的优势:它能够启动线程和停止,任务后台结束后会自动停止,大大方便了使用。
----------------------------------------------------------------------------------------------------------------------------------------------------------