码迷,mamicode.com
首页 > 移动开发 > 详细

Android Service服务——初识

时间:2016-05-08 16:30:19      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

  很抱歉(对我,也是对大家)过了两个星期说好的要发的博客迟迟没有动静,因为最近在与高等数学死磕,同时参加了一个党内的培训,所以现在的学习生活有些紧张,自己的的草稿都堆积了好几篇了,现在我就对于我应朋友之情需要完成一个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文件中进行注册就可以了。

可以发现这样我们就已经启动了服务,但是这样启动的服务我们并不能进行控制什么时候进行输入和输出,这样我们就要考虑将activityservice联系起来,同时加入一些控制。(在下面的程序中我在布局文件中加入了两个按钮),同时通过打印显示服务的状态信息。同时我们需要将服务与活动在程序运行时进行绑定,还有运行后解除绑定。这时我们需要在上面程序的基础上更加明细一些方法的作用,通过这些方法去完成。

同样我们先写一个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;

}

}

}

 

 

同样作为和活动有同样地位的服务也有自己的生命周期,这里就不一一阐述了。

   日进一小步,月过一大步~~加油!!

Android Service服务——初识

标签:

原文地址:http://www.cnblogs.com/ly199553/p/5470732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!