原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50866875 李济洲的博客

Service是Android四大组件之一,Service主要作用于后台,可以进行一些后台的操作,它没有用户界面,它跟Activity比较相似,某种意义上可以理解为“Service是没有用户界面的Activity“,那么我们什么时候需要使用Service呢?例如:音乐App正在播放音乐我们想切换到阅读App又不想让音乐停止就会用到Service,音乐App正在下载音乐我们切换到桌面又不想让下载停止就会使用到Service。

编写Activity需要两步:1:编写Activity的子类 2:在AndroidManifest.xml中配置此Activity,同样编写Service也需要两步:

1:定义一个继承自Service的子类
2:在AndroidManifest.xml中配置此Service

startService

我们先编写一个简单的StartService示例程序来演示如何实现Android后台操作
先定义一个Service的子类,然后复写一些生命周期函数

/** * Blog:http://blog.csdn.net/leejizhou * 李济洲的博客 */public class MyService extends Service {    //Service中唯一的抽象方法,必须在子类中实现,用来和Activity通信,先返回NULL    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    //复写Service的一些生命周期函数    //onCreate会在Service第一次创建的时候调用    @Override    public void onCreate() {        super.onCreate();        Log.d("MyService","----onCreate executed----");    }    //onStartCommand会在Service每次启动的时候调用    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.d("MyService","----onStartCommand----");        return super.onStartCommand(intent, flags, startId);    }    //onDestroy会在Service销毁时候调用    @Override    public void onDestroy() {        super.onDestroy();        Log.d("MyService", "----onDestroy----");    }}

下面是Service的生命周期,为什么有两种呢?因为启动Servcie有两种方式第一个是startService()主要用于启动一个Service执行后台任务不进行通信,另一个是bindService()是启动一个跟组件绑定的Service可以进行通信,先介绍的是startService()。

然后在AndroidManifest.xml中进行配置此Service,千万不要忘记。

  <service android:name=".MyService"></service>

定义好Service后,接下来就是启动和停止这个服务了,启动和停止主要靠Intent来实现,这里我定义了两个Button用来启动和停止,部分代码略(文章结尾会提供源码),主要看下启动和停止Service的实现代码。

 //开启Service        findViewById(R.id.StartService).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent(MainActivity.this,MyService.class);                startService(intent);            }        }); //停止Service        findViewById(R.id.StopService).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent=new Intent(MainActivity.this,MyService.class);                stopService(intent);            }        });

点击开启Service可以看到OnCreate和OnStartCommand被执行了,一个简单的后台Service就被启动了

然后点击停止,可以看到OnDestroy被执行了

这里可能你会问了,启动Service,OnCreate和OnStartCommand都被执行了,他俩有什么区别呢?onCreate会在Service第一次创建的时候调用,如果一个Service没有Stop再次启动这个Service的话是不会再调用onCreate方法了,但是每次OnStartCommand都会被调用,所以后台需要执行的代码逻辑我们一般需要放到OnStartCommand方法里面。

Ok 在Activity里面启动一个简单的Service后台服务就完成了,但是你要知道的是通过startService()启动这个服务后就和Activity就没有关系了,即使你这个Activity被销毁这个Service依然会在后台运行,切记通过startService()启动服务任务结束后在Activity中调用 stopService()结束掉这个Service,或者在Servcie子类中调用stopSelf()来结束自己。

上面介绍了startService启动服务,它可以非常简单的启动后台Service进行一些逻辑操作,但是无法进行控制和通信,下面介绍下BindService可以解决这个问题。

bindService

下面实现一个后台Service进行数值的递增运算,Activity可以实时查看Service此时的数值的小示例来了解bindService的使用。

定义Service,这里我们要实现onBind的方法,在这里onStartCommand无需复写,因为通过bindService启动服务是不回调此方法的,Service的onCreate里面进行的了一个循环的数值运算。

/** * Blog:http://blog.csdn.net/leejizhou * 李济洲的博客 */public class MyService extends Service {    //当前数值    private int num=0;    //是否停止循环    private boolean isgo=true;    //BindService 需要实现onBind方法 自定义一个Binder对象返回    private MyBinder binder=new MyBinder();    @Nullable    @Override    public IBinder onBind(Intent intent) {        return binder;    }    public class MyBinder extends Binder{         //建立一个方法用于返回当前数值         public int getNum(){             return num;         }     }    //Service创建时候回调此方法 这里定义一个循环 不断更改num的值    @Override    public void onCreate() {        super.onCreate();        //进行循环操作,每秒数值加1       new Thread(new Runnable() {           @Override           public void run() {               while(isgo){                   try {                       Thread.sleep(1000);                   } catch (InterruptedException e) {                       e.printStackTrace();                   }                   num++;                   Log.i("MyService",num+"");               }           }       }).start();    }    //这里不需要复写此方法,因为bindService启动服务不会调用此方法// @Override// public int onStartCommand(Intent intent, int flags, int startId) {// return super.onStartCommand(intent, flags, startId);// }    //Service断开时回调此方法    @Override    public boolean onUnbind(Intent intent) {        Log.i("MyService","----onUnbind----");        return super.onUnbind(intent);    }    //Service销毁是回调此方法    @Override    public void onDestroy() {        super.onDestroy();        isgo=false;        Log.i("MyService","----onDestroy----");    }}

然后再AndroidManifest.xml中配置服务,一定一定一定不要忘记。

 <service android:name=".MyService"></service>

之后在Activity里面通过bindService启动服务,Activity里面三个按钮用来启动 停止 和获取数值

/** * Blog:http://blog.csdn.net/leejizhou * 李济洲的博客 */public class MainActivity extends AppCompatActivity {    //获取Service中的Binder对象    MyService.MyBinder binder;    //定义一个ServiceConnection对象    private ServiceConnection connection=new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //Activity与Service连接成功时候回调此方法            binder=(MyService.MyBinder)service;        }        @Override        public void onServiceDisconnected(ComponentName name) {            //Activity与Service断开连接时回调此方法,Activity主动调用unBindService将不掉用此方法,仅仅在异常终止时刻调用            Log.i("MyService","----onServiceDisconnected-----");        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //启动Service        findViewById(R.id.bindService).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent bindIntent=new Intent(MainActivity.this, MyService.class);                //这里第一个参数传入intent 第二个参数传入ServiceConnection对象                //第三个参数指Activity和Service绑定时是否创建服务,这里直接传BIND_AUTO_CREATE就好了,之后Service的onCreate会得到执行                bindService(bindIntent,connection, Service.BIND_AUTO_CREATE);            }        });        //停止Service        findViewById(R.id.UnBindService).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //解除绑定Service               unbindService(connection);            }        });        //获取Service中此刻的数值        findViewById(R.id.getnum).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this,"Service的数值"+binder.getNum()+"",3000).show();            }        });    }}

bindService运行生命周期

注意到Activity中ServiceConnection对象中的OnServiceConnected方法中有一个IBinder对象,该对象即可实现Activity与Service之间的通信,使用bindService方式启动Service的时候,Service子类必须实现onBind方法,onBind方法返回的IBinder对象将会传递到onServiceConnected(ComponentName name, IBinder service)当中来实现通信交互。

这样Activity和Service通信的小示例就完成了,值得注意的是通过onBind方法启动Service,Service和Activity是绑定状态的,那么如果Activity被销毁Service也会跟着一起销毁这点要注意,要区分startService和bindService的区别。

那么你可能会问如果我想让Service可以和Activity通信同时又可以不随Activity销毁该如何做呢?只需要 startService和bindService一起调用就可以了,如果同时调用了start和bind,那么调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

在使用Service中有一个误区会有人以为在Service中的onCreate中可以进行耗时操作,这是不对的,Service依然是运行在主线程中的,如果直接进行耗时操作非常容易造成ANR,所以即使在Service中耗时操作依然要放到子线程当中。

最后总结下什么情况下使用startService或bindService呢,如果你只想启动一个后台服务去执行一个某项长期任务的话使用startService就可以了,如果你想要与正在运行的后台Service取得联系的话可以使用bindService,如果想要Service长期运行不随Activity销毁并且可以进行通信那么就调用了startService后再调用bindService,Service的总结先告一段落,有什么问题可以在下方留言,感谢。

本篇源码下载地址 http://download.csdn.net/detail/leejizhou/9459862

更多相关文章

  1. Android(安卓)基础知识
  2. android中如何实现连续点击返回键退出整个应用 android两次返回
  3. Android(安卓)ProgressDialog工具类
  4. EventBus第一章:初识,相见,了解,使用
  5. android 情景模式之响铃+震动获取方法
  6. Android——View.inflate()的详细介绍
  7. Android(安卓)软键盘弹出时,EditText固定在键盘上方
  8. Android命令行启动app应用
  9. Android(安卓)WebView 软键盘遮挡输入框问题的解决方法

随机推荐

  1. android中TextView和EditText控件一些属
  2. Android显示图片自适应(控件+网页)
  3. Delphi xe7 up1 调用android振动功能
  4. Android 开源组件和第三方库汇总
  5. Android studio 出现 Unsupported major.
  6. Android 弹出键盘向上顶布局
  7. android 如何判断去电或来电已经接通
  8. Android Binder的使用和设计[android nat
  9. AndroidStudio试用
  10. Android opencore 2.02 howto