Service
概念
service是一种Android四大组件之一,可以在后台长时间运行
不需要有与用户交互的页面, 只需要在后台运行着做一些事物的处理, 这是后就需要service了.
即使用户跳转至另外一个应用后,Service仍旧在后台运行.
任意应用组件都可以绑定服务,甚至可以完成进程间通讯的任务.
比如说 socket http的网络通信 与服务器保持的推送的链接, 需要下载时, 播放音乐时, 文件 I/O.
Service的
启动方式:
Service可以通过两种方式来调用,
(1). start一旦某个组件start一个Service后,Service开始独立运行,不在与原来的组件产生任何关系.
(2). bind 某个组件bind一个Service后,Service为组件提供一个接口,类似于客户端,会进行互相的交互.
1. 创建Service
new -> Service -> Service
2. 启动和关闭Service
Intent
intent
=
new
Intent(MainActivity.
this,
MyService.
class
)
;
startService
(
intent
)
;
stopService
(
intent
)
;
/**
* 每次startService启动会调用此方法
* */
@Override
public int
onStartCommand
(Intent intent
, int
flags
, int
startId) {
return super
.onStartCommand(intent
,
flags
,
startId)
;
}
3. 绑定和解绑Service
bindService(
intent
, this,
Context.
BIND_AUTO_CREATE
)
;
unbindService
(
this
)
;
@Override
public void
onServiceConnected
(ComponentName name
,
IBinder service) {
System.
out
.println(
"Service Connected"
)
;
}
@Override
public void
onServiceDisconnected
(ComponentName name) {
System.
out
.println(
"Service Disconnected"
)
;
}
4. 应用关掉之后还可以运行,在Service中重写这个函数
@Override
public int
onStartCommand
(Intent intent
, int
flags
, int
startId) {
new
Thread(){
@Override
public void
run
() {
super
.run()
;
while
(
true
) {
System.
out
.println(
"服务正在运行..."
)
;
try
{
sleep
(
1000
)
;
}
catch
(InterruptedException e) {
e.printStackTrace()
;
}
}
}
}.start()
;
return super
.onStartCommand(intent
,
flags
,
startId)
;
}
Service生命周期
onCreate
() //创建
onDestroy
() //销毁
Service通信
1. Activity传递给Service数据
//方式一: intent传值
//传给Service数据
intent
.putExtra(
"data"
,
etData
.getText().toString())
;
startService(
intent
)
;
//service接收(拿到)传过来的数据
@Override
public int
onStartCommand
(Intent intent
, int
flags
, int
startId) {
//拿到数据
data
= intent.getStringExtra(
"data"
)
;
return super
.onStartCommand(intent, flags, startId);
}
//Binder传值和接口传值
1.在MyService.java中
public class
MyService
extends
Service {
private boolean
running
=
false;
private
String
data
=
"这是默认信息"
;
public
MyService
() {
}
@Override
public
IBinder
onBind
(Intent intent) {
return new
Binder()
;
}
public class
Binder
extends
android.os.Binder{
public void
setData
(String data){
MyService.
this
.
data
= data
;
}
public
MyService
getService
(){
return
MyService.
this;
}
}
@Override
public int
onStartCommand
(Intent intent
, int
flags
, int
startId) {
//拿到数据
data
= intent.getStringExtra(
"data"
)
;
return super
.onStartCommand(intent
,
flags
,
startId)
;
}
@Override
public void
onCreate
() {
super
.onCreate()
;
running
=
true;
new
Thread(){
@Override
public void
run
() {
super
.run()
;
int
i =
0
;
while
(
running
){
i++
;
String str =
data
+
" : "
+i
;
System.
out
.println(str)
;
if
(
callback
!=
null
){
callback
.onDataChange(str)
;
}
try
{
sleep
(
1000
)
;
}
catch
(InterruptedException e) {
e.printStackTrace()
;
}
}
}
}.start()
;
}
@Override
public void
onDestroy
() {
super
.onDestroy()
;
running
=
false;
}
private
Callback
callback
=
null;
public void
setCallback
(Callback callback) {
this
.
callback
= callback
;
}
public
Callback
getCallback
() {
return
callback
;
}
//声明接口
public static interface
Callback{
void
onDataChange
(String data)
;
}
}
2. MainActivity.java中
public class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener
,
ServiceConnection {
private
EditText
etData
;
private
Intent
intent
;
private
MyService.Binder
binder
=
null;
private
TextView
tvOut
;
@Override
protected void
onCreate
(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState)
;
setContentView(R.layout.
activity_main
)
;
etData
= (EditText) findViewById(R.id.
etData
)
;
intent
=
new
Intent(
this,
MyService.
class
)
;
tvOut
= (TextView) findViewById(R.id.
tvOut
)
;
findViewById(R.id.
btnStartService
).setOnClickListener(
this
)
;
findViewById(R.id.
btnStopService
).setOnClickListener(
this
)
;
findViewById(R.id.
btnBindService
).setOnClickListener(
this
)
;
findViewById(R.id.
btnUnbindService
).setOnClickListener(
this
)
;
findViewById(R.id.
btnSyncData
).setOnClickListener(
this
)
;
}
@Override
public void
onClick
(View v) {
switch
(v.getId()){
case
R.id.
btnStartService
:
//传给Service数据
intent
.putExtra(
"data"
,
etData
.getText().toString())
;
startService(
intent
)
;
break;
case
R.id.
btnStopService
:
stopService(
intent
)
;
break;
case
R.id.
btnBindService
:
bindService(
intent
,this,
Context.
BIND_AUTO_CREATE
)
;
break;
case
R.id.
btnUnbindService
:
unbindService(
this
)
;
break;
case
R.id.
btnSyncData
:
if
(
binder
!=
null
){
binder
.setData(
etData
.getText().toString())
;
}
break;
}
}
@Override
public void
onServiceConnected
(ComponentName name
,
IBinder service) {
binder
= (MyService.Binder) service
;
//实现接口方法
binder
.getService().setCallback(
new
MyService.Callback() {
@Override
public void
onDataChange
(String data) {
Message msg =
new
Message()
;
Bundle b =
new
Bundle()
;
b.putString(
"data"
,
data)
;
msg.setData(b)
;
//句柄发送消息
handler
.sendMessage(msg)
;
}
})
;
}
@Override
public void
onServiceDisconnected
(ComponentName name) {
}
//主线程更新UI
private
Handler
handler
=
new
Handler(){
@Override
public void
handleMessage
(Message msg) {
super
.handleMessage(msg)
;
String text = msg.getData().getString(
"data"
)
;
tvOut
.setText(text)
;
}
}
;
}
系统服务,
由于是Android原生代码,可以通过Android代码来对服务进行交互
Android将BInder封装成普通的Manager类,代码调用时无法察觉是使用了Service
这些服务通过Context.getSystemService(String name)来获得
name决定了获得不同的Manager类, 不同的Manager类有各自的方法来调用系统功能或是访问系统状态
POWER_SEREVICE ("power") PowerManager 电源管理
NOTIFICATION_SERVICE ("notification) NotificationManager通知的管理
LOCATION_SERVICE ("location") LocationManager 定位的控制
CONNECTIVITY_SERVICE ("connection") ConnectifyManager网络连接的管理