了解了安卓多线程编程的技术之后,作为安卓的四大组件之一,是十分重要的。
定义一个服务
首先看一下如何在项目中定义一个服务,
public class MyService extends Service { @Override public void onCreate() { super.onCreate(); Log.d("myservice","oncreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("myservice","command"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("myservice","destroy"); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
这里我们又重写了onCreate(),onStartCommand()和onDestroy()这个三个方法,他们是每个服务中最常用的三个方法,其中onCreate()方法会在服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候调用,通常我们服务销毁时,我们又应该在onDestroy方法中去回收那些不再使用的资源。
每一个服务必须要再陪你文件中注册之后才能使用
<service android:name=".MyService" />
这样一个服务就完成了。
启动和停止服务:
定义好了服务之后,接下来就是如何去启动以及停止这个服务了,启动和停止的方法主要是借助Intent来实现的,
public class MainActivity extends Activity implements View.OnClickListener { private Button startService; private Button stopService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService=(Button)findViewById(R.id.start_service); stopService=(Button)findViewById(R.id.stop_service); startService.setOnClickListener(this); stopService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.start_service: Intent startIntent=new Intent(this,MyService.class); startService(startIntent); break; case R.id.stop_service: Intent stopIntent=new Intent(this,MyService.class); stopService(stopIntent); break; default: break; } }
运行效果
onCreate()和onStartCommand()到底有什么区别呢?
其实onCreate()方法是再服务第一次创建的时候调用的,而onStartCommand()方法是再每次启动服务的时候调用的。
活动和服务进行通信
为了实现这个功能我们创建一乐意专门的Binder对象来下载功能进行管理,修改MyService中的代码,
private DownloadBinder binder=new DownloadBinder(); class DownloadBinder extends Binder{ public void startDownload(){ Log.d("MyService","startDownload executed"); } public int getProgress(){ Log.d("Myservice","getProgress execute"); return 0; } }
private Button startService; private Button stopService; private Button bindService; private Button unbindService; private MyService.DownloadBinder downloadBinder; private ServiceConnection connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder=(MyService.DownloadBinder)service; downloadBinder.startDownload(); downloadBinder.getProgress(); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService=(Button)findViewById(R.id.start_service); stopService=(Button)findViewById(R.id.stop_service); startService.setOnClickListener(this); stopService.setOnClickListener(this); bindService=(Button)findViewById(R.id.bind_service); unbindService=(Button)findViewById(R.id.unbinder_Service); bindService.setOnClickListener(this); unbindService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.start_service: Intent startIntent=new Intent(this,MyService.class); startService(startIntent); break; case R.id.stop_service: Intent stopIntent=new Intent(this,MyService.class); stopService(stopIntent); break; case R.id.bind_service: Intent bindIntent=new Intent(this,MyService.class); bindService(bindIntent,connection,BIND_AUTO_CREATE); break; case R.id.unbinder_Service: unbindService(connection); break; default: break; } }
可以看大我们首先创建了一个serviceConnection的匿名类,在里面重写了onServiceConnectd()方法和onServiceDisconnected()方法,这两个方法会砸活动与服务成功绑定以及接触绑定的时候调用。
服务的最佳实践--后台执行的定时任务:
安卓中的定时任务一般有两种实现方式,一种使用java api里提供的timer类,一种是使用安卓的alarm机制,这两种方式在多数情况下都能实现的类似的效果,但是Timer有一个明显的短板,它并不太合适英语那些需要长时间在后台运行的定时任务。