1. 生命周期:

startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart()。当用户在发出意图使之销毁时会经历onDestroy(),而bindService()方式启动,与Activity绑定的时候,会经历onCreate()和onBind(),而当Activity被销毁的时候,Service会先调用onUnbind()然后是onDestroy()。

2. 控制方式:

前者的控制方式需要使用固定的方法,对Service进行单一的操作。而后者由于与Activity绑定,不用考虑其生命周期问题,并且从发送Intent的被动操作,变为可以主动对Service对象进行操作,我们甚至可以建立一个Handler类,对Service进行相关的操作。大大加强了Service的灵活性、可操作性。

总结:对于简单的应用startService()启动方式能带来更少的代码,简单的操作。对于复杂的应用bindService()方式,虽然带来的更多的编码,但同时也带来了更好的可操作性,使其使用起来更像Activity。

********************************************************************************************************

Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy 我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService 
Service会经历 onCreate --> onStart

stopService的时候直接onDestroy,如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行,下次调用者再起来仍然可以stopService。

2 通过bindService 
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起,调用者退出了,Srevice就会调用onUnbind-->onDestroyed,所谓绑定在一起就共存亡了。

注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。


一、我们先一起来学习一下startService 吧:

  首先我们的service文件:

public class MyService extends Service{

    private static final String TAG = "MyService";
MediaPlayer player; @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
//服务启动前进行的配置
public void onCreate() {
Toast.makeText(this, "My Service created", Toast.LENGTH_LONG).show();
Log.i(TAG, "onCreate"); //播放设置
player = MediaPlayer.create(this, R.raw.music);//提供音乐的位置
player.setLooping(false); //是否循环播放音乐
} @Override
//关闭服务
public void onDestroy() {
Toast.makeText(this, "My Service Stoped", Toast.LENGTH_LONG).show();
Log.i(TAG, "onDestroy");
player.stop();
} @Override
//启动服务
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "My Service Start", Toast.LENGTH_LONG).show();
Log.i(TAG, "onStart");
player.start();
} }

  下面我们控制调用这个Service的主Activity:

public class Activityone extends Activity{

    private static final String TAG = "ServiceDemo";
private Button mybuttonone1;
private Button mybuttonone2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one); mybuttonone1 = (Button)findViewById(R.id.buttonone1);
mybuttonone2 = (Button)findViewById(R.id.buttonone2); //service通过startservice启动服务
//首先调用mybuttonone1的onclick方法,然后调用myservice的onclick()方法,再然后调用onstart()方法
mybuttonone1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Log.i(TAG, "onClick: starting service");
startService(new Intent(Activityone.this, MyService.class));
}
}); //service通过startservice关闭服务
//首先调用mybuttonone2的onclick方法,然后调用myservice的onstop()方法 mybuttonone2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Log.i(TAG, "onClick: stopping service");
stopService(new Intent(Activityone.this, MyService.class));
}
}); mybuttonone1.setOnClickListener(new myclicklistener());
mybuttonone2.setOnClickListener(new myclicklistener()); } class myclicklistener implements OnClickListener{
public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonone1:
Log.i(TAG, "onClick: starting service");
startService(new Intent(Activityone.this, MyService.class));
//startservice 执行的步骤: onclick()-->onstart()
break;
case R.id.buttonone2:
Log.i(TAG, "onClick: stopping service");
stopService(new Intent(Activityone.this, MyService.class));
//startservice 执行的步骤: onDestroy()
break;
}
}
} }

  这里我用了两种点击事件控制写法,大家学习时二选一即可,第一种方法属于Java中的匿名内部类,有兴趣的同学可以自行研究。

二、bindService 实现:

  同样我们的Service文件:

public class BindService extends Service {

    private MyBinder myBinder = new MyBinder();
private static final String TAG = "BindService";
private MediaPlayer play; @Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "BindService-->onBind()"); play=MediaPlayer.create(this, R.raw.music);
play.setLooping(false); return myBinder;
} public class MyBinder extends Binder{ public BindService getService(){
Log.i(TAG, "BindService-->getService()");
return BindService.this;
}
} public void MyMethod(){
Log.i(TAG, "BindService-->MyMethod()");
play.start();
} }

  我们主Activity的代码实现如下:

public class Activitytwo extends Activity{

    private Button mybutton1;
private Button mybutton2;
private boolean flag; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two); mybutton1=(Button)findViewById(R.id.buttontwo1);
mybutton2=(Button)findViewById(R.id.buttontwo2); mybutton1.setOnClickListener(new myclicklistener());
mybutton2.setOnClickListener(new myclicklistener()); } class myclicklistener implements OnClickListener{ @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.buttontwo1:
System.out.println("打开bind1");
bindService();
break; case R.id.buttontwo2:
System.out.println("关闭bind1");
unBind();
break; default:
break;
}
}
} private void bindService(){
System.out.println("打开bind2");
Intent intent = new Intent(Activitytwo.this,BindService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
} private void unBind(){
System.out.println("关闭bind2");
if(flag == true){
unbindService(conn);
flag = false;
}
} private ServiceConnection conn = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("关闭bind3");
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("打开bind3");
MyBinder binder = (MyBinder)service;
BindService bindService = binder.getService();
bindService.MyMethod();
flag = true;
}
}; }

  好了关于startService 与bindService 的介绍就为大家分享完毕,感兴趣的同学可以试试实现一些,简单运行一下,通过查看log日志可以很清楚的理解这两个的区别与联系。新手学习,高手交流。

Android之startService()和bindService()区别的更多相关文章

  1. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?         service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...

  2. 理解Android的startservice和bindservice(转)

    一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比较高,它比处于前 ...

  3. startService()和bindService()区别

    1. 生命周期:startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart().当用户在发出意图使之销毁时会经历onDestroy(),而 ...

  4. 【Android 界面效果34】Android里Service的bindService()和startService()混合使用深入分析

    .先讲讲怎么使用bindService()绑定服务 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回 ...

  5. [AndroidTips]startService与bindService的区别

    Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的. ...

  6. startService与bindService的区别

    转自:http://www.devdiv.com/thread-52226-1-1.html Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDes ...

  7. Android实现简单音乐播放器(startService和bindService后台运行程序)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...

  8. [转]安卓开发startservice 和bindservice详解

    原文 作者:aikongmeng 来源:安卓中文网 博主暗表:搜到此文,终于为我解惑,bindService并不会真正启动service,不会调用onStartCommand!还需要再bind之前st ...

  9. 【转】深入理解Android的startservice和bindservice--不错

    原文网址:http://www.cnblogs.com/yejiurui/p/3429451.html 一.首先,让我们确认下什么是service?         service就是android系 ...

随机推荐

  1. [BZOJ1131][POI2008] Sta 树的深度

    Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...

  2. hexo建个人博客

    已经在腾讯云获得了域名和服务器,想着既然已经这样了,就折腾折腾自己的个人博客主页吧. 考虑再三决定用github pages来实现我的博客.github Pages可以被认为是用户编写的.托管在git ...

  3. 串口计时工具Grabserial简介及修改(添加输入功能)

    Grabserial是Tim Bird用python写的一个抓取串口的工具,这个工具能够为收到的每一行信息添加上时间戳. 如果想对启动时间进行优化的话,使用这个工具就可以简单地从串口输出分析出耗时. ...

  4. 拯救无法启动的虚拟机文件.vmdk中的数据

    FROM: http://blog.csdn.net/npy_lp/article/details/7686583 从事Linux开发的软件工程师几乎都使用过虚拟机软件,如VMware worksta ...

  5. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  6. Hadoop 和 HDInsight:Windows Azure 中的大数据

    世界的大数据包含一个庞大而充满活力的生态系统,但一个开放源码项目上面有这一切,那就是 Hadoop 的王朝. Hadoop 是事实上的标准的分布式的数据运算.Hadoop 提供了一个 MapReduc ...

  7. 动态Web API层

    返回总目录 本篇目录 构建动态Web API控制器 ForAll 方法 重写ForAll 方法 Http动词 动态Javascript代理 Ajax参数 单一服务脚本 Angular支持 Durand ...

  8. 玩转JavaScript OOP[4]——实现继承的12种套路

    概述 在之前的文章中,我们借助构造函数实现了"类",然后结合原型对象实现了"继承",并了解了JavaScript中原型链的概念. 理解这些内容,有助于我们更深入 ...

  9. Lesson 9 A cold welcome

    Text On Wednesday evening, we went to the Town Hall. It was the last day of the year and a large cro ...

  10. Prim 最小生成树算法

    Prim 算法是一种解决最小生成树问题(Minimum Spanning Tree)的算法.和 Kruskal 算法类似,Prim 算法的设计也是基于贪心算法(Greedy algorithm). P ...