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
Intentintent=newIntent(MainActivity.this,MyService.class);
startService(intent);
stopService(intent);
/**
* 每次startService启动会调用此方法
* */
@Override
public intonStartCommand(Intent
intent, int
flags, intstartId)
{
return super.onStartCommand(intent,flags,startId);
}
3. 绑定和解绑Service
bindService(intent,
this, Context.BIND_AUTO_CREATE);
unbindService(this);
@Override
public voidonServiceConnected(ComponentName
name,IBinder service) {
System.out.println("Service
Connected");
}
@Override
public voidonServiceDisconnected(ComponentName
name) {
System.out.println("Service
Disconnected");
}
4. 应用关掉之后还可以运行,在Service中重写这个函数
@Override
public intonStartCommand(Intent
intent, int
flags, intstartId)
{
newThread(){
@Override
public voidrun()
{
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 intonStartCommand(Intent
intent, int
flags, intstartId)
{
//拿到数据
data=
intent.getStringExtra("data");
return super.onStartCommand(intent,
flags, startId);
}
//Binder传值和接口传值
1.在MyService.java中
public classMyServiceextendsService
{
private booleanrunning=false;
privateStringdata="这是默认信息";
publicMyService()
{
}
@Override
publicIBinderonBind(Intent
intent) {
return newBinder();
}
public classBinderextendsandroid.os.Binder{
public voidsetData(String
data){
MyService.this.data=
data;
}
publicMyServicegetService(){
returnMyService.this;
}
}
@Override
public intonStartCommand(Intent
intent, int
flags, intstartId)
{
//拿到数据
data=
intent.getStringExtra("data");
return super.onStartCommand(intent,flags,startId);
}
@Override
public voidonCreate()
{
super.onCreate();
running=true;
newThread(){
@Override
public voidrun()
{
super.run();
inti =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 voidonDestroy()
{
super.onDestroy();
running=false;
}
privateCallbackcallback=null;
public voidsetCallback(Callback
callback) {
this.callback=
callback;
}
publicCallbackgetCallback()
{
returncallback;
}
//声明接口
public static
interface Callback{
voidonDataChange(String
data);
}
}
2. MainActivity.java中
public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener,ServiceConnection
{
privateEditTextetData;
privateIntentintent;
privateMyService.Binderbinder=null;
privateTextViewtvOut;
@Override
protected voidonCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etData=
(EditText) findViewById(R.id.etData);
intent=newIntent(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 voidonClick(View
v) {
switch(v.getId()){
caseR.id.btnStartService:
//传给Service数据
intent.putExtra("data",etData.getText().toString());
startService(intent);
break;
caseR.id.btnStopService:
stopService(intent);
break;
caseR.id.btnBindService:
bindService(intent,this,Context.BIND_AUTO_CREATE);
break;
caseR.id.btnUnbindService:
unbindService(this);
break;
caseR.id.btnSyncData:
if(binder!=null){
binder.setData(etData.getText().toString());
}
break;
}
}
@Override
public voidonServiceConnected(ComponentName
name,IBinder service) {
binder=
(MyService.Binder) service;
//实现接口方法
binder.getService().setCallback(newMyService.Callback()
{
@Override
public voidonDataChange(String
data) {
Message msg =newMessage();
Bundle b =newBundle();
b.putString("data",data);
msg.setData(b);
//句柄发送消息
handler.sendMessage(msg);
}
});
}
@Override
public voidonServiceDisconnected(ComponentName
name) {
}
//主线程更新UI
privateHandlerhandler=newHandler(){
@Override
public voidhandleMessage(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网络连接的管理