Android四大组件之Service
Android中的Service和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
概述:
1,Service是Android的四大组件之一
2,Service本质上是后台运行的可执行程序,它没有Activity那样的用户界面
3,Service不能与用户进行交互,不能自己启动、运行在后台,类似于线程的程序。
4,Service 在很多场合中应用:
1)播放多媒体的时候用户启动了其他Activity,这个时候程序要在后台继续播放。
2)检测SD卡上文件的变化
3)在后台记录手机当前的地理信息位置的改变等等。
5,Service具有更高的进程优先级,在Android中进程有5个优先级别,Service位于第三个级别。
1). Foreground process 2).Visible process 3)Service process 4).Background process 5).Empty process6,Service具有全局唯一性。同一时间系统内只能存在Service的一个实例。
7,Service必须要在AndroidManifest.xml注册才能使用,这一点与Activity相同。
8,Android提供了大量的系统的Service,Service也可以自定义。
服务的开发比较简单,常规步骤如下:
1,继承android.app.Service类
public class SmsService extends Service{}
2,在AndroidManifest.xml文件中配置
<service android:name=".MyService"/>
3,启动服务:服务不能自己运行,需要Context.startService()或者Context.bindService()方法启动服务。
下面我将详细介绍Service的几种用法:
#############################################################
eg1,最简单的Service用法,startService()启动服务,
调用者和服务之间没有联系,即使调用者退出了,服务依然在进行
自定义MyService.java,继承Service类。
public class MyService extends Service {
private String tag = "MyService";
@Override
public IBinder onBind(Intent intent) {
Log.i(tag, "MyService onBind()....");// 这里我用的是startService(),故这里返回值我设置为null,因为这里的代码不会被调用
return null;
}
// 创建Service时执行,只会执行一次
public void onCreate() {
Log.i(tag, "MyService onCreate().....");
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(tag, "MyService onStart().....");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(tag, "MyService onStartCommand().....");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i(tag, "MyService onDestroy().....");
super.onDestroy();
}
@Override
public void onRebind(Intent intent) {
Log.i(tag, "MyService onRebind().....");
};
@Override
public boolean onUnbind(Intent intent) {
Log.i(tag, "MyService onUnbind()");
return super.onUnbind(intent);
}
}AndroidManifest.xml中注册广播:
<service android:name="com.example.service03.MyService" > </service>
MainAction.java 核心代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
start = (Button) findViewById(R.id.btn_start);
stop = (Button) findViewById(R.id.btn_stop);
// bindService(intent, mConn, BIND_AUTO_CREATE);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Log.i("MainActivity", "点击了Button_Start ..");
intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
Log.i("MainActivity", "点击了Button_Stop ..");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}结果:
当点击按钮START 时,依次调用onCreate()---> onStartCommand()---->onStart();
再次点击按钮START时,调用 onStartCommand()---->onStart();
点击按钮STOP时,调用onDestory();
再次点击按钮START时,调用 onCreate()---->onStartCommand()---->onStart();
分析得出结论:
采用Context.startService()方法启动服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。onCreate()方法只在第一次创建服务时执行,之后无论启动多少次服务都不会再执行。
补充:onStartCommand()和onStart()的区别。
1.onstartCommand其实就是onstart的代替,之前是用的onstart,新的api中用onstartCommand。onstartCommand中会回调onstart(),
2.onstartCommand有3个参数,onstart只有2个参数。
############################################################
Service的启动也可以这样设置(类似BroadcastReceiver中的隐式广播):
代码中:
//Constant.ACTION_MYSERVICE = "com.lydia.service.ACTION_MYSERVICE"; intent = new Intent(Constant.ACTION_MYSERVICE); startService(intent);
AndroidManifest.xml中
<service android:name=".MyService" >
<intent-filter >
<action android:name="com.lydia.service.ACTION_MYSERVICE"/>
</intent-filter>
</service>#############################################################
eg2,bindService(intent,conn,int)启动服务,
调用者和绑定者绑在一起,调用者一旦退出服务也就终止了。
bindService()的方式去绑定服务会调用public IBinder onBind(Intent intent){},会返回一个IBinder对象,我们需要Ibinder对象返回具体的Service对象才能操作,所以获取的必定是实现了Binder的对象,所以这是我们必须使用Binder的方式去获取Service的方式而不是直接使用。
具体代码步骤如下:
1,自定义MyService.java,继承Service类,并且Service中要创建IBinder对象。
public class MyService extends Service {
private String tag = "MyService";
MyBinder mBinder;
public class MyBinder extends Binder {
public void print(String text) {
MyService.this.print(text);
}
}
// 自定义方法
private void print(String text) {
Log.i(tag, text);
}
@Override
public IBinder onBind(Intent intent) {
Log.i(tag, "MyService onBind()");
return new MyBinder(); //因为是bindService()方式启动,这里需要返回一个Ibinder对象来操作}
@Override
public void onRebind(Intent intent) {
Log.i(tag, "MyService onRebind()");
super.onRebind(intent);
}
// 服务创建时调用
@Override
public void onCreate() {
Log.i(tag, "MyService onCreate()");
mBinder = new MyBinder();
super.onCreate();
}
// 服务
@Override
public void onStart(Intent intent, int startId) {
Log.i(tag, "MyService onStart()");
super.onStart(intent, startId);
}
//服务启动时调用,在onCreate()方法之后
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(tag, "MyService onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
//解除绑定
@Override
public boolean onUnbind(Intent intent) {
Log.i(tag, "MyService onUnbind()");
return super.onUnbind(intent);
}
} MainActivity.java
public class MainActivity extends Activity {
Button start, stop;
Intent intent;
MyBinder mBinder;
private ServiceConnection mConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
// 绑定成功时触发本方法
public void onServiceConnected(ComponentName name, IBinder service) {
// 获得MyService.onBind()方法返回的对象(service)
mBinder = (MyService.MyBinder) service;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
start = (Button) findViewById(R.id.btn_start);
stop = (Button) findViewById(R.id.btn_stop);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Log.i("MainActivity", "点击了Button_Start ..");
intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, mConn, BIND_AUTO_CREATE);
mBinder.print("------------绑定服务-----------");
} catch (Exception e) {
e.printStackTrace();
}
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("MainActivity", "点击了Button_Stop ..");
// stopService(intent);
unbindService(mConn);
mBinder.print("------------解除绑定-----------");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
} AndroidManifet.xml中配置和案例eg1中一样。