您的位置:首页 > 移动开发 > Android开发

Android Service基础详讲

2016-04-26 17:46 399 查看
欢迎转载,转载请标明出处,谢谢^_^


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

将会默认被系统启动,不设置默认此项为 false

android: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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: