欢迎转载,转载请标明出处,谢谢^_^
Service是Android四大组件之一(其它三个:Activity,Content Provider内容提供者,BroadcastReceiver广播接收器)。接下来仔细介绍下Service的理论及使用。
1、Service的种类:
- a:本地服务(Local) :该服务依附在主进程上
- b:远程服务(Remote):该服务是独立的进程
也分前台服务(会在通知一栏显示 ONGOING 的 Notification)和后台服务(默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification)
2、Service的生命周期
- 当采用startService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onStartCommand()–>onDestory()。
- 当采用bindService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onBind()–>onUnBind()–>onDestory()。
3、Service的启动
1:想要用启动服务,首先得在 Androidmanifest.xml 中注册 service。即在<application></application>
节点中添加(由于要填写用户自定义的Service所在位置,可在创建完Service后再配置,提前写出来只是提醒,免得忘记):
<service android:name=".service.MyService"/>
Service其它基本项的配置:
android:name ————- 服务类名
android:label ————– 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
android:icon ————– 服务的图标
android:permission ——- 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
android:process ———- 表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
android:enabled ———- 如果此项设置为 true,那么 Service
将会默认被系统启动,不设置默认此项为 falseandroid:exported ——— 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false
2:创建Service:
启动Service有两种方式:startService()
和 bindService()
,两种方法都有对应自己的停止服务的方法:stopService()
和 unbindService()
。不管使用哪种方式,创建Service时都需要重写相同的方法,只不过bind方式需要返回IBinder
对象用来与activity的通信,如果只是通过startService()
的话,就无需返回,系统默认返回null
。
如果开启服务既用了startService()
也用了bindService()
(即在接下来的例子中即点击了”开启service”按钮,又点击了”绑定activity”按钮),那么想要停止服务的话需要同时执行:stopService()
和 unbindService()
(即既要点击”解除绑定activity”按钮,也要点击”关闭service”按钮)不然将无法停止服务。
接下来的例子综合两种方式。
启动Service的方法和启动Activity很类似,都需要借助Intent来实现,并且需要重写onCreate等方法,看一下具体的例子:
4、Service的实例
新建项目,自定义类MyService继承 Service ,并重写方法:
public class MyService extends Service {
//自定义的内部类,实现绑定后要执行的操作,例如:后台下载等
private MyBinder myBinder = new MyBinder();
//重写方法,用于与activity之间的通信,默认返回null
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "摧毁");
}
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "创建");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService","启动了");
return super.onStartCommand(intent, flags, startId);
}
//实现内部类,后台要执行的具体的方法
public class MyBinder extends Binder{
public void download(){
Log.d("MyService","执行操作");
//具体的后台下载操作
}
}
}
现在可以按照开始位置处配置Androidmanifest.xml 了,完成之后,
接下来实现activity中的方法:
public class MainActivity extends AppCompatActivity {
private Button button1,button2,button3,button4;
//首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通过向下转型得到了MyBinder的实例,及MyService中内部类的实例
MyService.MyBinder myBinder = (MyService.MyBinder) service;
myBinder.download();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("MyService","解除绑定");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//获取组件
listeners();//监听组件
}
private void init(){
button1 = (Button)findViewById(R.id.start);
button2 = (Button)findViewById(R.id.stop);
button3 = (Button)findViewById(R.id.bind);
button4 = (Button)findViewById(R.id.unbind);
}
private void listeners(){
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过startService()开启服务
startService(new Intent(getBaseContext(), MyService.class));
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过stopService()停止服务
stopService(new Intent(getBaseContext(), MyService.class));
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过bindService()绑定服务
bindService(new Intent(getBaseContext(), MyService.class),connection,BIND_AUTO_CREATE);
}
});
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//通过bindService()解除服务
unbindService(connection);
}
});
}
}
xml布局文件中就四个按钮:
<Button
android:id="@+id/start"
android:text="开启service"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/stop"
android:text="关闭service"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/bind"
android:text="绑定activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/unbind"
android:text="解除绑定activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />