Service 介绍
1.Service 是android 中四大组件与Activity最相似的地方,都代表的是可执行的程序;
2.Service 特点:
a)在后台运行,一般处理比较耗时的任务;
b)没有实际的界面;
c)可以和其他组件进行交互;
d)例如:处理音乐、下载文件等;
3.Service 的声明周期:
a)三个阶段:创建 – 开始 --- 销毁
b)OnCreate(); Service 声明周期的开始,完成Service的初始化工作;
c)OnStartCommand(); 服务声明周期开始,没有对应的停止函数
d)OnDestory(); 声明周期的结束,释放Service所占用的资源;
4.提示:一个服务只会创建一次,销毁一次,但是可以启动多次;
5.Service的启动方式:
a)Conetext.startService();
b)Contenxt.bindService();
6.图解生命周期:
7.启动服务:
a)如果Service和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,显式更加容易使用,代码简洁;
b)若服务和调用的服务的组件在不同的应用程序中,则只能使用隐式启动;
8.停止服务:
a)StopService(intent); 调用onDestory() 一次;
9.绑定本地服务以及与服务之间的通讯:
a)bindService(),方法实现绑定,unbindService() 解除绑定
b)bindService(Intent service,ServiceConnection conn,int flags); 参数说明
i.service通过Intent指定要启动的Service;
ii.conn 该对象用于监听访问者与Service之间的链接情况,当访问者与Service之间成功链接时将回调onServiceconnected();断开链接时调用onServiceDisconnected() 方法
iii.flags:指定绑定时是否自动创建Service, 0 表示不自动创建,BIND_AUTO_CREATEZ自动创建;
c)提示:ServiceConnection 对象的onServiceconnected() 中有一个IBinder对象,使用该对象来实现与Service之间的通讯;
下面是案例代码:
mainfest 配置文件如下:
主程序入口:
package com.sun.service; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { // 声明组件对象 private Button start, stop, bind, unbind, result; // 提示:成员变量都是有默认值的 private ServiceTwo serviceTwo; //对象声明 //绑定服务 链接 private ServiceConnection serviceConnection = new ServiceConnection() { // 绑定服务 public void onServiceConnected(ComponentName name, IBinder service) { // 用于获取服务返回的数据信息 -- 此处获取ServiceTwo的对象 serviceTwo = ((ServiceTwo.MyBinder)service).getService(); Log.i("msg","获取到了serviceTwo对象"); } // 解绑服务 public void onServiceDisconnected(ComponentName name) { } }; /** * 初始化信息 */ public void init() { start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); bind = (Button) findViewById(R.id.bind); unbind = (Button) findViewById(R.id.unbind); result = (Button) findViewById(R.id.result); } // 程序入口 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.init(); // 初始化数据 // 设置事件坚听 start.setOnClickListener(listener); stop.setOnClickListener(listener); bind.setOnClickListener(listener); unbind.setOnClickListener(listener); result.setOnClickListener(listener); } // 按钮事件动作 private OnClickListener listener = new OnClickListener() { public void onClick(View v) { int id = v.getId(); if (id == R.id.start) {// 启动服务 startAction(); return; } if (id == R.id.stop) { // 停止服务 StopAction(); return; } if (id == R.id.bind) { // 绑定服务 bindAction(); return; } if (id == R.id.unbind) { // 解绑服务 unbindAction(); return; } if (id == R.id.result) { // 获取数据 return; } } }; /** * StartService 开始服务 */ public void startAction(){ Intent intent = new Intent(MainActivity.this,ServiceOne.class); startService(intent); // 停止服务 } /** * StopService 停止服务 */ public void StopAction(){ Intent intent = new Intent(MainActivity.this,ServiceOne.class); stopService(intent); } /** * bindService 绑定服务 */ public void bindAction(){ Intent intent = new Intent(); intent.setAction("sun.bind.service"); bindService(intent, serviceConnection,BIND_AUTO_CREATE); } /** * unbindService 解绑服务 */ public void unbindAction(){ unbindService(serviceConnection); //解绑服务 } /** * 从服务中获取数据 */ public void getResultAction(){ } }
[b]服务: 方式一[/b]
package com.sun.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; /** * 启动服务方式一 测试 * * @author Administrator * */ public class ServiceOne extends Service { /** * 创建服务 */ public void onCreate() { super.onCreate(); Log.i("msg", "onCreate()..."); Toast.makeText(ServiceOne.this, "onCreate()...", Toast.LENGTH_LONG).show(); } /** * 启动服务 */ public int onStartCommand(Intent intent, int flags, int startId) { Log.i("msg", "onStartCommand()..."); Toast.makeText(ServiceOne.this, "onStartCommand()...", Toast.LENGTH_LONG).show(); return super.onStartCommand(intent, flags, startId); } /** * 销毁服务 * 此处做资源 */ public void onDestroy() { Log.i("msg", "onDestroy()..."); Toast.makeText(ServiceOne.this, "onDestroy()...", Toast.LENGTH_LONG).show(); super.onDestroy(); } /** * 启动服务 */ public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.i("msg", "onStart()..."); Toast.makeText(ServiceOne.this, "onStart()...", Toast.LENGTH_LONG).show(); } /** * 给客户端返回一个借口实例 */ public IBinder onBind(Intent intent) { return null; } }
服务方式二:绑定服务
package com.sun.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; /** * 服务测试 -- 绑定服务测试 * 注意:此声明周期,所有的方法只能调用一次 * @author Administrator * */ public class ServiceTwo extends Service { //自定义Binder public class MyBinder extends Binder{ public ServiceTwo getService(){ Log.i("msg","getService()..."); return ServiceTwo.this; // 返回服务 } } private MyBinder myBinder = new MyBinder(); //获取对象 /** * 创建服务,首次启动时执行 */ public void onCreate() { super.onCreate(); Log.i("msg","onBind()中的oncreate()..."); } /** * 绑定服务,同时给客户端返回一个借口实例 * 只可绑定一次,不可多次绑定 */ public IBinder onBind(Intent intent) { Log.i("msg","onBind()..."); return myBinder; // 返回一个对象,继承了Binder的对象 } /** * 解绑服务 */ public boolean onUnbind(Intent intent) { Log.i("msg","onUnbind()..."); return super.onUnbind(intent); } /** * 销毁服务 */ public void onDestroy() { Log.i("msg","onBind()中的onDestroy()..."); super.onDestroy(); } }