标签:
很抱歉(对我,也是对大家)过了两个星期说好的要发的博客迟迟没有动静,因为最近在与高等数学死磕,同时参加了一个党内的培训,所以现在的学习生活有些紧张,自己的的草稿都堆积了好几篇了,现在我就对于我应朋友之情需要完成一个android的播放器,对于其中的一些简单的要点,写一些自己的感悟。
首先我要提到的时Android Service服务,其实我接触到Service这个概念的时间并不长,首先在做这个不能算作工程的东西时,我就想到了,android需要有这样的一个机制,通过一个程序去控制歌曲的播放,同时还有歌词的显示,同时还有歌曲的音量的控制等等,这些都需要在同样的一个界面去完成的,也就是,我需要一个“服务”去默默地帮我控制这些程序的控制和显示,但是却不能影响到我的布局。这样一看确实有点像java的多线程的思想,确实这就是基于android的多线程来实现的。
1.我们要明确“服务”是什么?
我们可以把它简单的想成后台默默的劳动者。当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。
这有一个前提你需要对于线程有一个简单的认识。这里我简单的我把线程的在android使用的方法列举出来:
定义一个线程只需要新建一个类继承自 Thread,然后重写父类的 run()方法,并在里面
编写耗时逻辑即可。比如:
class MyThread extends Thread { @Override public void run() { // 处理具体的逻辑 } }
创建的线程我们需要在需要的时候将其启动,所以在上面的程序后加上:
new MyThread().start();
但通常在android程序中采用匿名内部类来使用,所以将上面的程序改为:
new Thread(new Runnable() { @Override public void run() { // 处理具体的逻辑 } }).start();
2.“服务”的基本用法
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } }
在这里我们声明一个MyService类继承Service ,可以看到有唯一的一个抽象方法 onBind()需要重写。但是通常我们在使用服务的工程中需要重写 onCreate()、onStartCommand()和 onDestroy()这几个方法。如下是针对上面的方法声明:
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } }
剩下的只需要在 AndroidManifest.xml文件中进行注册就可以了。
可以发现这样我们就已经启动了服务,但是这样启动的服务我们并不能进行控制什么时候进行输入和输出,这样我们就要考虑将activity和service联系起来,同时加入一些控制。(在下面的程序中我在布局文件中加入了两个按钮),同时通过打印显示服务的状态信息。同时我们需要将服务与活动在程序运行时进行绑定,还有运行后解除绑定。这时我们需要在上面程序的基础上更加明细一些方法的作用,通过这些方法去完成。
同样我们先写一个MyService服务去继承Service,然后去重写相应的方法,不过这次需要写一个 Binder类对象,通过Binder才能完成activity和service的绑定。
public class MyService extends Service { private DownloadBinder mBinder = new DownloadBinder(); class DownloadBinder extends Binder { public void startDownload() { Log.d("MyService", "startDownload executed"); } public int getProgress() { Log.d("MyService", "getProgress executed"); return 0; } } @Override public IBinder onBind(Intent intent) { return mBinder; } } 下面就在绑定活动和服务的基础上调用binder的方法了。 public class MainActivity extends Activity implements OnClickListener { private Button startService; private Button stopService; private Button bindService; private Button unbindService; private MyService.DownloadBinder downloadBinder; 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(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService = (Button) findViewById(R.id.bind_service); unbindService = (Button) findViewById(R.id.unbind_service); bindService.setOnClickListener(this); unbindService.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { 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; default: break; } } }
同样作为和活动有同样地位的服务也有自己的生命周期,这里就不一一阐述了。
日进一小步,月过一大步~~加油!!
标签:
原文地址:http://www.cnblogs.com/ly199553/p/5470732.html